概要
CuratorはElastic社が提供するPython実装の運用支援ツールです。
elasticsearchを使用したシステムを長期間、安定して運用するためには、indexのメンテナンスが欠かせません。
なぜなら、elasticsearchは検索対象のdocumentをメモリに展開するからです。
なので、長期間そのままだと、メモリを食いまくって、メモリダンプを吐いて死んでしまったりします。
そこで、定期的に古いログを削除するなどのメンテナンスが必要です。
では、どうやってメンテナンスするか
もちろん、elasticsearchはREST APIを持っているので、自分でメンテ用のスクリプトを書いて、cronとかで定期実装させてもよいです。
でも、面倒ですね。
そこでcuratorですよ。curatorを使えば、かなり簡単にindexのメンテができます。
今回は、もちろんリアルタイム麺活監視システムを安定稼働させるためのindexメンテナンスです。
あ、これは筆者が岩手県宮古市で食べたラーメンです。
設定などは、こちらのサイトを参考にさせてもらいました。
環境準備
それでは、環境構築をしていきましょう。
インストール
pythonで実装されているので、以下のコマンドで一発で導入できます。
$ pip install elasticsearch-curator
便利な世の中になったものだな・・・・
定義ファイルの修正
curatorでは、以下の2つのファイルを修正する必要があります。
設定ファイル名 | 説明 |
---|---|
Configuration File | curator自身の動きについて定義する |
Action File | indexなどに対するメンテナンスの内容を定義する |
Configuration File
Configuration Fileでは、curator自身の動きについて定義します。
実行時に、特に指定がなければ、デフォルトの定義ファイルを読みに行きます。
なお、デフォルトの定義ファイルのパスは、以下となります。
~/.curator/curator.yml
任意のファイルを指定する場合は、実行時の引数にオプション【–config】を付けて、パスを渡せばよいです。
設定できる内容やその方法は、全部、公式に書いてあるので、適当に設定してください。
Action File
Action fileには、実際にメンテナンスする内容を定義します。
こちらは省略できず、必ず指定が必要です。
Action fileも、設定できる内容やその方法は、全部、公式に書いてあるのですが。
こちらは、ちゃんと考えて定義してやらないといけない内容ですね。
なので、リアルタイム麺活監視システムでの運用内容を晒してみます。
おおまかに、何をしているかは以下の通りです。
- 7日を経過したindexはcloseする
- 14日を経過したindexはdeleteする
上記の内容が実現させるように、logstashで流し込んでいているtwitterのdocumentを、index名に従って定義してあげます。
### action_file.yml
# Remember, leave a key empty if there is no value. None will be a string,
# # not a Python "NoneType"
# #
# # Also remember that all examples have 'disable_action' set to True. If you
# # want to use this action as a template, be sure to set this to False after
# # copying it.
#
actions:
1:
action: close
description: >-
Close indices older than 14 days (based on index name), for logstash-prefixed indices.
options:
delete_aliases: False
timeout_override:
continue_if_exception: False
disable_action: False
continue_if_exception: True
ignore_empty_list: True
filters:
- filtertype: pattern
kind: prefix
value: twitter-
exclude:
- filtertype: age
source: name
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 14
exclude:
2:
action: delete_indices
description: >-
Delete indices older than 20 days (based on index name), for logstash-
prefixed indices. Ignore the error if the filter does not result in an
actionable list of indices (ignore_empty_list) and exit cleanly.
options:
ignore_empty_list: True
timeout_override:
continue_if_exception: False
disable_action: False
continue_if_exception: True
ignore_empty_list: True
filters:
- filtertype: pattern
kind: prefix
value: twitter-
exclude:
- filtertype: age
source: name
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 20
exclude:
それぞれの設定内容は、公式に書いてあるのでググレカス。
実行してみる
それでは、定義ができたら実際に実行させてみましょう。
とりゃー
$ curator --config ./config.yml ./action_file.yml
上記では、config fileもデフォルトを使用したり編集したりせず、新たに用意して、それを適用させています。
実行結果の確認
ログを確認してみることにしましょう。
config.ymlにログファイルのパスを定義できます。
その出力されたログの一部を、以下にお見せします。
2017-03-20 03:20:09,195 INFO Preparing Action ID: 1, "close"
2017-03-20 03:20:09,227 INFO Trying Action ID: 1, "close": Close indices older than 14 days (based on index name), for logstash-prefixed indices.
2017-03-20 03:20:10,863 INFO Closing selected indices: ['twitter-2017.03.03', 'twitter-2017.03.02', 'twitter-2017.03.04', 'twitter-2017.03.05']
2017-03-20 03:20:11,401 INFO Action ID: 1, "close" completed.
2017-03-20 03:20:11,401 INFO Preparing Action ID: 2, "delete"
2017-03-20 03:20:11,413 INFO Trying Action ID: 2, "delete": Delete indices older than 20 days (based on index name), for logstash- prefixed indices. Ignore the error if the filter does not result in an actionable list of indices (ignore_empty_list) and exit cleanly.
2017-03-20 03:20:11,930 INFO Deleting selected indices: ['twitter-2017.02.24', 'twitter-2017.02.26', 'twitter-2017.02.27', 'twitter-2017.02.25']
2017-03-20 03:20:11,930 INFO ---deleting index twitter-2017.02.24
2017-03-20 03:20:11,930 INFO ---deleting index twitter-2017.02.26
2017-03-20 03:20:11,931 INFO ---deleting index twitter-2017.02.27
2017-03-20 03:20:11,931 INFO ---deleting index twitter-2017.02.25
2017-03-20 03:20:12,671 INFO Action ID: 2, "delete" completed.
2017-03-20 03:20:12,671 INFO Job completed.
ログの内容から、以下のことが実行されたことがわかります。
- 2017/3/2~2017/3/5までのindexが、closeされた
- 2017/2/25~2017/2/27までのindexが、deleteされた
あとは定期実行させるだけ
ここまでしたら、cronに登録して自動実行させましょう。
$ crontab -e
20 3 * * 1,4 (/install/path/curator --config /file/path/config.yml /file/path/action_file.yml)
ここでは、毎週月曜日と木曜日の、AM3時20分に実行するようにしています。
twitterのログ量を見てみると、このあたりの時間のtweet数が最も少なくなるので、この時間にしました。
実行結果を確認してみる
実際に、curatorによってindexがメンテナンスされることで、
実際に麺活監視システムの性能メトリックが、
どのように変化するのかを確認してみましょう。
これは、運用開始してしばらく後に、ElasticSearchの稼働状況を監視したものです。
このように、6/1(木曜日)のAM3時半ごろ、確かに使用していたJava VMのHeapメモリが、ガクっと減っていますね。
これは、メモリ上に展開されているindexのcloseが行われたからですね。
こういうメンテナンスを行わないと、そのうち、OutOfMemoryを吐いて、プロセスが死んでしまうことになります。
こうした運用設計を行うことが重要ですね。
最後に
これをやっておかないと、ElasticSearchの長期運用はちょっと無理ですよね。
こうしたシステムメンテナンスを怠ることなく、サービスの安定稼働ができるようにしておきましょう。
ついでに
リアルタイム麺活監視システムは、一般公開していません。
というのも、ポケットマネーでサーバを用意している関係で、潤沢なスペックのVMを用意できないのです。
我こそはというスポンサーの方がいたら、それを原資にサーバ増強させて、サービス提供に挑戦してみようと思います。
それでは。