Elasticsearch 5.0 で追加された Rollover Index / Shrink Index 触ってみる

  • 6
    いいね
  • 0
    コメント

こんにちは bsoo です。

Elasticsearch 5系から追加された Rollover Index / Shrink Index APIの紹介です。
前々から追加されたことは知っていましたが、使ったことはなく、Elastic{on} Tokyo 2016の中でも紹介されていたのですが、少し気になったので調べてみました。

◼Rollover Index

RolloverIndexとは

ロールオーバーインデックスAPIは、既存のインデックスが大きすぎる場合や古すぎる場合に、エイリアスを新しいインデックスにロールオーバーします。: 公式ドキュメントより引用

このAPIでできること

簡単にいえば、新しいインデックスを作成してそちらにエイリアスを移してくれる APIです。 ※ reindexとは違い、mappingやデータは移行されません。

ログを取っているIndexを切り替える際に便利ですね。

使い方

Rollover Indexを使用するためには以下の条件を満たしておく必要があります。

  • 対象のインデックスにエイリアスがついていること
  • エイリアスに対してインデックスが一つであること

簡単な例を書きます。

# index名: log-001
# alias名: log

# request
POST /log/_rollover

# response
{
  "old_index": "log-001",
  "new_index": "log-002",
  "rolled_over": true,
  "dry_run": false,
  "acknowledged": true,
  "shards_acknowledged": true,
  "conditions": {}
}

インデックス名の末尾を -001 のように - + 数値 としておけば自動で数値をインクリメントしたインデックスを作成してくれます。

自分で名前を指定する場合は URLの後ろに新しいインデックス名を指定します。

# request
POST /log/_rollover/log-000001

# response
{
  "old_index": "log-001",
  "new_index": "log-000001",
  "rolled_over": true,
  "dry_run": false,
  "acknowledged": true,
  "shards_acknowledged": true,
  "conditions": {}
}

また、新しいインデックスを作成するかどうかの条件を設定することができます。

# indexの作成から一日以上経過している
# ドキュメントの数が10以上になっている
# 上記の条件を満たす場合に新しいインデックスを作成

# request
POST /log/_rollover
{
  "conditions":{
    "max_age": "1d",
    "max_doc": 10,
  }
}

他にもmappingや設定も指定してインデックスを作成もできるようです。

やっていることは単純ですが、ログを運用している人にとっては嬉しい機能ですね。

dry_runオプションが用意されているので、本番で使用するときには事前に確認しておきましょう

◼Shrink Index

ShrinkIndexとは

既存のインデックスをより少ないプライマリシャードで新しいインデックスに縮小できます。
公式ドキュメントより引用

このAPIでできること

・ シャード数を縮小したインデックスを作成できる

縮小まで一発でやってくれるreindex っていう認識でいいのかな? :thinking:  

使い方

まずテスト用のインデックスを作成します。
Shrink Indexで縮小する際、新しく作るインデックスのシャード数は元のインデックスのシャード数の因数である必要があります。

なので、今回は128で作ってみます。

PUT /test_shrink_01
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 128
  }
}

また、元となるインデックスには以下の設定を反映させます。

PUT /test_shrink_01/_settings
{
  "settings": {
    "index.routing.allocation.require._name": "node_name", 
    "index.blocks.write": true 
  }
}

これで準備完了です。
以下のリクエストでShrinkIndexを実行します。

# request
POST test_shrink_01/_shrink/test_shrink_02
{
  "settings": {
    "index.number_of_replicas": 1,
    "index.number_of_shards": 8, 
  }
}

# response
{
  "acknowledged": true,
  "shards_acknowledged": true
}

さらにインデックスの状態を確認します。

GET /_cat/indices?v

index           pri  docs.count
test_shrink_01    8          55
test_shrink_01  128          55

こちらも簡単にできました。

まだ詳細な挙動や設定項目が色々あるので、活用方法は多そうです。
ReindexAPIとの使い分けはどうするべきなのか...

今度ゆっくり調べたい。

この投稿は Elastic stack (Elasticsearch) Advent Calendar 201619日目の記事です。