curatorでelasticsearchのindexをメンテナンスする
14
- 5月
2017
Posted By : boomin
curatorでelasticsearchのindexをメンテナンスする

 

Advertisements

概要

CuratorはElastic社が提供するPython実装の運用支援ツールです。

elasticsearchを使用したシステムを長期間、安定して運用するためには、indexのメンテナンスが欠かせません。
なぜなら、elasticsearchは検索対象のdocumentをメモリに展開するからです。
なので、長期間そのままだと、メモリを食いまくって、メモリダンプを吐いて死んでしまったりします。

そこで、定期的に古いログを削除するなどのメンテナンスが必要です。

 

では、どうやってメンテナンスするか

もちろん、elasticsearchはREST APIを持っているので、自分でメンテ用のスクリプトを書いて、cronとかで定期実装させてもよいです。

 
でも、面倒ですね。
 

そこでcuratorですよ。curatorを使えば、かなり簡単にindexのメンテができます。

今回は、もちろんリアルタイム麺活監視システムを安定稼働させるためのindexメンテナンスです。

 
あ、これは筆者が岩手県宮古市で食べたラーメンです。
ラーメン
 

設定などは、こちらのサイトを参考にさせてもらいました。

 

環境準備

それでは、環境構築をしていきましょう。

 

Advertisements

インストール

pythonで実装されているので、以下のコマンドで一発で導入できます。

$ pip install elasticsearch-curator

 

便利な世の中になったものだな・・・・

 

定義ファイルの修正

curatorでは、以下の2つのファイルを修正する必要があります。

設定ファイル名説明
Configuration Filecurator自身の動きについて定義する
Action Fileindexなどに対するメンテナンスの内容を定義する

 

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の稼働状況を監視したものです。

indexのメンテナンス

 
このように、6/1(木曜日)のAM3時半ごろ、確かに使用していたJava VMのHeapメモリが、ガクっと減っていますね。
これは、メモリ上に展開されているindexのcloseが行われたからですね。

こういうメンテナンスを行わないと、そのうち、OutOfMemoryを吐いて、プロセスが死んでしまうことになります。
こうした運用設計を行うことが重要ですね。

 

最後に

これをやっておかないと、ElasticSearchの長期運用はちょっと無理ですよね。

こうしたシステムメンテナンスを怠ることなく、サービスの安定稼働ができるようにしておきましょう。

ついでに

リアルタイム麺活監視システムは、一般公開していません。
というのも、ポケットマネーでサーバを用意している関係で、潤沢なスペックのVMを用意できないのです。

我こそはというスポンサーの方がいたら、それを原資にサーバ増強させて、サービス提供に挑戦してみようと思います。

それでは。

Advertisements

コメントを残す