Elasticsearch バージョン 6.6.0 以降では、インデックスライフサイクル管理 (ILM) 機能が提供されています。ILM は、インデックスのライフサイクルをホット、ウォーム、コールド、削除の 4 つのフェーズに分割します。ILM をホット/ウォームアーキテクチャと組み合わせて使用することで、データの移行を自動化し、ストレージコストを最適化できます。
フェーズ | 説明 |
ホット | ホットフェーズ。インデックスは時系列データのリアルタイム書き込みを処理します。rollover API を使用して、現在のインデックスが指定されたドキュメント数、サイズ、または期間に達したときに新しいインデックスを作成できます。 |
ウォーム | ウォームフェーズ。インデックスへの書き込みは行われなくなりますが、クエリは引き続き可能です。 |
コールド | コールドフェーズ。インデックスは更新されなくなり、クエリの頻度も低くなります。クエリのパフォーマンスは低下します。 |
削除 | 削除フェーズ。インデックスは完全に削除されます。 |
インデックスにライフサイクルポリシーを追加するには、2 つの方法があります。
インデックステンプレートにポリシーを追加する:ポリシーはエイリアスがカバーするすべてのインデックスに適用されます。このトピックでは、この方法を例として使用します。
単一のインデックスにポリシーを追加する:ポリシーは現在のインデックスにのみ適用されます。rollover によって作成された新しいインデックスは影響を受けません。
このトピックでは、ホット/ウォームアーキテクチャのシナリオを例に、次のワークフローを説明します。
インデックスデータは Elasticsearch にリアルタイムで書き込まれます。インデックスが指定されたしきい値に達すると、後続のデータは自動的に新しいインデックスに書き込まれます。
以前のインデックスはホットフェーズに 30 分間留まった後、ウォームフェーズに移行します。
ウォームフェーズでのマージおよびシュリンク操作が完了した後、インデックスは rollover から 1 時間後にコールドフェーズに移行します。
コールドフェーズでは、データはウォームノードに移行されます。インデックスは rollover から 2 時間後に削除されます。
操作手順
ステップ 1: ホット/ウォームクラスターの作成と属性の確認
クラスターを作成する際に、ノードにホットとウォームの属性を設定します。
ILM ポリシーを定義し、エイリアスがカバーするすべてのインデックスに適用します。
コールドフェーズのインデックスのシャードがウォームノードに分散されていることを確認します。
既存のポリシーを更新します。
新しいインデックスに対して異なるポリシーを切り替えます。
ステップ 1: ホット/ウォームクラスターの作成と属性の確認
ホット/ウォームクラスターには、ホット属性とウォーム属性を持つノードが含まれます。ホットノードはリアルタイムの書き込みを処理し、ウォームノードは履歴データを保存します。次の表にその違いを示します。
ノードタイプ | データストレージ | パフォーマンス | 仕様 | ストレージ |
ホットノード (hot) | 最近のデータ (過去 2 日間のログデータなど)。 | 高 | 高スペック (例:32 コア 64 GB)。 | SSD クラウドディスクを推奨します。 |
ウォームノード (warm) | 履歴データ (2 日以上前のログデータなど)。 | 低 | 低スペック (例:8 コア 32 GB)。 | Ultra ディスクを推奨します。または、OpenStore を使用して、大量のコールドデータをサーバーレスで保存することもできます。 |
Alibaba Cloud Elasticsearch では、ウォームノードのbox_typeの値はwarmであり、coldではありません。これは、このノードタイプがネイティブの Elasticsearch アーキテクチャにおけるウォーム層に対応するためです。
Alibaba Cloud Elasticsearch インスタンスを作成する際に、ウォームノードを有効にして、ホット/ウォームクラスターを作成します。
ウォームノードを有効にして購入すると、システムのノード起動設定に
-Enode.attr.box_typeパラメーターが追加されます。ホットノード:
-Enode.attr.box_type=hotウォームノード:
-Enode.attr.box_type=warm
ウォームノードを有効にすると、既存のデータノードは自動的にホットノードとして設定されます。
クラスターの Kibana コンソールにログインします。
左側のナビゲーションウィンドウで、[Dev Tools] をクリックします。
[Console] で、次のコマンドを実行してホットノードとウォームノードの属性を表示します。
GET _cat/nodeattrs?v&h=host,attr,value応答にホットノードとウォームノードの両方が含まれている場合、クラスターはホット/ウォームアーキテクチャをサポートしていることを示します。
ステップ 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
インデックスが 1 GB に達するか、期間が 1 日を超えるか、またはドキュメント数が 1,000 になると、rollover が発生します。その後、以前のインデックスは 30 分待機してからウォームフェーズに移行します。
warm
システムはインデックスを 1 つのシャードにシュリンクし、1 つのセグメントに強制マージします。これらのアクションが完了した後、インデックスは rollover から 1 時間後にコールドフェーズに移行します。
cold
システムはインデックスをホットノードからウォームノードに移行します。その後、インデックスは rollover から 2 時間後に削除フェーズに移行します。
delete
システムはインデックスを完全に削除します。
ポリシー名は作成後に変更できません。Kibana コンソールでもポリシーを作成できますが、Kibana での
max_ageの最小単位は時間であるのに対し、API を使用する場合の最小単位は秒です。インデックステンプレートを作成し、設定で box_type 属性を指定して、新しくインデックスされたデータがホットノードに保存されるようにします。
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
ライフサイクルポリシーの名前を指定します。
index.lifecycle.rollover_alias
rollover エイリアスを指定します。
シーケンス番号付きの初期インデックスを作成します。
PUT gamestabes-000001 { "aliases": { "gamestabes":{ "is_write_index": true } } }時間に基づいてインデックスを作成することもできます。詳細については、「日付計算の使用」をご参照ください。
エイリアスにデータを書き込みます。rollover 条件が満たされ、ILM チェックがトリガーされると、インデックスは rollover します。
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 }デフォルトでは、ILM は 10 分ごとにポリシー基準を満たすインデックスをチェックします。
indices.lifecycle.poll_intervalパラメーターを使用してポーリング間隔を変更できます。(オプション) Kibana でインデックスのライフサイクルステータスを表示します。
左側のナビゲーションウィンドウで、[管理] をクリックします。
[Elasticsearch] エリアで、[インデックス管理] をクリックします。
[ライフサイクルフェーズ] ドロップダウンリストをクリックし、ライフサイクルフェーズを選択してインデックスをフィルタリングします。
フィルタリングされたインデックスの名前をクリックして、その詳細な設定を表示します。
ステップ 3: データ分散の確認
インデックスがコールドフェーズに入った後、そのシャードがウォームノードに分散されていることを確認します。
Kibana コンソールで、コールドフェーズに入ったインデックスの名前を特定します。
次のコマンドを実行して、インデックスのシャード分散をクエリします。
shrink-gamestables-000012を実際のインデックス名に置き換えてください。GET _cat/shards/shrink-gamestables-000012返された結果で、シャードを保持するノードの
box_typeがwarmである場合、コールドフェーズのインデックスデータがウォームノードに分散されたことを示します。
ステップ 4: ILM ポリシーの更新
次のコマンドを実行して、既存の ILM ポリシーを更新します。次の例では、
game-policyの削除フェーズのmin_ageを変更します。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": "3h", "actions": { "delete": {} } } } } }更新されたポリシーのバージョンを表示します。
左側のナビゲーションウィンドウで、[管理] をクリックします。
「Elasticsearch」エリアで、[Index Lifecycle Policies] をクリックします。
ポリシーのバージョン番号を表示します。更新後、バージョン番号は 1 ずつ増加します。現在の書き込みインデックスは古いバージョンのポリシーを引き続き使用します。新しいポリシーは、次の rollover 時に有効になります。
ステップ 5: 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": {} } } } } }新しいポリシーをテンプレートにバインドします。
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" } }
よくある質問
ILM のチェック間隔を調整するにはどうすればよいですか?
デフォルトでは、ILM は 10 分ごとにポリシー基準を満たすインデックスをチェックします。この間隔中に、インデックスが指定されたしきい値を超えて増加する可能性があります。たとえば、max_docs を 1,000 に設定した場合、実際のドキュメント数が 1,000 を超えた後に rollover がトリガーされることがあります。
indices.lifecycle.poll_interval パラメーターを変更することで、ポーリング間隔を制御できます。
チェック間隔を短く設定しすぎると (高頻度)、ノードの負荷が増加する可能性があります。ビジネス要件に基づいて、このパラメーターを慎重に設定してください。
PUT _cluster/settings
{
"transient": {
"indices.lifecycle.poll_interval":"1m"
}
}