【Elastic Stack】BeatsのIndex Lifecycle Management(ILM)の変更のポイント

# ILMとは
ILMは、Hot-Warm-Cold-Deleteの流れでインデックスのデータのライフサイクルを管理するための機能となります。ライフサイクルのポリシーをindexのデータサイズや経過した日数で設定することで、indexのフェーズを遷移させることができます。またデータ復元時の優先度を各フェーズに設定することができます。
https://www.elastic.co/jp/blog/implementing-hot-warm-cold-in-elasticsearch-with-index-lifecycle-management

| フェーズ | 概要 |
|:--------|:-----|
|Hot|更新と検索を頻繁に行うフェーズです。|
|Warm|検索を頻繁に行うフェーズです。|
|Cold|検索をまれに行うフェーズです。メモリを節約するために、インデックスをフリーズ状態にすることもできます。|
|Delete|このフェーズの場合、indexは削除されます。|

# BeatsのILMを変更
ILMを簡単に確認しようと、Beatsで作られるライフサイクルポリシーを変更したら色々躓いたので、手順を整理してみました。
BeatsのILMの設定変更の反映は、通常ロールオーバー後(metricbeatの初期値は30日後または50GB超過)となるため、即時反映したい場合は、おおよそ以下のどちらかを適用することになります。

* 手順A(インデックスを作り直す)
 * 特記事項：データが入っていないとreindexが動きません。

* 手順B(強制ロールオーバー)　
 * 特記事項：データが入っていなくても使えます。

## 手順A(インデックスを作り直す)
[1] ライフサイクルポリシーを更新します。
[管理]-[ インデックスライフサイクルポリシー]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/68c8eb28-90a6-d177-1ffc-cd44c80f6995.png)
ライフサイクルポリシーの変更が、Beatsのインデックスに反映されてないことを確認できます。
 [管理]-[インデックス管理]-[metricbeat-7.4.2-2019.11.26-000001]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/d8e7547c-3b8c-354d-0496-314fb3579edb.png)
[2] Beatsを止めます。

```
# systemctl stop metricbeat
```

[3] ILMを停止します。

```
POST _ilm/stop
```

[4] reindexでインデックスを別名でコピーします。

```
POST _reindex
{
  "source": {
    "index": "metricbeat-7.4.2-2019.11.26-000001"
  },
  "dest": {
    "index": "metricbeat_back"
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/55247ff2-ad57-6671-3ce0-2aaba147b565.png)

[5] 元のindexを削除します。

```
DELETE metricbeat-7.4.2-2019.11.26-000001
```

[6] reindexで再度削除したものと同名でコピーします。
    ※ここで、テンプレートを通してライフサイクルポリシーの内容が適用されます。

```
POST _reindex
{
  "source": {
    "index": "metricbeat_back"
  },
  "dest": {
    "index": "metricbeat-7.4.2-2019.11.26-000001"
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/605ec74f-3f93-cdb3-dd18-cbe755adf17e.png)

[7] バックアップしたindexを削除します。

```
DELETE metricbeat_back
```

[8] aliasを設定して、metricbeatから「metricbeat-7.4.2」名で送信されるデータが「metricbeat-7.4.2-2019.11.21-000001」に格納されます。

```
POST /_aliases
{
  "actions": [
    {
      "add": {
        "index": "metricbeat-7.4.2-2019.11.26-000001",
        "alias": "metricbeat-7.4.2",
        "is_write_index": true
      }
    }
  ]
}
```

[9] ILMを起動します。

```
POST _ilm/start
```

Beatsのインデックスに反映されていることを確認できます。
[管理]-[インデックス管理]-[metricbeat-7.4.2-2019.11.26-000001]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/f8861821-9e9a-812c-b3b4-28604dc318a4.png)

## 手順B(強制ロールオーバー)

[1] ライフサイクルポリシーを更新します。
[管理]-[ インデックスライフサイクルポリシー]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/e4449e4c-1f9e-3eaf-2dd1-08a7466098e1.png)

ライフサイクルポリシーの変更が、Beatsのインデックスに反映されてないことを確認できます。
[管理]-[インデックス管理]-[metricbeat-7.4.2-2019.11.26-000001]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/b8651789-c1ce-a794-d932-1ffbe6ecb065.png)

[2] ILMを一旦止めます。

```
POST _ilm/stop
```

[3] 手動で rollover します。

```
POST /metricbeat-7.4.2/_rollover/metricbeat-7.4.2-2019.11.26-000002
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/23e82c83-9aac-adba-39e4-a7d04916a2be.png)

 [4] 古いindexにindex.lifecycle.indexing_completeをtrueにセットします。

```
PUT metricbeat-7.4.2-2019.11.26-000001/_settings
{
  "index.lifecycle.indexing_complete": true
}
```

[5] ILMを再開します。

```
POST _ilm/start
```

Beatsのインデックスに反映されていることを確認できます。
[管理]-[インデックス管理]-[metricbeat-7.4.2-2019.11.26-000001]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/a65362ff-1013-fb54-3836-25014e68b563.png)

[管理]-[インデックス管理]-[metricbeat-7.4.2-2019.11.26-000002]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322110/c9ad35d8-a741-1de4-b250-cd62f11e728f.png)


# おわりに
ライフサイクルポリシーには、テンプレートやエイリアスも関わってくるため、Elasticsearchのインデックス周りをきちんと把握しておくことが重要となります。

# 参考リンク
手順A[4], 手順A[6] reindexの参考URL
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/ilm-reindexing-into-rollover.html

手順A[8] aliasの参考URL
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/indices-aliases.html

手順A[3] ILM停止の参考URL, 手順A[9] ILM起動の参考URL, 手順B[2] ILM停止の参考URL, 手順B[5] ILM起動の参考URL
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/start-stop-ilm.html

手順B[3] rolloverの参考URL
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/indices-rollover-index.html

手順B[4] completeの参考URL
https://www.elastic.co/guide/en/elasticsearch/reference/7.4/skipping-rollover.html