このトピックでは、インデックスライフサイクル管理(ILM)機能を使用して、Alibaba Cloud Elasticsearch クラスタ内のホットデータとコールドデータを分離する方法について説明します。この分離により、ホットウォームアーキテクチャが可能になります。このアーキテクチャは、クラスタの読み取り/書き込みパフォーマンスを向上させ、ホットデータとコールドデータのメンテナンスを自動化し、運用コストを削減します。
背景情報
ビッグデータの時代において、データは常に変化し、Elasticsearch クラスタに保存されるデータ量は時間とともに増加します。データ量が特定のレベルに達すると、クラスタのメモリ使用量、CPU 使用率、および I/O スループットも増加します。これは、クラスタの全文検索パフォーマンスに影響します。この問題に対処するために、Elasticsearch V6.6.0 以降では、ILM 機能が提供されています。これは、インデックスのライフサイクルをホット、ウォーム、コールド、削除の 4 つのフェーズに分割します。ホットフェーズのインデックスの場合、システムはインデックスに書き込まれるデータをロールオーバーする場合があります。ウォーム、コールド、または削除フェーズのインデックスの場合、システムはインデックスに対して関連する操作を実行します。次の表に、これらのフェーズについて説明します。| フェーズ | 説明 |
| ホット | インデックスがこのフェーズにある場合、時系列データをリアルタイムでインデックスに書き込むことができ、インデックス内のドキュメント数、インデックスに保存されているデータ量、およびインデックスの期間に基づいてロールオーバーできます。データは、ロールオーバー API を使用してロールオーバーされます。 |
| ウォーム | インデックスがこのフェーズにある場合、データはインデックスに書き込まれなくなり、インデックスに対してデータクエリのみを実行できます。 |
| コールド | インデックスがこのフェーズにある場合、インデックスは更新されなくなり、インデックスに対して実行されるクエリは少なくなり、クエリプロセスが遅くなります。 |
| 削除 | インデックスがこのフェーズにある場合、インデックスは削除されます。 |
次のいずれかの方法を使用して、ILM ポリシーを 1 つ以上のインデックスに適用できます。
- ILM ポリシーをインデックステンプレートに適用する: この方法を使用すると、ILM ポリシーは同じエイリアスを持つすべてのインデックスに適用されます。このトピックでは、この方法を使用します。
- ILM ポリシーを単一のインデックスに適用する: この方法を使用すると、ILM ポリシーは現在のインデックスにのみ適用されます。ロールオーバー中に生成された新しいインデックスは、ILM ポリシーの影響を受けません。
時系列データ、コールドデータ、およびホットデータに対して ILM 機能を使用すると、データストレージコストを大幅に削減できます。このトピックでは、コールドデータとホットデータに ILM 機能を使用する方法の例を示します。次の説明は、ビジネスシナリオを提供します。
- Elasticsearch クラスタのインデックスにデータをリアルタイムで書き込みます。インデックス内のデータ量が特定のレベルに達すると、システムは超過データを新しいインデックスにロールオーバーします。
- 元のインデックスは 30 分間ホットフェーズに留まり、ウォームフェーズに入ります。
- ウォームフェーズでは、システムは元のインデックスを縮小し、インデックス内のセグメントをマージします。ロールオーバーの開始から 1 時間後に、インデックスはコールドフェーズに入ります。
- コールドフェーズでは、システムはホットノードからウォームノードにインデックスを移行して、ホットデータとコールドデータを分離します。ロールオーバーの開始から 2 時間後に、インデックスは削除されます。
注意事項
- ビジネスモデルに基づいて ILM ポリシーを設定する必要があります。たとえば、構造が異なるインデックスには、異なるエイリアスと ILM ポリシーを設定することをお勧めします。これは、インデックス管理を容易にします。
- ロールオーバー機能を使用する場合、初期インデックスの名前は、-000001 などの自動インクリメントの 6 桁の数字で終わる必要があります。そうでない場合、ILM ポリシーは有効になりません。たとえば、初期インデックスの名前は myindex-000001 です。ロールオーバー中に、myindex-000002 という名前の新しいインデックスが生成されます。インデックスの名前が上記の要件を満たしていない場合は、インデックス内のデータを再インデックスすることをお勧めします。
- ホットフェーズのインデックスの場合、システムはインデックスにデータを書き込みます。データが時系列で書き込まれるようにするには、ウォームフェーズまたはコールドフェーズのインデックスにデータを書き込まないことをお勧めします。たとえば、ウォームフェーズでは、actions を shrink または read only に設定します。こうすることで、インデックスはウォームフェーズに入った後に読み取り専用になります。
手順
- 手順 1: ホットウォームアーキテクチャを使用する Alibaba Cloud Elasticsearch クラスタを作成し、クラスタ内のノードのホットまたはウォーム属性を表示するAlibaba Cloud Elasticsearch クラスタを作成し、クラスタ内のデータノードのホットまたはウォーム属性を指定します。
- 手順 2: インデックスの ILM ポリシーを設定するILM ポリシーを定義し、そのポリシーをインデックステンプレートに適用します。
- 手順 3: データ分散を確認するコールドフェーズのインデックスのシャードがウォームノードに分散されているかどうかを確認します。
- 手順 4: ILM ポリシーを更新するILM ポリシーを更新します。
- 手順 5: ILM ポリシーを切り替えるILM ポリシーを切り替えます。
手順 1: ホットウォームアーキテクチャを使用する Alibaba Cloud Elasticsearch クラスタを作成し、クラスタ内のノードのホットまたはウォーム属性を表示する
ホットウォームアーキテクチャを使用する Elasticsearch クラスタには、ホットノードとウォームノードの両方が含まれています。このアーキテクチャは、Elasticsearch クラスタのパフォーマンスと安定性を向上させます。次の表に、ホットノードとウォームノードの違いを示します。
| ノードタイプ | 保存されるデータのタイプ | 読み取りおよび書き込みパフォーマンス | 仕様 | ディスク |
| ホットノード | 過去 2 日間のログデータなど、最近のデータ。 | 高 | 32 vCPU、64 GiB メモリなど、高 | 標準 SSD を使用することをお勧めします。データ量に基づいてストレージ容量を指定できます。 |
| ウォームノード | 過去 2 日間より前のログデータなど、履歴データ。 | 低 | 8 vCPU、32 GiB メモリなど、低 | ウルトラディスクを使用することをお勧めします。データ量に基づいてストレージ容量を指定できます。 |
- ホットウォームアーキテクチャを使用する Elasticsearch クラスタを作成します。Elasticsearch クラスタを購入する際に、ウォームノードを購入して、ホットウォームアーキテクチャを使用する Elasticsearch クラスタを作成できます。詳細については、「Alibaba Cloud Elasticsearch クラスタを作成する」をご参照ください。ウォームノードを含むクラスタを作成すると、システムはノードの起動パラメータに -Enode.attr.box_type パラメータを追加します。
- ホットノード: -Enode.attr.box_type=hot
- ウォームノード: -Enode.attr.box_type=warm
説明- データノードは、ウォームノードを購入した後にのみホットノードになります。
- このトピックでは、Alibaba Cloud Elasticsearch V6.7.0 クラスタを使用しています。このトピックで説明されているすべての操作と図は、このバージョンのクラスタにのみ適しています。別のバージョンのクラスタを使用する場合は、Elasticsearch コンソールで必要な操作が優先されます。
- クラスタの Kibana コンソールにログオンします。Kibana コンソールの左側のナビゲーションペインで、[dev Tools] をクリックします。Kibana コンソールへのログオン方法の詳細については、「Kibana コンソールにログオンする」をご参照ください。
- 表示されるページの [console] タブで、次のコマンドを実行して、クラスタ内のノードのホットまたはウォーム属性を表示します。
GET _cat/nodeattrs?v&h=host,attr,valueコマンドが正常に実行されると、次の図に示す結果が返されます。この図は、Elasticsearch クラスタに、ホットウォームアーキテクチャをサポートするための 3 つのホットノードと 2 つのウォームノードが含まれていることを示しています。
手順 2: インデックスの ILM ポリシーを設定する
- クラスタの Kibana コンソールで、次のコマンドを実行して ILM ポリシーを定義します。
PUT /_ilm/policy/game-policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "1GB", "max_age": "1d", "max_docs": 1000 } } }, "warm": { "min_age": "30m", "actions": { "forcemerge": { "max_num_segments":1 }, "shrink": { "number_of_shards":1 } } }, "cold": { "min_age": "1h", "actions": { "allocate": { "require": { "box_type": "warm" } } } }, "delete": { "min_age": "2h", "actions": { "delete": {} } } } } }パラメータ 説明 hot ILM ポリシーが適用されているインデックスが次のいずれかの条件を満たすと、ロールオーバーがトリガーされます。インデックス内のデータ量が 1 GB に達する、インデックスが 1 日以上使用されている、インデックス内のドキュメント数が 1,000 を超える。ロールオーバー中に、システムはインデックスを作成し、新しいインデックスに対して ILM ポリシーを有効にします。元のインデックスは、ロールオーバーの 30 分後にウォームフェーズに入ります。 重要 rollover 中に max_docs、max_size、または max_age の値に達すると、Elasticsearch はインデックスをアーカイブします。warm インデックスがウォームフェーズに入ると、システムはそれを 1 つのプライマリシャードのみを持つインデックスに縮小し、インデックス内のセグメントを 1 つのセグメントにマージします。ロールオーバーの開始から 1 時間後に、インデックスはコールドフェーズに入ります。 cold インデックスがコールドフェーズに入ると、システムはホットノードからウォームノードにインデックスを移行します。ロールオーバーの開始から 2 時間後に、インデックスは削除フェーズに入ります。 delete インデックスが削除フェーズに入ると、削除されます。 説明- ILM ポリシーを作成した後、ポリシー名を変更することはできません。
- この手順では、max_age パラメータを最小単位の秒で指定できます。Kibana コンソールを使用して ILM ポリシーを作成する場合は、このパラメータを最小単位の時間でのみ指定できます。
- インデックステンプレートを作成します。settings 設定で、hot 属性を指定します。こうすることで、データは書き込まれた後にホットノードに保存されます。
PUT _template/gamestabes_template { "index_patterns" : ["gamestabes-*"], "settings": { "index.number_of_shards": 5, "index.number_of_replicas": 1, "index.routing.allocation.require.box_type":"hot", "index.lifecycle.name": "game-policy", "index.lifecycle.rollover_alias": "gamestabes" } }パラメータ 説明 index.routing.allocation.require.box_type ロールオーバー中に生成されたインデックスが割り当てられるノードのタイプ。 index.lifecycle.name ILM ポリシーの名前。 index.lifecycle.rollover_alias ロールオーバー中に生成されたインデックスのエイリアス。 - 自動インクリメント番号に基づいてインデックスを作成します。
PUT gamestabes-000001 { "aliases": { "gamestabes":{ "is_write_index": true } } }時間に基づいてインデックスを作成することもできます。詳細については、「日付演算の使用」をご参照ください。
- インデックスエイリアスに基づいてインデックスにデータを書き込みます。システムは、インデックスが ILM ポリシーと一致するかどうかを定期的にチェックします。システムがインデックスが ILM ポリシーと一致することを検出すると、システムはデータを新しいインデックスにロールオーバーします。
PUT gamestabes/_doc/1 { "EU_Sales" : 3.58, "Genre" : "Platform", "Global_Sales" : 40.24, "JP_Sales" : 6.81, "Name" : "Super Mario Bros.", "Other_Sales" : 0.77, "Platform" : "NES", "Publisher" : "Nintendo", "Year_of_Release" : "1985", "na_Sales" : 29.08 }説明 デフォルトでは、システムは 10 分間隔で ILM ポリシーと一致するインデックスをチェックします。indices.lifecycle.poll_interval パラメータを設定して、チェック間隔を変更できます。インデックスのデータがロールオーバーされると、インデックスは次のフェーズに入ります。 - ライフサイクルフェーズに基づいてインデックスをフィルタリングし、詳細なインデックス設定を表示します。
- 左側のナビゲーションペインで、[management] をクリックします。
- [elasticsearch] セクションで、[index Management] をクリックします。
- [index Management] セクションで、ライフサイクルフェーズ[lifecycle Status] の横にある をクリックして、フェーズを選択します。

- インデックス名をクリックして、インデックスの詳細を表示します。

手順 3: データ分散を確認する
- コールドフェーズのインデックスをクエリし、インデックスの設定を表示します。

- コールドフェーズのインデックスのシャードの分散をクエリします。
GET _cat/shards?shrink-gamestables-000012コマンドが正常に実行されると、次の図に示す結果が返されます。この図は、コールドフェーズのインデックスのシャードがウォームノードに分散されていることを示しています。
手順 4: ILM ポリシーを更新する
- 実行中の ILM ポリシーを更新します。

- 更新されたポリシーのバージョンを表示します。
- 左側のナビゲーションペインで、[management] をクリックします。
- [elasticsearch] セクションで、[index Lifecycle Policies] をクリックします。
- [index Lifecycle Policies] セクションで、更新されたポリシーのバージョンを表示します。更新されたポリシーのバージョン番号は、元のポリシーのバージョン番号よりも 1 つ大きくなります。更新されたポリシーは、次のロールオーバーから有効になります。

手順 5: ILM ポリシーを切り替える
- 別の ILM ポリシーを作成します。
PUT /_ilm/policy/game-new { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "3GB", "max_age": "1d", "max_docs": 1000 } } }, "warm": { "min_age": "30m", "actions": { "forcemerge": { "max_num_segments":1 }, "shrink": { "number_of_shards":1 } } }, "cold": { "min_age": "1h", "actions": { "allocate": { "require": { "box_type": "warm" } } } }, "delete": { "min_age": "2h", "actions": { "delete": {} } } } } } - 新しい ILM ポリシーをインデックステンプレートに適用します。
PUT _template/gamestabes_template { "index_patterns" : ["gamestabes-*"], "settings": { "index.number_of_shards": 5, "index.number_of_replicas": 1, "index.routing.allocation.require.box_type":"hot", "index.lifecycle.name": "game-new", "index.lifecycle.rollover_alias": "gamestabes" } }重要- 新しいポリシーは、次のロールオーバーから有効になります。
- 元のポリシーに基づいて作成されたインデックスに新しいポリシーを適用する場合は、
PUT gamestabes-*/_settingsコマンドを実行できます。詳細については、「インデックスのポリシーの切り替え」をご参照ください。
FAQ
Q: ILM ポリシーのチェック間隔をどのように設定しますか?
A: システムは、ILM ポリシーと一致するインデックスを定期的にチェックします。デフォルトの間隔は 10 分です。一致するインデックスが検出されると、システムはインデックスのデータをロールオーバーします。たとえば、最大ドキュメント数ILM ポリシーを作成するときに indices.lifecycle.poll_interval
重要 このパラメーターを適切な値に設定します。小さい値を設定すると、ノードが過負荷になる可能性があります。この例では、このパラメーターは 1m に設定されています。
PUT _cluster/settings
{
"transient": {
// ポール間隔を 1 分に設定します。
"indices.lifecycle.poll_interval":"1m"
}
} を 1000 に設定します。この場合、チェック中にインデックス内のドキュメント数が 1,000 に達したことをシステムが検出すると、システムはインデックスのロールオーバーをトリガーします。 パラメータを設定して、チェック間隔を変更できます。これにより、インデックスのデータがタイムリーにロールオーバーされます。