ElasticsearchのLogstash形式インデックスをお手軽に削除するワンライナー
elasticsearchのlogstash形式インデックスを、定期的にcronで削除したいときに便利なワンライナーを紹介します。 使うコマンドはdateとcurlのみという大変シンプルなものですので、環境を選びません。
既存スクリプト
同様の目的を達成するためのスクリプトはいくつかあります。
いずれも、インストールやスクリプトの設置が必要なものです。
1. elasticsearch-curator
elasticsearchが公式に開発している多機能な運用管理スクリプトです。
しかしながらPythonであることと、筆者のCentOS 6.5のPython 2.6環境ではうまく動きませんでした。
次のように利用します。
$ curator --host my-elasticsearch delete --older-than 14 --prefix logstash-
使い方は次のページが参考になります。
- http://qiita.com/ise_daisuke/items/266461ffc91246deb9ad
- http://blog.johtani.info/blog/2014/01/24/curator-tending-your-time-series-indices-in-japanese/
2. logstash-delete-index
次のようにどこかに設置したスクリプトを利用します。
$ ./logstash_index_cleaner.py -d 14 --host my-elasticsearch --prefix logstash-
インデックスを削除するワンライナー
それでは本題のワンライナーを紹介します。こちら、CentOS 6.5にて動作を確認しております。
# PREFIXで接頭辞(普通は`logstash-`ですね)を指定 PREFIX="apache-" # DAYで何日前のインデックスを削除するか指定 DAY=20 # dateコマンドと先ほど指定したDAY変数で削除対象インデックスを求める INDEX=`date +$PREFIX%Y.%m.%d --date "${DAY} days ago"` # curlコマンドを用いてリクエストを発行する # 引数にあるホスト名は、環境に応じて書き換えましょう # -w引数は省略しても良いです。自動的にcurlコマンドの末尾に改行を追加するものです curl -XDELETE -w'\n' "http://localhost:9200/${INDEX}"
これをワンライナーにすると、次のコードになります。
$ PREFIX="apache-"; DAY=20; INDEX=`date +$PREFIX%Y.%m.%d --date "${DAY} days ago"`; curl -XDELETE -w'\n' "http://localhost:9200/${INDEX}"
cronへの設定例
次に、20日前のインデックスを削除する設定例を次に紹介します。
logstash形式のインデックスはUTCで作られるため、GMT+9である日本にあわせて毎朝9時に実行しています。
0 9 * * * PREFIX="apache-"; DAY=20; INDEX=`date +$PREFIX\%Y.\%m.\%d --date "${DAY} days ago"`; curl -XDELETE -w'\n' "http://localhost:9200/${INDEX}"
Crontabではパーセント記号はコマンドの終わりとして解釈されるのでエスケープしましょう。
インデックスをclose/openするワンライナー
closeするとき
$ PREFIX="apache-"; DAY=20; INDEX=`date +$PREFIX\%Y.\%m.\%d --date "${DAY} days ago"`; curl -XPOST -w'\n' "http://localhost:9200/${INDEX}/_close"
openするとき
$ PREFIX="apache-"; DAY=20; INDEX=`date +$PREFIX\%Y.\%m.\%d --date "${DAY} days ago"`; curl -XPOST -w'\n' "http://localhost:9200/${INDEX}/_open"
まとめ
今回は主にlogstash形式のインデックスの定期的な削除方法を紹介しました。
logstash形式のインデックスをストアするelasticsearchを運用する上で、定期的に行った方がよいとされることは次の通りです。
- delete : 不要となったindexを削除し、関連するキャッシュもメモリから解放する
- close : 存在はするが検索はしないときに使い、メモリからメタデータ以外を解放する
- bloom : クエリ実行を高速化するためのキャッシュをメモリから解放する
まずはディスク容量の確保が出来るdeleteを利用し始めて、次に検索対象期間外のインデックスをcloseしましょう。
その後にメモリ利用効率向上のため、検索対象ではあるがメモリには載せないようにするためのbloom filter cacheの利用も検討すると良いでしょう。