Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

ElasticsearchのLogstash形式インデックスをお手軽に削除するワンライナー

photo by Irina Souiki

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-

使い方は次のページが参考になります。

2. logstash-delete-index

インデックスの削除に特化したPythonスクリプトです。

次のようにどこかに設置したスクリプトを利用します。

$ ./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の利用も検討すると良いでしょう。