CuratorによるElasticsearchのメンテナンス
はじめに
ボルダリングやりたい藤本です。
Elasticsearch(Elasticsearchに限らずデータストア)を運用するにあたり可用性確保、バックアップ/リストア、リソース管理、保守体制など設計することが多くあります。今回はElasticsearchの運用を簡易化してくれるCuratorというツールをご紹介します。
Elastic社の@johtaniさんが公式ブログの翻訳記事をエントリしていますので合わせてご参照ください。
- Curator: 時系列インデックスの管理(日本語訳)
Curator
CuratorはElastic社が提供するPython実装の運用支援ツールです。2016/06/07現在は3.5系が最新バージョンですが、APIがElasticsearch 0.9/1.x系用に実装されています。現在α版の4.0系からElasticsearch 2.0以降をサポートしているようです。
Curator 3.5系は以下のような機能があります。
https://www.elastic.co/guide/en/elasticsearch/client/curator/current/_features.html
- インデックス操作
- 削除
- Close
- CloseしたインデックスのOpen
- Optimize(セグメントのマージ)
- 参照
- レプリカシャード数の変更
- Aliasの作成/削除
- Seal?(Elasticsearch >= v1.6)
- スナップショット操作
- 取得
- 削除
- 参照
- シャードルーティングの設定
- Bloomフィルターキャッシュの無効化(Elasticsearch < v1.4)
CLIが用意されているため、Cronなどで定期実行することでメンテンスを自動化することができます。
やってみた
インストール
pipでも、apt/yumなどパッケージリポジトリでもインストールが可能です。Windows用にもmsi形式で配布されています。今回はpipでインストールしました。コマンド一発です。
# pip install elasticsearch-curator Collecting elasticsearch-curator Downloading elasticsearch_curator-3.5.1-py2.py3-none-any.whl (47kB) 100% |████████████████████████████████| 51kB 151kB/s Collecting elasticsearch<3.0.0,>=2.3.0 (from elasticsearch-curator) Downloading elasticsearch-2.3.0-py2.py3-none-any.whl (51kB) 100% |████████████████████████████████| 61kB 55kB/s Collecting click>=3.3 (from elasticsearch-curator) Downloading click-6.6.tar.gz (283kB) 100% |████████████████████████████████| 286kB 31kB/s Collecting urllib3<2.0,>=1.8 (from elasticsearch<3.0.0,>=2.3.0->elasticsearch-curator) Downloading urllib3-1.15.1-py2.py3-none-any.whl (92kB) 100% |████████████████████████████████| 102kB 41kB/s Building wheels for collected packages: click Running setup.py bdist_wheel for click ... done Stored in directory: /Users/fujimoto.shinji/Library/Caches/pip/wheels/b0/6d/8c/cf5ca1146e48bc7914748bfb1dbf3a40a440b8b4f4f0d952dd Successfully built click Installing collected packages: urllib3, elasticsearch, click, elasticsearch-curator Successfully installed click-6.6 elasticsearch-2.3.0 elasticsearch-curator-3.5.1 urllib3-1.15.1
指定期間を過ぎたインデックスをClose、削除する
Curatorを利用する上で一番多くあるユースケースだと思います。ログ収集や行動分析などでElasticsearchに時系列データをストアするケースは多くあります。時系列データを延々とためるのもいいですが、ユースケースによっては参照することがないインデックスもあります。データが肥大化することはパフォーマンス低下、リソース逼迫に繋がります。利用しないインデックスへのアプローチとしてElasticsearchでは2段階のリソース開放方法があります。一つはインデックスのCloseです。インデックスをクローズすることでメモリを開放することができ、メモリリソースの逼迫を改善します。CloseしたインデックスはOpenすることで再度利用可能です。もう一つはインデックスの削除です。インデックスを削除することでディスクリソースの逼迫も改善します。ただし、クローズと違ってバックアップからリストアなどしないと再度データにアクセスすることができません。
それではCuratorを利用して、指定した日付より古いインデックスをClose、削除します。
直近のデータセットがなかったので2015年9月20日〜2015年10月20日のhttpdのアクセスログを保管したインデックスを用意しました。今日は2015年10月20日だと思ってご覧ください。
# date Tue Oct 20 17:33:00 UTC 2015 # curl localhost:9200/_cat/indices |sort yellow open logstash-2015.09.20 5 1 2796 0 3.6mb 3.6mb yellow open logstash-2015.09.21 5 1 7955 0 8.6mb 8.6mb yellow open logstash-2015.09.22 5 1 9866 0 9.7mb 9.7mb yellow open logstash-2015.09.23 5 1 9084 0 8.7mb 8.7mb yellow open logstash-2015.09.24 5 1 10475 0 9.6mb 9.6mb yellow open logstash-2015.09.25 5 1 11263 0 10mb 10mb yellow open logstash-2015.09.26 5 1 6395 0 6mb 6mb yellow open logstash-2015.09.27 5 1 7472 0 6.6mb 6.6mb yellow open logstash-2015.09.28 5 1 10161 0 9.9mb 9.9mb yellow open logstash-2015.09.29 5 1 10294 0 10mb 10mb yellow open logstash-2015.09.30 5 1 10706 0 9.8mb 9.8mb yellow open logstash-2015.10.01 5 1 13750 0 11.9mb 11.9mb yellow open logstash-2015.10.02 5 1 11559 0 10.6mb 10.6mb yellow open logstash-2015.10.03 5 1 9005 0 8.2mb 8.2mb yellow open logstash-2015.10.04 5 1 8095 0 6.9mb 6.9mb yellow open logstash-2015.10.05 5 1 9826 0 9mb 9mb yellow open logstash-2015.10.06 5 1 10795 0 9.7mb 9.7mb yellow open logstash-2015.10.07 5 1 10835 0 9.8mb 9.8mb yellow open logstash-2015.10.08 5 1 10805 0 9.9mb 9.9mb yellow open logstash-2015.10.09 5 1 13384 0 11.6mb 11.6mb yellow open logstash-2015.10.10 5 1 9155 0 7.7mb 7.7mb yellow open logstash-2015.10.11 5 1 8472 0 7.4mb 7.4mb yellow open logstash-2015.10.12 5 1 10284 0 9.7mb 9.7mb yellow open logstash-2015.10.13 5 1 10221 0 9.4mb 9.4mb yellow open logstash-2015.10.14 5 1 11957 0 11mb 11mb yellow open logstash-2015.10.15 5 1 18480 0 12.3mb 12.3mb yellow open logstash-2015.10.16 5 1 9860 0 9.1mb 9.1mb yellow open logstash-2015.10.17 5 1 8059 0 7mb 7mb yellow open logstash-2015.10.18 5 1 7319 0 6.5mb 6.5mb yellow open logstash-2015.10.19 5 1 9530 0 8.9mb 8.9mb yellow open logstash-2015.10.20 5 1 2141 0 2.3mb 2.3mb
まずはClose。10日以上経過したインデックスをクローズします。
# curator --host localhost close indices --older-than 10 --time-unit days --timestring %Y.%m.%d 2015-10-20 18:11:11,983 INFO Job starting: close indices 2015-10-20 18:11:11,997 INFO Action close will be performed on the following indices: [u'logstash-2015.09.20', u'logstash-2015.09.21', u'logstash-2015.09.22', u'logstash-2015.09.23', u'logstash-2015.09.24', u'logstash-2015.09.25', u'logstash-2015.09.26', u'logstash-2015.09.27', u'logstash-2015.09.28', u'logstash-2015.09.29', u'logstash-2015.09.30', u'logstash-2015.10.01', u'logstash-2015.10.02', u'logstash-2015.10.03', u'logstash-2015.10.04', u'logstash-2015.10.05', u'logstash-2015.10.06', u'logstash-2015.10.07', u'logstash-2015.10.08', u'logstash-2015.10.09', u'logstash-2015.10.10'] 2015-10-20 18:11:12,626 INFO Provided indices successfully sealed. (Shown with --debug flag enabled.) 2015-10-20 18:11:12,776 INFO Job completed successfully.
コマンドを簡単に解説します。
- close:サブコマンド:クローズ操作を行います。
- indices:サブコマンド:インデックスに対してクローズ操作を行います。
- --host
:APIを発行する対象のElasticsearchホストを指定します。デフォルトはlocalhostで動作します。 - --older-than
:Closeするインデックスの期間を数値で指定します。--time-unitと併用します。 - --time-unit
:Closeするインデックスの期間を単位で指定します。hours / days / weeks / monthsから指定可能です。--older-thanオプションや--newer-thanオプションと併用します。 - --timestring
:指定した期間を判断するインデックス名のdateフォーマット。今回は「2015.09.24」といった形式なので、「%Y.%m.%d」を指定します。
それではインデックスがどうなったか確認します。
# curl localhost:9200/_cat/indices |sort close logstash-2015.09.20 close logstash-2015.09.21 close logstash-2015.09.22 close logstash-2015.09.23 close logstash-2015.09.24 close logstash-2015.09.25 close logstash-2015.09.26 close logstash-2015.09.27 close logstash-2015.09.28 close logstash-2015.09.29 close logstash-2015.09.30 close logstash-2015.10.01 close logstash-2015.10.02 close logstash-2015.10.03 close logstash-2015.10.04 close logstash-2015.10.05 close logstash-2015.10.06 close logstash-2015.10.07 close logstash-2015.10.08 close logstash-2015.10.09 close logstash-2015.10.10 yellow open logstash-2015.10.11 5 1 8472 0 7.4mb 7.4mb yellow open logstash-2015.10.12 5 1 10284 0 9.7mb 9.7mb yellow open logstash-2015.10.13 5 1 10221 0 9.4mb 9.4mb yellow open logstash-2015.10.14 5 1 11957 0 11mb 11mb yellow open logstash-2015.10.15 5 1 18480 0 12.3mb 12.3mb yellow open logstash-2015.10.16 5 1 9860 0 9.1mb 9.1mb yellow open logstash-2015.10.17 5 1 8059 0 7mb 7mb yellow open logstash-2015.10.18 5 1 7319 0 6.5mb 6.5mb yellow open logstash-2015.10.19 5 1 9530 0 8.9mb 8.9mb yellow open logstash-2015.10.20 5 1 2141 0 2.3mb 2.3mb # curl "localhost:9200/logstash-2015.09.20/_search?pretty" { "error" : { "root_cause" : [ { "type" : "index_closed_exception", "reason" : "closed", "index" : "logstash-2015.09.20" } ], "type" : "index_closed_exception", "reason" : "closed", "index" : "logstash-2015.09.20" }, "status" : 403 }
10月10日以前のインデックスがクローズステータスとなっています。Search APIをコールしてもクローズしているので参照できません。
続いて削除。20日以上経過したインデックスを削除します。
# curator --host localhost delete indices --older-than 20 --time-unit days --timestring %Y.%m.%d 2015-10-20 18:30:05,425 INFO Job starting: delete indices 2015-10-20 18:30:05,481 INFO Pruning Kibana-related indices to prevent accidental deletion. 2015-10-20 18:30:05,481 INFO Action delete will be performed on the following indices: [u'logstash-2015.09.20', u'logstash-2015.09.21', u'logstash-2015.09.22', u'logstash-2015.09.23', u'logstash-2015.09.24', u'logstash-2015.09.25', u'logstash-2015.09.26', u'logstash-2015.09.27', u'logstash-2015.09.28', u'logstash-2015.09.29', u'logstash-2015.09.30'] 2015-10-20 18:30:05,502 INFO Deleting indices as a batch operation: 2015-10-20 18:30:05,502 INFO ---deleting index logstash-2015.09.20 2015-10-20 18:30:05,503 INFO ---deleting index logstash-2015.09.21 2015-10-20 18:30:05,503 INFO ---deleting index logstash-2015.09.22 2015-10-20 18:30:05,503 INFO ---deleting index logstash-2015.09.23 2015-10-20 18:30:05,504 INFO ---deleting index logstash-2015.09.24 2015-10-20 18:30:05,504 INFO ---deleting index logstash-2015.09.25 2015-10-20 18:30:05,504 INFO ---deleting index logstash-2015.09.26 2015-10-20 18:30:05,504 INFO ---deleting index logstash-2015.09.27 2015-10-20 18:30:05,504 INFO ---deleting index logstash-2015.09.28 2015-10-20 18:30:05,504 INFO ---deleting index logstash-2015.09.29 2015-10-20 18:30:05,505 INFO ---deleting index logstash-2015.09.30 2015-10-20 18:30:07,223 INFO Job completed successfully.
コマンドの解説はclose
がdelete
に変わっただけですので割愛します。
それではインデックスがどうなったか確認します。
# curl localhost:9200/_cat/indices |sort close logstash-2015.10.01 close logstash-2015.10.02 close logstash-2015.10.03 close logstash-2015.10.04 close logstash-2015.10.05 close logstash-2015.10.06 close logstash-2015.10.07 close logstash-2015.10.08 close logstash-2015.10.09 close logstash-2015.10.10 yellow open logstash-2015.10.11 5 1 8472 0 7.4mb 7.4mb yellow open logstash-2015.10.12 5 1 10284 0 9.7mb 9.7mb yellow open logstash-2015.10.13 5 1 10221 0 9.4mb 9.4mb yellow open logstash-2015.10.14 5 1 11957 0 11mb 11mb yellow open logstash-2015.10.15 5 1 18480 0 12.3mb 12.3mb yellow open logstash-2015.10.16 5 1 9860 0 9.1mb 9.1mb yellow open logstash-2015.10.17 5 1 8059 0 7mb 7mb yellow open logstash-2015.10.18 5 1 7319 0 6.5mb 6.5mb yellow open logstash-2015.10.19 5 1 9530 0 8.9mb 8.9mb yellow open logstash-2015.10.20 5 1 2141 0 2.3mb 2.3mb
9月30日以前のインデックスが削除できました。
このようにCuratorを利用することで柔軟なインデックスのローテーションを簡単に行うことが出来ます。
Snapshot取得
ElasticsearchはSnapshotによりインデックスをバックアップすることができます。Snapshot取得先はファイルシステムといったローカルから、URL、HDFSといったリモートやAWS S3、Azuleといったクラウドなど様々なデータストアを指定することができます。
それではCurator
を利用してSnapshotを取得します。
# curator snapshot --repository repos indices --all-indices 2016-06-05 04:54:20,204 INFO Job starting: snapshot indices 2016-06-05 04:54:20,204 INFO Overriding default connection timeout for snapshot action. New timeout: 21600 2016-06-05 04:54:20,220 INFO Matching all indices. Ignoring flags other than --exclude. 2016-06-05 04:54:20,220 INFO Action snapshot will be performed on the following indices: [u'.kibana', u'logstash-2015.09.20', u'logstash-2015.09.21', u'logstash-2015.09.22', u'logstash-2015.09.23', u'logstash-2015.09.24', u'logstash-2015.09.25', u'logstash-2015.09.26', u'logstash-2015.09.27', u'logstash-2015.09.28', u'logstash-2015.09.29', u'logstash-2015.09.30', u'logstash-2015.10.01', u'logstash-2015.10.02', u'logstash-2015.10.03', u'logstash-2015.10.04', u'logstash-2015.10.05', u'logstash-2015.10.06', u'logstash-2015.10.07', u'logstash-2015.10.08', u'logstash-2015.10.09', u'logstash-2015.10.10', u'logstash-2015.10.11', u'logstash-2015.10.12', u'logstash-2015.10.13', u'logstash-2015.10.14', u'logstash-2015.10.15', u'logstash-2015.10.16', u'logstash-2015.10.17', u'logstash-2015.10.18', u'logstash-2015.10.19', u'logstash-2015.10.20'] 2016-06-05 04:54:20,361 INFO Snapshot name: curator-20160605045420 2016-06-05 04:54:29,668 INFO Snapshot curator-20160605045420 successfully completed. 2016-06-05 04:54:29,678 INFO Job completed successfully.
コマンドを簡単に解説します。
- snapshot:スナップショットを実行します。
- --repository
:Snapshotリポジトリ名を指定します。今回はreposというSnapshotリポジトリを用意しています。 - indices:インデックスを対象とします。
- --all-indices:全てのインデックスを対象とします。
それではスナップショットが作成されたのか確認します。標準出力されたスナップショット名を指定して情報を取得します。
curl "localhost:9200/_snapshot/repos/curator-20160605045420?pretty" { "snapshots" : [ { "snapshot" : "curator-20160605045420", "version_id" : 2030399, "version" : "2.3.3", "indices" : [ "logstash-2015.10.14", "logstash-2015.10.15", "logstash-2015.10.12", "logstash-2015.10.13", "logstash-2015.10.18", "logstash-2015.10.19", "logstash-2015.10.16", "logstash-2015.10.17", "logstash-2015.09.30", ".kibana", "logstash-2015.10.20", "logstash-2015.10.09", "logstash-2015.10.03", "logstash-2015.10.04", "logstash-2015.10.01", "logstash-2015.10.02", "logstash-2015.10.07", "logstash-2015.10.08", "logstash-2015.10.05", "logstash-2015.10.06", "logstash-2015.09.20", "logstash-2015.09.21", "logstash-2015.10.10", "logstash-2015.09.22", "logstash-2015.10.11", "logstash-2015.09.23", "logstash-2015.09.24", "logstash-2015.09.25", "logstash-2015.09.26", "logstash-2015.09.27", "logstash-2015.09.28", "logstash-2015.09.29" ], "state" : "SUCCESS", "start_time" : "2016-06-05T04:54:20.398Z", "start_time_in_millis" : 1465102460398, "end_time" : "2016-06-05T04:54:29.610Z", "end_time_in_millis" : 1465102469610, "duration_in_millis" : 9212, "failures" : [ ], "shards" : { "total" : 156, "failed" : 0, "successful" : 156 } } ] }
指定期間を過ぎたSnapshotの削除
次に作成したSnapshotを削除します。
# curator delete snapshots --repository repos --older-than 1 --time-unit days --timestring %Y%m%d%H%M%S Mon Jun 6 14:11:00 UTC 2016 2016-06-06 14:11:00,330 INFO Job starting: delete snapshots 2016-06-06 14:11:00,509 INFO Deleting snapshot curator-20160605045420 2016-06-06 14:11:01,905 INFO Job completed successfully.
timestringオプションで命名規則を合わせる必要があるのでSnapshotをローテーションする場合はCurator
でSnapshotを取得、削除した方が命名を意識せずに済むのでオススメです。
Amazon ES(AWS Signing Signature)対応
GithubのソースコードやIssueを確認したところ、バージョン4.0系からオプションにaws_key、aws_secret_key、aws_regionの指定が可能となっていました。が、最初に記載している通り、Curator 4.0系からElasticsearch 2.0以降をサポートと記載があるため、Amazon ESはサポート対象外のような。indexの削除、CloseといったAPIは変わっていないから使えるのでしょうが。。
そこでCurator 3.5をForkして、IAM認証に対応したものもあります。こちらを使えば、Curator 3.5系(Elasticsearch 1.x系サポート)、かつIAM認証が可能になります。
こちらもやってみた
インストール
pipやパッケージリポジトリで配布されていないのでソースコードからインストールします。といっても簡単です。
# git clone https://github.com/servomac/curator.git Cloning into 'curator'... remote: Counting objects: 3565, done. remote: Total 3565 (delta 0), reused 0 (delta 0), pack-reused 3565 Receiving objects: 100% (3565/3565), 938.94 KiB | 186.00 KiB/s, done. Resolving deltas: 100% (2416/2416), done. Checking connectivity... done. # cd curator # git checkout remotes/origin/aws # pip install -r requirements.txt # python setup.py build # python setup.py install
IAM認証を利用したCurator実行
IAM認証を利用して、Amazon ESのドメインからインデックス一覧を取得します。
# ./run_curator.py --host search-***********.ap-northeast-1.es.amazonaws.com --port 80 --access-key <ACCESS_KEY_ID> --secret-access-key <SECRET_ACCESS_KEY> --region ap-northeast-1 show indices --all-indices 2016-06-07 10:58:24,500 INFO Job starting: show indices 2016-06-07 10:58:24,597 INFO Matching all indices. Ignoring flags other than --exclude. 2016-06-07 10:58:24,598 INFO Action show will be performed on the following indices: [u'.kibana-4', u'cloudfront-logs-2016.04.19', u'cloudfront-logs-2016.04.20', u'cloudfront-logs-2016.04.21', u'cloudfront-logs-2016.04.23', u'cloudfront-logs-2016.04.24', u'cloudfront-logs-2016.04.25', u'cloudfront-logs-2016.04.26', u'cwl-2016.04.26', u'cwl-2016.04.27', u'cwl-2016.04.28', u'cwl-2016.04.29', u'cwl-2016.04.30', u'cwl-2016.05.01', u'cwl-2016.05.02', u'cwl-2016.05.03', u'cwl-2016.05.04', u'cwl-2016.05.05', u'cwl-2016.05.06', u'cwl-2016.05.07', u'cwl-2016.05.08', u'cwl-2016.05.09', u'cwl-2016.05.10', u'cwl-2016.05.11', u'cwl-2016.05.12', u'cwl-2016.05.13', u'cwl-2016.05.14', u'cwl-2016.05.15', u'cwl-2016.05.16', u'cwl-2016.05.17', u'cwl-2016.05.18', u'cwl-2016.05.19', u'cwl-2016.05.20', u'cwl-2016.05.21', u'cwl-2016.05.22', u'cwl-2016.05.23'] 2016-06-07 10:58:24,598 INFO Matching indices: .kibana-4 cloudfront-logs-2016.04.19 cloudfront-logs-2016.04.20 cloudfront-logs-2016.04.21 : cwl-2016.05.21 cwl-2016.05.22 cwl-2016.05.23
インデックスを取得することができました。
まとめ
いかがでしたでしょうか?
このようにCuratorを利用すれば、柔軟なメンテナンスを独自実装する必要がなく、Cronやタスクスケジューラなどで定期的にコマンドを実行するだけで簡単に行えました。公式リポジトリではありませんが、Amazon Elasticsearch Serviceへの対応もされています。