CuratorによるElasticsearchのメンテナンス

2016.06.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

ボルダリングやりたい藤本です。

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.

コマンドの解説はclosedeleteに変わっただけですので割愛します。

それではインデックスがどうなったか確認します。

# 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への対応もされています。

参考サイト