チュートリアル: ILM 管理データストリームをデータストリームライフサイクルに移行する
このチュートリアルでは、既存のデータストリームを インデックスライフサイクル管理 (ILM) から データストリームライフサイクル に移行する方法を見ていきます。既存の ILM 管理のバックインデックスは、ILM によって管理され続け、ILM によって削除されるまで保持されます。ただし、新しいバックインデックスはデータストリームライフサイクルによって管理されます。このようにして、データストリームは ILM による管理からデータストリームライフサイクルによる管理へと徐々に移行します。ILM とデータストリームライフサイクルはデータストリームを共同管理できますが、インデックスは一度に一つのシステムによってのみ管理されることに注意してください。
要約
ILM からデータストリームライフサイクルにデータストリームを移行するには、2つのステップを実行する必要があります:
- 1. データストリームを支えるインデックステンプレートを更新し、prefer_ilm を
false
に設定し、データストリームライフサイクルを構成します。 - 2. ライフサイクル API を使用して、既存のデータストリームのデータストリームライフサイクルを構成します。
詳細については、データストリームライフサイクルへの移行 セクションを参照してください。
ILM 管理データストリームのセットアップ
まず、ILM によって管理される2つのバックインデックスを持つデータストリームを作成します。最初に ILM ポリシーを作成します:
Python
resp = client.ilm.put_lifecycle(
name="pre-dsl-ilm-policy",
policy={
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50gb"
}
}
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {}
}
}
}
},
)
print(resp)
Ruby
response = client.ilm.put_lifecycle(
policy: 'pre-dsl-ilm-policy',
body: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: '50gb'
}
}
},
delete: {
min_age: '7d',
actions: {
delete: {}
}
}
}
}
}
)
puts response
Js
const response = await client.ilm.putLifecycle({
name: "pre-dsl-ilm-policy",
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: "50gb",
},
},
},
delete: {
min_age: "7d",
actions: {
delete: {},
},
},
},
},
});
console.log(response);
コンソール
PUT _ilm/policy/pre-dsl-ilm-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50gb"
}
}
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {}
}
}
}
}
}
データストリームを支えるインデックステンプレートを作成し、ILM を構成しましょう:
Python
resp = client.indices.put_index_template(
name="dsl-data-stream-template",
index_patterns=[
"dsl-data-stream*"
],
data_stream={},
priority=500,
template={
"settings": {
"index.lifecycle.name": "pre-dsl-ilm-policy"
}
},
)
print(resp)
Ruby
response = client.indices.put_index_template(
name: 'dsl-data-stream-template',
body: {
index_patterns: [
'dsl-data-stream*'
],
data_stream: {},
priority: 500,
template: {
settings: {
'index.lifecycle.name' => 'pre-dsl-ilm-policy'
}
}
}
)
puts response
Js
const response = await client.indices.putIndexTemplate({
name: "dsl-data-stream-template",
index_patterns: ["dsl-data-stream*"],
data_stream: {},
priority: 500,
template: {
settings: {
"index.lifecycle.name": "pre-dsl-ilm-policy",
},
},
});
console.log(response);
コンソール
PUT _index_template/dsl-data-stream-template
{
"index_patterns": ["dsl-data-stream*"],
"data_stream": { },
"priority": 500,
"template": {
"settings": {
"index.lifecycle.name": "pre-dsl-ilm-policy"
}
}
}
dsl-data-stream
をターゲットにしたドキュメントをインデックスし、データストリームを作成し、データストリームを手動でロールオーバーして別の世代インデックスを作成します:
Python
resp = client.index(
index="dsl-data-stream",
document={
"@timestamp": "2023-10-18T16:21:15.000Z",
"message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
},
)
print(resp)
Ruby
response = client.index(
index: 'dsl-data-stream',
body: {
"@timestamp": '2023-10-18T16:21:15.000Z',
message: '192.0.2.42 - - [06/May/2099:16:21:15 +0000] "GET /images/bg.jpg HTTP/1.0" 200 24736'
}
)
puts response
Js
const response = await client.index({
index: "dsl-data-stream",
document: {
"@timestamp": "2023-10-18T16:21:15.000Z",
message:
'192.0.2.42 - - [06/May/2099:16:21:15 +0000] "GET /images/bg.jpg HTTP/1.0" 200 24736',
},
});
console.log(response);
コンソール
POST dsl-data-stream/_doc?
{
"@timestamp": "2023-10-18T16:21:15.000Z",
"message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
}
Python
resp = client.indices.rollover(
alias="dsl-data-stream",
)
print(resp)
Ruby
response = client.indices.rollover(
alias: 'dsl-data-stream'
)
puts response
Js
const response = await client.indices.rollover({
alias: "dsl-data-stream",
});
console.log(response);
コンソール
POST dsl-data-stream/_rollover
GET _data_stream API を使用してデータストリームの状態を確認します:
Python
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp)
Ruby
response = client.indices.get_data_stream(
name: 'dsl-data-stream'
)
puts response
Js
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response);
コンソール
GET _data_stream/dsl-data-stream
レスポンスを確認すると、両方のバックインデックスが ILM によって管理されており、次の世代インデックスも ILM によって管理されることがわかります:
コンソール-結果
{
"data_streams": [
{
"name": "dsl-data-stream",
"timestamp_field": {
"name": "@timestamp"
},
"indices": [
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000001",
"index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
},
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000002",
"index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
}
],
"generation": 2,
"status": "GREEN",
"template": "dsl-data-stream-template",
"next_generation_managed_by": "Index Lifecycle Management",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"hidden": false,
"system": false,
"allow_custom_routing": false,
"replicated": false,
"rollover_on_write": false
}
]
}
バックインデックスの名前。 | |
各バックインデックスについて、prefer_ilm の値を表示します。これは、両方のシステムがインデックスに対して構成されている場合、ILM がデータストリームライフサイクルよりも優先されるかどうかを示します。 | |
このインデックスに対して構成された ILM ポリシー。 | |
このインデックスを管理するシステム (可能な値は「インデックスライフサイクル管理」、「データストリームライフサイクル」、または「未管理」) | |
次の世代インデックスを管理するシステム (データストリームがロールオーバーされた後の新しい書き込みインデックス)。可能な値は「インデックスライフサイクル管理」、「データストリームライフサイクル」、または「未管理」です。 | |
データストリームを支えるインデックステンプレートに構成された prefer_ilm の値。この値はすべての新しいバックインデックスに構成されます。インデックステンプレートに構成されていない場合、バックインデックスは true のデフォルト値を受け取ります (ILM はデフォルトでデータストリームライフサイクルよりも優先されます)。 |
|
このデータストリームを支えるインデックステンプレートに構成された ILM ポリシー (インデックステンプレートに存在する限り、すべての新しいバックインデックスに構成されます)。 |
データストリームをデータストリームライフサイクルに移行する
dsl-data-stream
をデータストリームライフサイクルに移行するには、2つのステップを実行する必要があります:
- 1. データストリームを支えるインデックステンプレートを更新し、prefer_ilm を
false
に設定し、データストリームライフサイクルを構成します。 - 2. 既存の
dsl-data-stream
のデータストリームライフサイクルを ライフサイクル API を使用して構成します。
インデックステンプレートに追加されたデータストリームライフサイクル構成は、データストリーム構成であるため、新しいデータストリームにのみ適用されます。私たちのデータストリームはすでに存在しているため、インデックステンプレートにデータストリームライフサイクル構成を追加しても dsl-data-stream
には適用されません。
Python
resp = client.indices.put_index_template(
name="dsl-data-stream-template",
index_patterns=[
"dsl-data-stream*"
],
data_stream={},
priority=500,
template={
"settings": {
"index.lifecycle.name": "pre-dsl-ilm-policy",
"index.lifecycle.prefer_ilm": False
},
"lifecycle": {
"data_retention": "7d"
}
},
)
print(resp)
Ruby
response = client.indices.put_index_template(
name: 'dsl-data-stream-template',
body: {
index_patterns: [
'dsl-data-stream*'
],
data_stream: {},
priority: 500,
template: {
settings: {
'index.lifecycle.name' => 'pre-dsl-ilm-policy',
'index.lifecycle.prefer_ilm' => false
},
lifecycle: {
data_retention: '7d'
}
}
}
)
puts response
Js
const response = await client.indices.putIndexTemplate({
name: "dsl-data-stream-template",
index_patterns: ["dsl-data-stream*"],
data_stream: {},
priority: 500,
template: {
settings: {
"index.lifecycle.name": "pre-dsl-ilm-policy",
"index.lifecycle.prefer_ilm": false,
},
lifecycle: {
data_retention: "7d",
},
},
});
console.log(response);
コンソール
PUT _index_template/dsl-data-stream-template
{
"index_patterns": ["dsl-data-stream*"],
"data_stream": { },
"priority": 500,
"template": {
"settings": {
"index.lifecycle.name": "pre-dsl-ilm-policy",
"index.lifecycle.prefer_ilm": false
},
"lifecycle": {
"data_retention": "7d"
}
}
}
prefer_ilm 設定は、新しいバックインデックス (データストリームをロールオーバーして作成された) に構成され、ILM がデータストリームライフサイクルよりも優先されないようにします。 |
|
データストリームライフサイクルを構成しているため、新しい データストリームはデータストリームライフサイクルによって管理されます。 |
これで、新しいデータストリームがデータストリームライフサイクルによって管理されることが確実になりました。
既存の dsl-data-stream
を更新し、データストリームライフサイクルを構成しましょう:
Python
resp = client.indices.put_data_lifecycle(
name="dsl-data-stream",
data_retention="7d",
)
print(resp)
Ruby
response = client.indices.put_data_lifecycle(
name: 'dsl-data-stream',
body: {
data_retention: '7d'
}
)
puts response
Js
const response = await client.indices.putDataLifecycle({
name: "dsl-data-stream",
data_retention: "7d",
});
console.log(response);
コンソール
PUT _data_stream/dsl-data-stream/_lifecycle
{
"data_retention": "7d"
}
データストリームを確認して、次の世代が本当にデータストリームライフサイクルによって管理されるかどうかを確認できます:
Python
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp)
Ruby
response = client.indices.get_data_stream(
name: 'dsl-data-stream'
)
puts response
Js
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response);
コンソール
GET _data_stream/dsl-data-stream
コンソール-結果
{
"data_streams": [
{
"name": "dsl-data-stream",
"timestamp_field": {
"name": "@timestamp"
},
"indices": [
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000001",
"index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
},
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000002",
"index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
}
],
"generation": 2,
"status": "GREEN",
"template": "dsl-data-stream-template",
"lifecycle": {
"enabled": true,
"data_retention": "7d"
},
"ilm_policy": "pre-dsl-ilm-policy",
"next_generation_managed_by": "Data stream lifecycle",
"prefer_ilm": false,
"hidden": false,
"system": false,
"allow_custom_routing": false,
"replicated": false,
"rollover_on_write": false
}
]
}
既存のバックインデックスは引き続き ILM によって管理されます | |
既存のバックインデックスは引き続き ILM によって管理されます | |
次の世代インデックスはデータストリームライフサイクルによって管理されます | |
インデックステンプレートに構成された prefer_ilm 設定値が反映され、新しいバックインデックスに対して適切に構成されます。 |
データストリームをロールオーバーして、データストリームライフサイクルによって管理される新しい世代インデックスを確認しましょう:
Python
resp = client.indices.rollover(
alias="dsl-data-stream",
)
print(resp)
Ruby
response = client.indices.rollover(
alias: 'dsl-data-stream'
)
puts response
Js
const response = await client.indices.rollover({
alias: "dsl-data-stream",
});
console.log(response);
コンソール
POST dsl-data-stream/_rollover
Python
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp)
Ruby
response = client.indices.get_data_stream(
name: 'dsl-data-stream'
)
puts response
Js
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response);
コンソール
GET _data_stream/dsl-data-stream
コンソール-結果
{
"data_streams": [
{
"name": "dsl-data-stream",
"timestamp_field": {
"name": "@timestamp"
},
"indices": [
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000001",
"index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
},
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000002",
"index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
},
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000003",
"index_uuid": "PA_JquKGSiKcAKBA8abcd1",
"prefer_ilm": false,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Data stream lifecycle"
}
],
"generation": 3,
"status": "GREEN",
"template": "dsl-data-stream-template",
"lifecycle": {
"enabled": true,
"data_retention": "7d"
},
"ilm_policy": "pre-dsl-ilm-policy",
"next_generation_managed_by": "Data stream lifecycle",
"prefer_ilm": false,
"hidden": false,
"system": false,
"allow_custom_routing": false,
"replicated": false,
"rollover_on_write": false
}
]
}
ロールオーバー前に存在したバックインデックスは引き続き ILM によって管理されます | |
ロールオーバー前に存在したバックインデックスは引き続き ILM によって管理されます | |
新しい書き込みインデックスは、インデックステンプレートで構成した false 値を受け取り、prefer_ilm 設定に従って構成されます。 |
|
新しい書き込みインデックスは Data stream lifecycle によって管理されます |
データストリームを ILM に戻す
このデータストリームを ILM に管理させるのは簡単です。なぜなら、インデックステンプレートを更新したとき に ILM ポリシーを削除しなかったからです。
これを実現する方法は2つあります:
- 1. データストリームから ライフサイクルを削除する
- 2.
enabled
フラグをfalse
に設定してデータストリームライフサイクルを無効にする。
オプション2を実装し、データストリームライフサイクルを無効にしましょう:
Python
resp = client.indices.put_data_lifecycle(
name="dsl-data-stream",
data_retention="7d",
enabled=False,
)
print(resp)
Ruby
response = client.indices.put_data_lifecycle(
name: 'dsl-data-stream',
body: {
data_retention: '7d',
enabled: false
}
)
puts response
Js
const response = await client.indices.putDataLifecycle({
name: "dsl-data-stream",
data_retention: "7d",
enabled: false,
});
console.log(response);
コンソール
PUT _data_stream/dsl-data-stream/_lifecycle
{
"data_retention": "7d",
"enabled": false
}
enabled フラグは省略可能で、デフォルトは true ですが、ここでは明示的に false に設定します。データストリームの状態を確認しましょう: |
Python
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp)
Ruby
response = client.indices.get_data_stream(
name: 'dsl-data-stream'
)
puts response
Js
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response);
コンソール
GET _data_stream/dsl-data-stream
コンソール-結果
{
"data_streams": [
{
"name": "dsl-data-stream",
"timestamp_field": {
"name": "@timestamp"
},
"indices": [
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000001",
"index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
},
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000002",
"index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
"prefer_ilm": true,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
},
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000003",
"index_uuid": "PA_JquKGSiKcAKBA8abcd1",
"prefer_ilm": false,
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Index Lifecycle Management"
}
],
"generation": 3,
"status": "GREEN",
"template": "dsl-data-stream-template",
"lifecycle": {
"enabled": false,
"data_retention": "7d"
},
"ilm_policy": "pre-dsl-ilm-policy",
"next_generation_managed_by": "Index Lifecycle Management",
"prefer_ilm": false,
"hidden": false,
"system": false,
"allow_custom_routing": false,
"replicated": false,
"rollover_on_write": false
}
]
}
書き込みインデックスは現在 ILM によって管理されています | |
データストリームに構成された lifecycle は現在無効になっています。 |
|
次の書き込みインデックスは ILM によって管理されます |
インデックステンプレートを 更新 したときに ILM ポリシーを削除していた場合、データストリームの書き込みインデックスは現在 Unmanaged
になります。なぜなら、インデックスにはフォールバックするための ILM ポリシーが構成されていなかったからです。