22
© Acroquest Technology Co., Ltd. All rights reserved. Elasticsearchを使うときの注意点 Acroquest Technology株式会社 2016/01/28 藤井 崇介

Elasticsearchを使うときの注意点 公開用スライド

  • Upload
    -

  • View
    9.990

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

Elasticsearchを使うときの注意点

Acroquest Technology株式会社

2016/01/28

藤井 崇介

Page 2: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 2

はじめに 社内でElasticsearchを使う機会が増えています。 一方で、こんな問題に遭うこともあります。

1. しばらく使っていると、OOMEが発生して落ちてしまう。

2. Elasticsearchが落ちていたせいで、データの復旧が必要になったが、復旧する方法がない。

3. 想像していたほど性能が出ない。

4. どういうスペックのマシンを用意すればいいかわからない?

Elasticsearchの性能を引き出し、安定稼働させるためには

適切なチューニングを行う必要があります。

このスライドでは、仕事で適用して体験したことや

調査したことを共有したいと思います。

はじめに

Page 3: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 3

構成

はじめに

Page 4: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

Elasticsearchを使うときの注意点

4

Page 5: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

Elasticsearchを使うときの注意点

1. 2.X系を使うと安定度が増す

2. ヒープメモリを正しく設定する

3. シャード数を適切に設定する

4. データの復旧方法を確保する

5. stringをnot analyzedにできないか検討する

6. bulkAPIを使うときには設定を変える

5

Page 6: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 6

1. 2.X系を使うと安定度が増す

1.X系では、ヒープメモリを大量に消費する。 導入当初は、2か月に1回ElasticsearchがOOMEにより、停止する問題が発生していた。

• 全文検索を効率的に行うため、Luceneが生成したインデックスから、検索用のインデックスを内部で生成している。

• 1.x系ではインデックス情報をJavaのヒープメモリに保持する方法が使われていたが、2.x系ではファイルを利用する方法(Doc Values)がデフォルトになった。

Doc Valuesの詳細については以下を参照。 https://www.elastic.co/guide/en/elasticsearch/guide/current/doc-values.html

Page 7: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 7

2. ヒープメモリを正しく設定する

Elasticsearchの性能を引き出すためには、メモリ設定のチューニングは不可欠である。

ヒープメモリを設定するときの注意点 1. 物理メモリの半分以上は指定しない。

– 物理メモリをファイルキャッシュとしてLuceneが利用するため。

2. 30GB以上指定しない。 – Javaのメモリ使用量が32GBを越えるとポインタのサイズが

2倍になり、逆にメモリ消費量が増えるため (Compressed Oopsのため)

3. CMS GCを利用する。G1GCを利用しない。 – G1GCを使うとLuceneの一部で問題が出るらしい(?) 詳細は未確認。

Page 8: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

シャードとは

シャードはElasticsearchのインデックスを分解したもの

ノード1(Elasticsearch)

8

3.シャード数を適切に設定する

インデックス

シャード

0P

シャード

1P

シャード

2P

実ファイルとして保存

Page 9: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

シャードとは

クラスタリングするときに、シャードが各ノードに配置される

ノード1

9

3.シャード数を適切に設定する

インデックス

シャード

0P

シャード

2R

ノード2

ノード3

インデックス

シャード

1P

シャード

0R

インデックス

シャード

2P

シャード

1R

Pはプライマリシャード、Rはレプリカシャードを表す

Page 10: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

設定方法 インデックス作成時のみ設定可能

• インデックス作成時に設定する方法

• インデックステンプレートを使う。

10

3.シャード数を適切に設定する

curl -XPUT localhost:9200/index-1 '{

"settings" : {

"number_of_shards" : 1

}

}'

curl -XPUT localhost:9200/template-1 ' {

"template": “index-*",

"settings": {

"number_of_shards": 1

},

order : 1

}

Page 11: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

シャードが多いとどうなるか? ディスクアクセスが増えるので、IO待ちが発生する。

Kibanaなど、複数インデックスを検索する場合には、

影響が顕著に出る。

※デフォルト値は5。

ただし、1つのインデックスに大量のデータを 登録している場合には、性能が劣化する場合もあるので、 注意すること。

11

3.シャード数を適切に設定する

Page 12: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

シャード数はいくつにするのがよいか?

正解はない。

1シャード、1G程度を目安にし、ベンチマークし、決定する。

12

3.シャード数を適切に設定する

Page 13: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 13

4.データの復旧方法を確保する

データ復旧の必要性 データの欠損を考慮する必要があるため。

原因 1. ElasticsearchがOOMEで落ちていた。

(1.X系ではよく落ちました)

2. 1ノードで運用していると、ネットワーク瞬断など、仕組みとして拾えない場合がある。

3. クラスタを組み、レプリカを設定することで、救出できる可能性もあがるが、高負荷時にノード間でデータがずれる場合がある。 ※3.は設定で回避可能であるが、性能との兼ね合いがある。

Page 14: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 14

4.データの復旧方法を確保する

データ復旧方法とは? 1. ログを残しておき、リアルタイム投入とは別のタイミング

で定期投入する。 →ただしログが重複して投入されないよう、ドキュメントのIDをログ内容から算出する必要がある。

2. スナップショットを定期的に取る。

Page 15: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 15

5. stringをnot analyzedにできないか検討する

Elasticsearchでは、ドキュメントのインデックス時に、 string型のフィールドに対してanalyzer処理が行われる。

ログ解析など、テキスト検索として利用しない場合には、not analyzedに指定する方が、性能もよくなるし、適切な結果が得られる。

Page 16: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 16

analyzer処理のデメリット 1. キーワード検索、suggestionを行わない場合には、

analyzer処理のコストが無駄に掛かる。

2. Kibanaの集計結果が期待通りにならないことがある。

5. stringをnot analyzedにできないか検討する

Page 17: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 17

6. bulkAPIを使うときには設定を変える

bulkAPIで一度に大量のデータを投入すると、Elasticsearchが処理しきれない場合がある。

原因 1. 内部キューのスレッド数の上限に達する。

2. 内部で行われるインデックスの更新処理が重い。

Page 18: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 18

6. bulkAPIを使うときには設定を変える

1. 内部キューのスレッド数の上限に達する Elasticsearchでは、内部に処理を行うキューとThreadPoolがあるが、高負荷のときにキューが溢れることがある。

キューのデフォルト値は50、あふれるとデータが破棄される。

※ThreadPoolも設定可能だが、非推奨。

curl -XGET localhost:9200/_nodes/stats

...

“bulk”:{

“threads”: 4,

“queue”: 15, // 現在処理待ちのキューに溜まっているリクエスト数

"active": 4,

"rejected": 320, // これまでにリジェクトされたリクエスト数

"largest": 5,

"completed": 203312

}, ...

Page 19: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 19

6. bulkAPIを使うときには設定を変える

1. 内部キューのスレッド数の上限に達する キューが溢れた場合には、

429エラー(Too Many Request)が返り、

送信したドキュメントは破棄されてしまう。

設定方法

curl -XPUT localhost:9200/_cluster/settings

{

"transient": {

"threadpool.bulk.queue_size": 10000

}

}

Page 20: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 20

6. bulkAPIを使うときには設定を変える

2. 内部で行われるインデックスの更新処理が重い Elasticsearchへのドキュメント登録はバッファに蓄積されるのみであり、 定期的にインデックスへの反映処理が行われている。 更新処理はデフォルトで1秒に1回だが、 時間の掛かるbulkAPI実行時にはこの頻度で行う必要がない。 そのためbulkAPI実行時には、 更新間隔を-1(バッファの上限になるまで反映処理を行わない) に設定し、 実行完了後に元に戻すとよい。

curl -XPOST 'localhost:9200/index-d/_settings?index.refresh_interval=-1s'

Page 21: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved. 21

現在、取り組んでいるもの

現在、取り組んでいるもの 1. 一定期間を過ぎたインデックスをクローズする、削除す

る。 – クローズされたインデックスは検索対象外となるが、オープンすれば再び検索対象となる。

– 削除されたインデックスはディスクから削除される。

2. エイリアスを利用する。

3. _all, _sourceの廃止を検討する。 – allは全項目に対する串刺し検索で用いる。ログ収集においてはあまり使わない。

– _sourceはJSON化する前のログ。ハイライトや部分更新で用いる。ログ収集にはあまり使わない。

Page 22: Elasticsearchを使うときの注意点 公開用スライド

© Acroquest Technology Co., Ltd. All rights reserved.

適切なチューニングを行い、 Elasticsearchを活用しましょう。

22