※少しストックされているので更新
1.3.5以降のバージョンでは、bloom filterはデフォルト無効化されているのでこの内容は、それ以前のバージョンでElasticsearchを運用されている方向けです。
Elasticsearchをログ格納用に運用していて、突然動作が重くなりレスポンスが返ってこなくなった時の対応メモ。
もちろん、これだけでは改善しない事もあるので、インデックスのdeleteやcloseも必要だけど、自分の運用している環境ではかなり効果があった。
どうやら、デフォルトでbloom filterというリソースがインデックス単位で割り当てられているようで、fluentdから日単位でインデックス作ったりするとインデックスの数だけこのbloom filterが有効になっているのでメモリを逼迫しているらしい。
【解説は下記】
http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/index-modules-codec.html
ということで、elasticsearch-curatorを使い、このbloom filterも無効化しておくメモ。
手順
elasticsearch-curatorについては、下記に書いたので参考までに。
http://qiita.com/nagais/items/5580f77a8af6dd5e1856
テストを月単位のインデックスで実施したが、下記のオプションで単位は変えられる。
#1ヶ月前までのbloom filterを保持し、他は無効化する
$ curator bloom --prefix syslog- --older-than 1 --time-unit months
elasticsearch_headで確認すると、
下記のようにbloomがfalseになっている事で確認出来る。
オプション
オプション名 | 意味 |
---|---|
--timestring | Pythonのstrftime形式でフォーマットを指定する サンプル --timestring %Y.w%W |
--prefix | インデックスのプレフィックスを指定 サンプル --prefix aaa- |
--time-unit | タイムスパンを下記のいずれかで指定 [hours,days,weeks,months] |
--older-than | 対象とする数を指定する 1と指定するとデフォルトはdaysなので1日分は保持し、2日以前のものを対象とする time-unitと組み合わせで判断される |
--exclude-pattern | 特定のインデックスを処理対象から外したい場合に指定 |
おまけ
fluentdで週単位のインデックスを運用していて少しはまったのでメモ
下記のような感じでfluentd経由でインデックスを作っていると、[time-unit weeks]では処理対象にならずに、[--timestring]を使って整形してあげないとインデックスを削除出来ない。。
週単位インデックス名:aaa-2015.w01
logstash_dateformat %Y.w%V
curatorで削除する場合は、下記のように[--timestring %Y.w%W]で形式を指定すると対象になる。
$ curator bloom --prefix aaa- --older-than 1 --time-unit weeks --timestring %Y.w%W
正確には測ってないけど、過去分のbloom filter無効化したらだいぶメモリが空いた。
これも、cronのタスクに組み込み夜間実行する。