Upload
-
View
9.990
Download
0
Embed Size (px)
Citation preview
© Acroquest Technology Co., Ltd. All rights reserved.
Elasticsearchを使うときの注意点
Acroquest Technology株式会社
2016/01/28
藤井 崇介
© Acroquest Technology Co., Ltd. All rights reserved. 2
はじめに 社内でElasticsearchを使う機会が増えています。 一方で、こんな問題に遭うこともあります。
1. しばらく使っていると、OOMEが発生して落ちてしまう。
2. Elasticsearchが落ちていたせいで、データの復旧が必要になったが、復旧する方法がない。
3. 想像していたほど性能が出ない。
4. どういうスペックのマシンを用意すればいいかわからない?
Elasticsearchの性能を引き出し、安定稼働させるためには
適切なチューニングを行う必要があります。
このスライドでは、仕事で適用して体験したことや
調査したことを共有したいと思います。
はじめに
© Acroquest Technology Co., Ltd. All rights reserved. 3
構成
はじめに
© Acroquest Technology Co., Ltd. All rights reserved.
Elasticsearchを使うときの注意点
4
© Acroquest Technology Co., Ltd. All rights reserved.
Elasticsearchを使うときの注意点
1. 2.X系を使うと安定度が増す
2. ヒープメモリを正しく設定する
3. シャード数を適切に設定する
4. データの復旧方法を確保する
5. stringをnot analyzedにできないか検討する
6. bulkAPIを使うときには設定を変える
5
© 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
© 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の一部で問題が出るらしい(?) 詳細は未確認。
© Acroquest Technology Co., Ltd. All rights reserved.
シャードとは
シャードはElasticsearchのインデックスを分解したもの
ノード1(Elasticsearch)
8
3.シャード数を適切に設定する
インデックス
シャード
0P
シャード
1P
シャード
2P
実ファイルとして保存
© Acroquest Technology Co., Ltd. All rights reserved.
シャードとは
クラスタリングするときに、シャードが各ノードに配置される
ノード1
9
3.シャード数を適切に設定する
インデックス
シャード
0P
シャード
2R
ノード2
ノード3
インデックス
シャード
1P
シャード
0R
インデックス
シャード
2P
シャード
1R
Pはプライマリシャード、Rはレプリカシャードを表す
© 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
}
© Acroquest Technology Co., Ltd. All rights reserved.
シャードが多いとどうなるか? ディスクアクセスが増えるので、IO待ちが発生する。
Kibanaなど、複数インデックスを検索する場合には、
影響が顕著に出る。
※デフォルト値は5。
ただし、1つのインデックスに大量のデータを 登録している場合には、性能が劣化する場合もあるので、 注意すること。
11
3.シャード数を適切に設定する
© Acroquest Technology Co., Ltd. All rights reserved.
シャード数はいくつにするのがよいか?
正解はない。
1シャード、1G程度を目安にし、ベンチマークし、決定する。
12
3.シャード数を適切に設定する
© Acroquest Technology Co., Ltd. All rights reserved. 13
4.データの復旧方法を確保する
データ復旧の必要性 データの欠損を考慮する必要があるため。
原因 1. ElasticsearchがOOMEで落ちていた。
(1.X系ではよく落ちました)
2. 1ノードで運用していると、ネットワーク瞬断など、仕組みとして拾えない場合がある。
3. クラスタを組み、レプリカを設定することで、救出できる可能性もあがるが、高負荷時にノード間でデータがずれる場合がある。 ※3.は設定で回避可能であるが、性能との兼ね合いがある。
© Acroquest Technology Co., Ltd. All rights reserved. 14
4.データの復旧方法を確保する
データ復旧方法とは? 1. ログを残しておき、リアルタイム投入とは別のタイミング
で定期投入する。 →ただしログが重複して投入されないよう、ドキュメントのIDをログ内容から算出する必要がある。
2. スナップショットを定期的に取る。
© Acroquest Technology Co., Ltd. All rights reserved. 15
5. stringをnot analyzedにできないか検討する
Elasticsearchでは、ドキュメントのインデックス時に、 string型のフィールドに対してanalyzer処理が行われる。
ログ解析など、テキスト検索として利用しない場合には、not analyzedに指定する方が、性能もよくなるし、適切な結果が得られる。
© Acroquest Technology Co., Ltd. All rights reserved. 16
analyzer処理のデメリット 1. キーワード検索、suggestionを行わない場合には、
analyzer処理のコストが無駄に掛かる。
2. Kibanaの集計結果が期待通りにならないことがある。
5. stringをnot analyzedにできないか検討する
© Acroquest Technology Co., Ltd. All rights reserved. 17
6. bulkAPIを使うときには設定を変える
bulkAPIで一度に大量のデータを投入すると、Elasticsearchが処理しきれない場合がある。
原因 1. 内部キューのスレッド数の上限に達する。
2. 内部で行われるインデックスの更新処理が重い。
© 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
}, ...
© 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
}
}
© 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'
© Acroquest Technology Co., Ltd. All rights reserved. 21
現在、取り組んでいるもの
現在、取り組んでいるもの 1. 一定期間を過ぎたインデックスをクローズする、削除す
る。 – クローズされたインデックスは検索対象外となるが、オープンすれば再び検索対象となる。
– 削除されたインデックスはディスクから削除される。
2. エイリアスを利用する。
3. _all, _sourceの廃止を検討する。 – allは全項目に対する串刺し検索で用いる。ログ収集においてはあまり使わない。
– _sourceはJSON化する前のログ。ハイライトや部分更新で用いる。ログ収集にはあまり使わない。
© Acroquest Technology Co., Ltd. All rights reserved.
適切なチューニングを行い、 Elasticsearchを活用しましょう。
22