Index Lifecycle Management(ILM)

# はじめに

とりとめなく書いてる、Elasticsearchネタです。

##　概要

6.6からIndex Lifecycle Management(ILM)という機能が追加されます。これまで、Curator等、外部からの実行に頼っていたIndexの管理をこの機能で行うことができるようになります（BASICライセンスで使える！）。

ILMでは、ライフサイクルのフェーズごとに何をするかを定義するポリシーを作成して、それをIndex、もしくは、Index Templateに指定します。
7.0.0-SNAPSHOTでは、`watch_history-ilm-policy`という、.watch_historyを管理するポリシーがデフォルトで組み込まれるなど、システムでも活用されています。

また、KibanaにはUIが実装され、ポリシーの作成・適用、Index ManagementのUIから各Indexがどのフェーズにいるのかを見ることもできます。

スナップショット作成はできないので、Curatorにやってもらいましょう。
でも、スナップショットもとれるようにしよう！とかいう[Issue](https://github.com/elastic/elasticsearch/issues/38461)もでてきました。どうするCurator！

IndexのLifecycleにフェーズがあって、そのフェーズごとにやれること（アクション）が決まっています。

##　使い方

1. まずフェーズごとに何をするのかを決めたポリシーを作成
2. そのポリシーをインデックステンプレートに適用（もしくは、インデックス作成時にポリシーを指定）
3. ILMを起動

作成済みのIndexに対して、ポリシーを適用することも出来ます。

##　ライフサイクルのフェーズ

フェーズには、以下の4つがあります。

1. hot: このフェーズのインデックスには、ガンガン書き込まれています
2. warm: このフェーズのインデックスには（ほとんど）書き込みはありませんが、ガンガン検索されます
3. cold: このフェーズのインデックスは更新されず、めったに検索されません。でも、まだ（遅くてもいいので）検索可能である必要はあります
4. delete: このフェーズのインデックスは必要ないので消しても大丈夫です

## アクション

で、各フェーズでは、以下のアクションを実行することができます。

1. hot: Rollover, Set Priority(6.7~), Unfollow(6.7~)
2. warm: Allocate, Read-Only, Force Merge, Shrink, Set Priority(6.7~), Unfollow(6.7~)
3. cold: Allocate, Set Priority(6.7~), Freeze(6.7~), Unfollow(6.7~)
4. delete: Delete

- Rollover: Rolloverするタイミングを設定する
- Set Priority: Index回復の優先順位を設定する（値は0以上）。hot > warm > cold の順に値を指定しておくと良さそう
- Unfollow: CCRのFollower Indexとなっている場合に、通常のIndexに戻す。Unfollowは明示的に実行も出来るけど、Rollover ActionとShrink Actionの前に自動的に実行される。
ので、通常は指定する必要は無さそう。
と7.0では書いてある。6.xでは書いてない。
- Allocate: Indexを移動したり、レプリカ数を変えたりする
- Force Merge: SegmentをForce mergeする
- Read-Only: IndexをRead-Onlyにする
- Shrink: IndexをShrinkする
- Freeze: IndexをFreezeする
- Delete: Indexを削除する

一部は、まだKibana上から指定できません（今のところ、6.7ではSet PriorityとUnfollowが、7.0ではUnfollowが使えない）。

## 使用例

### 前提
- 前提として、`node.attr.XXX`（`XXX`は任意）に有意な値を設定しておく
   - 例えば、`node.attr.box_type`に`hot`/`warm`/`cold`などを設定
   - Indexテンプレートでは、hot,warmのノードにIndexを作成するように指定
   - policyには、warm phaseでは`require.box_type=hot, warm`を、cold phaseでは`require.box_type=cold`を指定して、フェーズごとにシャードの移動を行う

### ILM Policy設定の作成

Kibana上のUIから作ります。
hotからwarm、cold、deleteへの移行については、hotでRolloverをやる・やらないで、UI上での設定項目が変わります。

RolloverをUIで設定する場合は、必ずmax_ageを指定する必要があります（mac_docs, max_sizeはどちらか一方を指定）。

#### Rolloverする場合

Rollover後すぐにwarmに移行するか、もしくは、Rolloverしてから一定時間後に移行するかを選ぶことができます。

#### Rolloverしない場合

Indexが作成されてからの経過時間を設定します。

### Indexテンプレートの作成

下記のように、最初にIndexが作成されるノードを`hot`属性のついたノードに固定しておきます。

```json
PUT _template/test_template
{
   "index_patterns": ["test-*"],
   "settings": {
     "number_of_shards": 3,
     "number_of_replicas": 1,
     "lifecycle.name": "<ポリシー名>",
     "lifecycle.rollover_alias": "test",
     "routing.allocation.require.box_type": "hot"
   }
}
```

以降、Phaseが移行する都度`index.routing.allocation.require.box_type`の値が変わっていきます（通常は手動でやるところを、ILMが自動的に変えてくれる）。

### Rollover設定

続いて、Rollover設定を行います。

```json
PUT test-000001
{
   "aliases": {
     "test": {
       "is_write_index": true
     }
   }
}
```

あとは、Aliasに対してデータを投入します。

## 各プロダクトでのILM対応

### Beats
https://github.com/elastic/beats/pull/7963

### Kibana
https://github.com/elastic/kibana/issues/20824

### Logstash
https://github.com/logstash-plugins/logstash-output-elasticsearch/issues/798

### Curator
競合？
少なくともスナップショットはCuratorで。

## おわりに

6.6では、スナップショットの作成とILMの実行がかぶるとおかしなことになる[らしい](https://github.com/elastic/elasticsearch/pull/37624)ですが、6.6では対処されず、6.7以降で解決します。
てな感じで、6.6で入るけどまだまだかなー。でも早く使いたい！