ライフサイクルポリシーの設定
ILMがインデックスを管理するためには、index.lifecycle.name
インデックス設定に有効なポリシーを指定する必要があります。
ロールインデックスのライフサイクルポリシーを設定するには、ポリシーを作成し、それをインデックステンプレートに追加します。
ロールオーバーしないインデックスを管理するためにポリシーを使用するには、インデックスを作成する際にライフサイクルポリシーを指定するか、既存のインデックスに直接ポリシーを適用できます。
ILMポリシーはグローバルクラスター状態に保存され、スナップショットを取得する際にinclude_global_state
をtrue
に設定することでスナップショットに含めることができます。スナップショットを取得するときに、スナップショットが復元されると、グローバル状態のすべてのポリシーが復元され、同じ名前のローカルポリシーは上書きされます。
BeatsまたはLogstash Elasticsearch出力プラグインのインデックスライフサイクル管理を有効にすると、必要なポリシーと設定変更が自動的に適用されます。デフォルトのポリシーを変更することはできますが、ポリシーを明示的に設定したり、初期インデックスをブートストラップしたりする必要はありません。
ライフサイクルポリシーの作成
Kibanaからライフサイクルポリシーを作成するには、メニューを開き、Stack
Management > Index Lifecycle Policiesに移動します。Create policyをクリックします。
ポリシーのライフサイクルフェーズと各フェーズで実行するアクションを指定します。
ポリシーの作成または更新APIが呼び出され、ポリシーがElasticsearchクラスターに追加されます。
APIの例
Python
resp = client.ilm.put_lifecycle(
name="my_policy",
policy={
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "25GB"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
},
)
print(resp)
Ruby
response = client.ilm.put_lifecycle(
policy: 'my_policy',
body: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: '25GB'
}
}
},
delete: {
min_age: '30d',
actions: {
delete: {}
}
}
}
}
}
)
puts response
Js
const response = await client.ilm.putLifecycle({
name: "my_policy",
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: "25GB",
},
},
},
delete: {
min_age: "30d",
actions: {
delete: {},
},
},
},
},
});
console.log(response);
コンソール
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "25GB"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
インデックスが25GBに達したときにロールオーバーします | |
ロールオーバーから30日後にインデックスを削除します |
ロールオーバーアクションは、1つ以上のシャードが200000000以上のドキュメントを含む場合、データストリームまたはエイリアスを常に暗黙的にロールオーバーします。通常、シャードは200Mドキュメントに達する前に25GBに達しますが、これはスペース効率の良いデータセットには当てはまりません。シャードが200Mドキュメントを超えると、検索パフォーマンスが著しく低下する可能性があります。これが組み込み制限の理由です。
インデックステンプレートでライフサイクルポリシーを適用
ロールオーバーアクションをトリガーするポリシーを使用するには、各新しいインデックスを作成するために使用されるインデックステンプレートでポリシーを設定する必要があります。ポリシーの名前とロールインデックスを参照するために使用されるエイリアスを指定します。
Kibanaのテンプレート作成ウィザードを使用してテンプレートを作成できます。ウィザードにアクセスするには、メニューを開き、**Stack Management > Index Management**に移動します。**Index Templates**タブで、**Create template**をクリックします。
![テンプレート作成ページ](https://cdn.hedaai.com/projects/elasticsearch-8-15/a77f71e54e27ca6f3f37f1153e2fb19a.png_big1500.jpeg)
ウィザードは、[インデックステンプレートの作成または更新API](/read/elasticsearch-8-15/fda62cc47238f266.md)を呼び出して、クラスターにテンプレートを追加します。
APIの例
#### Python
``````python
resp = client.indices.put_index_template(
name="my_template",
index_patterns=[
"test-*"
],
template={
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_policy",
"index.lifecycle.rollover_alias": "test-alias"
}
},
)
print(resp)
`
Ruby
response = client.indices.put_index_template(
name: 'my_template',
body: {
index_patterns: [
'test-*'
],
template: {
settings: {
number_of_shards: 1,
number_of_replicas: 1,
'index.lifecycle.name' => 'my_policy',
'index.lifecycle.rollover_alias' => 'test-alias'
}
}
}
)
puts response
Js
const response = await client.indices.putIndexTemplate({
name: "my_template",
index_patterns: ["test-*"],
template: {
settings: {
number_of_shards: 1,
number_of_replicas: 1,
"index.lifecycle.name": "my_policy",
"index.lifecycle.rollover_alias": "test-alias",
},
},
});
console.log(response);
コンソール
PUT _index_template/my_template
{
"index_patterns": ["test-*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_policy",
"index.lifecycle.rollover_alias": "test-alias"
}
}
}
test- で始まるすべての新しいインデックスにこのテンプレートを使用します |
|
このテンプレートで作成された新しいインデックスにmy_policy を適用します |
|
my_policy によって管理されるインデックスを参照するためのインデックスエイリアスを定義します |
初期管理インデックスの作成
独自のロールインデックスのポリシーを設定する場合、推奨されるデータストリームを使用していない場合は、ポリシーによって管理される最初のインデックスを手動で作成し、それを書き込みインデックスとして指定する必要があります。
BeatsまたはLogstash Elasticsearch出力プラグインのインデックスライフサイクル管理を有効にすると、必要なポリシーと設定変更が自動的に適用されます。デフォルトのポリシーを変更することはできますが、ポリシーを明示的に設定したり、初期インデックスをブートストラップしたりする必要はありません。
インデックスの名前は、インデックステンプレートで定義されたパターンと一致し、数字で終わる必要があります。この数字は、ロールオーバーアクションによって作成されたインデックスの名前を生成するためにインクリメントされます。
たとえば、次のリクエストはtest-00001
インデックスを作成します。これはmy_template
で指定されたインデックスパターンに一致するため、Elasticsearchは自動的にそのテンプレートから設定を適用します。
Python
resp = client.indices.create(
index="test-000001",
aliases={
"test-alias": {
"is_write_index": True
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'test-000001',
body: {
aliases: {
"test-alias": {
is_write_index: true
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "test-000001",
aliases: {
"test-alias": {
is_write_index: true,
},
},
});
console.log(response);
コンソール
PUT test-000001
{
"aliases": {
"test-alias":{
"is_write_index": true
}
}
}
この初期インデックスをこのエイリアスの書き込みインデックスとして設定します。 |
これで、ライフサイクルポリシーで指定されたロールオーバーエイリアスにデータをインデックスすることができます。サンプルmy_policy
ポリシーでは、初期インデックスが25GBを超えるとロールオーバーアクションがトリガーされます。ILMは新しいインデックスを作成し、それがtest-alias
の書き込みインデックスになります。
ライフサイクルポリシーを手動で適用
インデックスを作成する際にポリシーを指定するか、Kibana Managementまたは設定更新APIを通じて既存のインデックスにポリシーを適用できます。ポリシーを適用すると、ILMはすぐにインデックスの管理を開始します。
ロールオーバーアクションを使用するポリシーを手動で適用しないでください。ロールオーバーを使用するポリシーは、インデックステンプレートによって適用される必要があります。そうしないと、ロールオーバーアクションが新しいインデックスを作成する際にポリシーが引き継がれません。
APIの例
#### Python
``````python
resp = client.indices.create(
index="test-index",
settings={
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_policy"
},
)
print(resp)
`
Ruby
response = client.indices.create(
index: 'test-index',
body: {
settings: {
number_of_shards: 1,
number_of_replicas: 1,
'index.lifecycle.name' => 'my_policy'
}
}
)
puts response
Js
const response = await client.indices.create({
index: "test-index",
settings: {
number_of_shards: 1,
number_of_replicas: 1,
"index.lifecycle.name": "my_policy",
},
});
console.log(response);
コンソール
PUT test-index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "my_policy"
}
}
インデックスのライフサイクルポリシーを設定します。 |
複数のインデックスにポリシーを適用
インデックス名にワイルドカードを使用して、設定更新APIを呼び出すと、同じポリシーを複数のインデックスに適用できます。
意図しないインデックスに一致しないように注意してください。
Python
resp = client.indices.put_settings(
index="mylogs-pre-ilm*",
settings={
"index": {
"lifecycle": {
"name": "mylogs_policy_existing"
}
}
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'mylogs-pre-ilm*',
body: {
index: {
lifecycle: {
name: 'mylogs_policy_existing'
}
}
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "mylogs-pre-ilm*",
settings: {
index: {
lifecycle: {
name: "mylogs_policy_existing",
},
},
},
});
console.log(response);
コンソール
PUT mylogs-pre-ilm*/_settings
{
"index": {
"lifecycle": {
"name": "mylogs_policy_existing"
}
}
}
mylogs-pre-ilm で始まるすべてのインデックスを更新します |
ライフサイクルポリシーの切り替え
インデックスのライフサイクルポリシーを切り替えるには、次の手順に従います:
- 1. ポリシー削除APIを使用して既存のポリシーを削除します。データストリームまたはエイリアスをターゲットにして、そのすべてのインデックスのポリシーを削除します。
Python
resp = client.ilm.remove_policy(
index="logs-my_app-default",
)
print(resp)
Ruby
response = client.ilm.remove_policy(
index: 'logs-my_app-default'
)
puts response
Js
const response = await client.ilm.removePolicy({
index: "logs-my_app-default",
});
console.log(response);
コンソール
POST logs-my_app-default/_ilm/remove
- 2. ポリシー削除APIは、インデックスからすべてのILMメタデータを削除し、インデックスのライフサイクルステータスを考慮しません。これにより、インデックスが望ましくない状態になる可能性があります。
たとえば、forcemerge
アクションは、一時的にインデックスを閉じてから再オープンします。forcemerge
中にインデックスのILMポリシーを削除すると、インデックスが無期限に閉じたままになる可能性があります。
ポリシー削除後、インデックス取得APIを使用してインデックスの状態を確認します。データストリームまたはエイリアスをターゲットにして、そのすべてのインデックスの状態を取得します。
Python
resp = client.indices.get(
index="logs-my_app-default",
)
print(resp)
Ruby
response = client.indices.get(
index: 'logs-my_app-default'
)
puts response
Js
const response = await client.indices.get({
index: "logs-my_app-default",
});
console.log(response);
コンソール
GET logs-my_app-default
インデックスを必要に応じて変更できます。たとえば、インデックスオープンAPIを使用して、閉じたインデックスを再オープンできます。
Python
resp = client.indices.open(
index="logs-my_app-default",
)
print(resp)
Ruby
response = client.indices.open(
index: 'logs-my_app-default'
)
puts response
Js
const response = await client.indices.open({
index: "logs-my_app-default",
});
console.log(response);
コンソール
POST logs-my_app-default/_open
- 3. 設定更新APIを使用して新しいポリシーを割り当てます。データストリームまたはエイリアスをターゲットにして、そのすべてのインデックスにポリシーを割り当てます。
既存のポリシーを削除せずに新しいポリシーを割り当てないでください。これにより、フェーズ実行が静かに失敗する可能性があります。
Python
resp = client.indices.put_settings(
index="logs-my_app-default",
settings={
"index": {
"lifecycle": {
"name": "new-lifecycle-policy"
}
}
},
)
print(resp)
Ruby
response = client.indices.put_settings(
index: 'logs-my_app-default',
body: {
index: {
lifecycle: {
name: 'new-lifecycle-policy'
}
}
}
)
puts response
Js
const response = await client.indices.putSettings({
index: "logs-my_app-default",
settings: {
index: {
lifecycle: {
name: "new-lifecycle-policy",
},
},
},
});
console.log(response);
コンソール
PUT logs-my_app-default/_settings
{
"index": {
"lifecycle": {
"name": "new-lifecycle-policy"
}
}
}