Index LifeCycle Managementを体感する

概要

Elasticsearch 6.6.0から、まだGAとはなっていませんが、Index LifeCycle Management(ILM)が提供されるようになりました。 あわせて、Kibanaでも管理画面が追加されています。

LifeCycle Managementが提供されるということは、こんなことができるようになるということです。

  • 1つのIndexが大きくなりすぎないように、ローリングする(log4netなんかでお馴染みのFileRollingAppenderのようなもの)
  • ある程度期間が過ぎたらIndexを消す(今までcuratorなどで、外部からバッチ処理していたものが自動化されるように)

今回は、何らかの自作ツールでデータを投入している人などが参考になるように、どうすればIndex Lifecycle Policyが適用できるのか、 そのために必要な最小の手順について確認していきます。

ロールオーバーでは、Hotや、Warmなどいろいろあります。Coldあたりが一番面白いとは思うのですが、 ここでは一番簡単なHotで確認していくこととします。

それぞれのフェーズについての詳細は以下をご確認ください。

Managing the index lifecycle | Elasticsearch Reference [6.6] | Elastic

  • Hot—the index is actively being updated and queried.
  • Warm—the index is no longer being updated, but is still being queried.
  • Cold—the index is no longer being updated and is seldom queried. The information still needs to be searchable, but it’s okay if those queries are slower.
  • Delete—the index is no longer needed and can safely be deleted.

おやくそく

今回は、このような設定で各種設定を進めるものとします。

products version
Elasticsearch 6.6.0
Kibana 6.6.0

ともにDockerイメージで起動したものを利用します。

実践

ライフサイクルポリシーの定義を行う

Index Lifecycle Policies

左メニューの「Management」から、「Index Lifecycle Policies」を選択しましょう。

f:id:tsgkdt:20190210221219p:plain
create lifecycle policy

Create policy

「Create policy」ボタンを押下します。

f:id:tsgkdt:20190210221403p:plain
create policy

Create an index lifecycle policy

実際にロールオーバーする際の条件、ポリシーを指定します。

ここで、重要なポリシーに関わる数字は3種類です。ポリシー名は、あとでIndexと結びつけるときに必要なので、書き留めておきましょう。

  • ドキュメント数
  • サイズ(GB)
  • 時間 (day or hour)

今回は、簡易に確認したいので、ドキュメント数を10として、すぐローリングされるようにしました。

f:id:tsgkdt:20190210221619p:plain
Create an index lifecycle policy

作成後確認

この時点では、ただポリシーだけが存在し、どのIndexにも関連づけられていないことから、Linked Indexの項目が0になっています。 次は、ここを設定していきます。

f:id:tsgkdt:20190210221954p:plain
Policy list

Policy適用対象のIndexを作成する

Index Templateの作成

さきほど作成した「test-policy」が適用されるように、index-templateを作成します。

PUT _template/policytest_template
{
  "index_patterns": ["testindex-*"],                 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "test-policy",      
    "index.lifecycle.rollover_alias": "testindex"    
  }
}

index.lifecycle.nameと、index.lifecycle.rollover_aliasが重要な設定となります。 inex.lifecycle.nameには、さきほど登録したポリシー名 test-policyを設定します。 aliasは、ロールオーバーされたIndexを意識せずに検索するために使いますので、testindex-* というようなパターンであれば、testindexとしておくのが良さそうです。

インデックス名は、制約があります。ここが重要です。

https://www.elastic.co/guide/en/elasticsearch/reference/6.6/_actions.html#ilm-rollover-action

index format must match pattern ^.*-\d+$, for example (logs-000001).

「-\d$」の正規表現に合致するように、「-0001」や「-01」のようなIndex名にしましょう。*

たとえば、beatsやlogstashなどで日付単位でindexを作成しているような場合、filebeat-6.5.0-2019.02.09 なんてindexを作ってしまうと、この名前のルールに合致しないのでダメです。

インデックスの作成

先ほどの名前の制約に十分注意して、indexを作成しましょう。

PUT testindex-001
{
  "aliases": {
    "testindex": {
      "is_write_index": true
    }
  }
}

testindex-001というindexに、testindexというエイリアスをつけ、書き込み可能と設定しました。 このあたりは、原典と同じです。

Applying a policy to our index | Elasticsearch Reference [6.6] | Elastic

この時点で、testindexのIndex Lifecycle ManagementのAPIを実行して、中身を見てみるとこのようになっています。

GET testindex/_ilm/explain

phase_executionで、先に作成したポリシーがIndexに適用されていることが確認できました。

{
  "indices" : {
    "testindex-001" : {
      "index" : "testindex-001",
      "managed" : true,
      "policy" : "test-policy",
      "lifecycle_date_millis" : 1549805686543,
      "phase" : "hot",
      "phase_time_millis" : 1549805686862,
      "action" : "rollover",
      "action_time_millis" : 1549805686862,
      "step" : "check-rollover-ready",
      "step_time_millis" : 1549805686862,
      "phase_execution" : {
        "policy" : "test-policy",
        "phase_definition" : {
          "min_age" : "0ms",
          "actions" : {
            "rollover" : {
              "max_age" : "2h",
              "max_docs" : 10
            }
          }
        },
        "version" : 1,
        "modified_date_in_millis" : 1549804753527
      }
    }
  }
}

Kibanaの画面からも確認

さきほどは、Linked indexが0でしたが、今は1つリンクされているため、1になっています。

f:id:tsgkdt:20190210225359p:plain
Linked index 1

データ投入編

データの投入

データの投入は、testindex-001に対してではなく、作成したエイリアスの方(testindex)で実行します。

以下、こんな感じでデータを作成していきます。

PUT testindex/_doc/1
{
  "value": 1
}

現存Indexの確認

ロールオーバーされる前のIndexの状態を確認しておきます。 まだtestindexについては、ロールオーバーされていません。

f:id:tsgkdt:20190210225907p:plain
ロールオーバー

KibanaのIndex Managementの画面から確認すると、Index lifecycle managementの箇所は、このように表示されています。

f:id:tsgkdt:20190210230237p:plain
im- Index lifecycle management

しばらく待つ

Index Lifecycle Managementについては、ドキュメントの閾値を10にしていたところで、11件目がきたらロールオーバー実行、というわけではないようです。 しばしお待ちください。

待ってると、Current actionがcompleteになります。

f:id:tsgkdt:20190210230558p:plain
Current action

再度Index一覧を確認

おおお! 「testindex-001」がロールオーバーされ「testindex-000002」が増えていることが確認できました。

f:id:tsgkdt:20190210230803p:plain
after roll over

001なのだから、002となるようなことを期待していたのですが、そうではない様子。 ベータ版だからなのかもしれませんが、そのあたりは調べ切れていません。

データ投入再び

この状態で、testindexにデータを投入すると、testindex-000002に入るはず。これを確認してみます。

PUT testindex/_doc/13
{
  "value": 13
}

としたら、このようにtestindex-000002に入ることが確認できました。

{
  "_index" : "testindex-000002",
  "_type" : "_doc",
  "_id" : "13",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

検索してみる

testindexというエイリアスに対して検索を投げることによって、testindex-001もtestindex-000002も同じように、それを意識することなく検索結果を得ることができます。

f:id:tsgkdt:20190210231528p:plain
search

終わりに

これまでは、古いindexはCloseして、それでも使わなくなったら消す、というような運用をされていた方は多いと思います。 従来あったRollup機能に加えて、(まだベータ版でGAされていないけれど)Hot、Warm、Cold、Deleteのフェーズの概念が出てきたことによって、運用が変わっていくかもしれません。 削除まで含めてElasticsearchの中で完結する、というのは喜ばれるのではないでしょうか。

[未承諾広告] イベントのお誘い

Kibanaを触る人、興味がある人にとってタイムリーなイベントの案内が先日ありました。

https://events.elastic.co/2019-03-06-kibanaday-tokyo

KibanaのプロダクトマネージャーであるAlona Nadler(アローナ・ナドラー)が来日し、Elastic Kibana Day TOKYOを開催いたします。本セミナーでは、特別に日本市場向けの新発表も計画しています。

日時:2019年3月6日(水)

time
13:30 受付開始
14:30 開始
17:00 終了
終了後 懇親会

「日本市場向けの新発表」というところが気になるところですね。抽選制のイベントですが、ご都合のつく方は申し込まれると良いと思います。
(私はその日に限ってプロジェクトのキックオフ会議とか入れられてしまって抜けられません。誰か実況頼む・・・。またはプロジェクト変わって(ry )

今日はコインランドリーで乾燥機待ちをしながらこれを書きました。 最近のコインランドリーは待合用に机も椅子もあって、ちょっとした書き物をするのに便利ですね。では、よい連休を。