チュートリアル: ILM 管理データストリームをデータストリームライフサイクルに移行する

このチュートリアルでは、既存のデータストリームを インデックスライフサイクル管理 (ILM) から データストリームライフサイクル に移行する方法を見ていきます。既存の ILM 管理のバックインデックスは、ILM によって管理され続け、ILM によって削除されるまで保持されます。ただし、新しいバックインデックスはデータストリームライフサイクルによって管理されます。このようにして、データストリームは ILM による管理からデータストリームライフサイクルによる管理へと徐々に移行します。ILM とデータストリームライフサイクルはデータストリームを共同管理できますが、インデックスは一度に一つのシステムによってのみ管理されることに注意してください。

要約

ILM からデータストリームライフサイクルにデータストリームを移行するには、2つのステップを実行する必要があります:

  • 1. データストリームを支えるインデックステンプレートを更新し、prefer_ilmfalse に設定し、データストリームライフサイクルを構成します。
  • 2. ライフサイクル API を使用して、既存のデータストリームのデータストリームライフサイクルを構成します。

詳細については、データストリームライフサイクルへの移行 セクションを参照してください。

ILM 管理データストリームのセットアップ

まず、ILM によって管理される2つのバックインデックスを持つデータストリームを作成します。最初に ILM ポリシーを作成します:

Python

  1. resp = client.ilm.put_lifecycle(
  2. name="pre-dsl-ilm-policy",
  3. policy={
  4. "phases": {
  5. "hot": {
  6. "actions": {
  7. "rollover": {
  8. "max_primary_shard_size": "50gb"
  9. }
  10. }
  11. },
  12. "delete": {
  13. "min_age": "7d",
  14. "actions": {
  15. "delete": {}
  16. }
  17. }
  18. }
  19. },
  20. )
  21. print(resp)

Ruby

  1. response = client.ilm.put_lifecycle(
  2. policy: 'pre-dsl-ilm-policy',
  3. body: {
  4. policy: {
  5. phases: {
  6. hot: {
  7. actions: {
  8. rollover: {
  9. max_primary_shard_size: '50gb'
  10. }
  11. }
  12. },
  13. delete: {
  14. min_age: '7d',
  15. actions: {
  16. delete: {}
  17. }
  18. }
  19. }
  20. }
  21. }
  22. )
  23. puts response

Js

  1. const response = await client.ilm.putLifecycle({
  2. name: "pre-dsl-ilm-policy",
  3. policy: {
  4. phases: {
  5. hot: {
  6. actions: {
  7. rollover: {
  8. max_primary_shard_size: "50gb",
  9. },
  10. },
  11. },
  12. delete: {
  13. min_age: "7d",
  14. actions: {
  15. delete: {},
  16. },
  17. },
  18. },
  19. },
  20. });
  21. console.log(response);

コンソール

  1. PUT _ilm/policy/pre-dsl-ilm-policy
  2. {
  3. "policy": {
  4. "phases": {
  5. "hot": {
  6. "actions": {
  7. "rollover": {
  8. "max_primary_shard_size": "50gb"
  9. }
  10. }
  11. },
  12. "delete": {
  13. "min_age": "7d",
  14. "actions": {
  15. "delete": {}
  16. }
  17. }
  18. }
  19. }
  20. }

データストリームを支えるインデックステンプレートを作成し、ILM を構成しましょう:

Python

  1. resp = client.indices.put_index_template(
  2. name="dsl-data-stream-template",
  3. index_patterns=[
  4. "dsl-data-stream*"
  5. ],
  6. data_stream={},
  7. priority=500,
  8. template={
  9. "settings": {
  10. "index.lifecycle.name": "pre-dsl-ilm-policy"
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.indices.put_index_template(
  2. name: 'dsl-data-stream-template',
  3. body: {
  4. index_patterns: [
  5. 'dsl-data-stream*'
  6. ],
  7. data_stream: {},
  8. priority: 500,
  9. template: {
  10. settings: {
  11. 'index.lifecycle.name' => 'pre-dsl-ilm-policy'
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.indices.putIndexTemplate({
  2. name: "dsl-data-stream-template",
  3. index_patterns: ["dsl-data-stream*"],
  4. data_stream: {},
  5. priority: 500,
  6. template: {
  7. settings: {
  8. "index.lifecycle.name": "pre-dsl-ilm-policy",
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. PUT _index_template/dsl-data-stream-template
  2. {
  3. "index_patterns": ["dsl-data-stream*"],
  4. "data_stream": { },
  5. "priority": 500,
  6. "template": {
  7. "settings": {
  8. "index.lifecycle.name": "pre-dsl-ilm-policy"
  9. }
  10. }
  11. }

dsl-data-stream をターゲットにしたドキュメントをインデックスし、データストリームを作成し、データストリームを手動でロールオーバーして別の世代インデックスを作成します:

Python

  1. resp = client.index(
  2. index="dsl-data-stream",
  3. document={
  4. "@timestamp": "2023-10-18T16:21:15.000Z",
  5. "message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
  6. },
  7. )
  8. print(resp)

Ruby

  1. response = client.index(
  2. index: 'dsl-data-stream',
  3. body: {
  4. "@timestamp": '2023-10-18T16:21:15.000Z',
  5. message: '192.0.2.42 - - [06/May/2099:16:21:15 +0000] "GET /images/bg.jpg HTTP/1.0" 200 24736'
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.index({
  2. index: "dsl-data-stream",
  3. document: {
  4. "@timestamp": "2023-10-18T16:21:15.000Z",
  5. message:
  6. '192.0.2.42 - - [06/May/2099:16:21:15 +0000] "GET /images/bg.jpg HTTP/1.0" 200 24736',
  7. },
  8. });
  9. console.log(response);

コンソール

  1. POST dsl-data-stream/_doc?
  2. {
  3. "@timestamp": "2023-10-18T16:21:15.000Z",
  4. "message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
  5. }

Python

  1. resp = client.indices.rollover(
  2. alias="dsl-data-stream",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.rollover(
  2. alias: 'dsl-data-stream'
  3. )
  4. puts response

Js

  1. const response = await client.indices.rollover({
  2. alias: "dsl-data-stream",
  3. });
  4. console.log(response);

コンソール

  1. POST dsl-data-stream/_rollover

GET _data_stream API を使用してデータストリームの状態を確認します:

Python

  1. resp = client.indices.get_data_stream(
  2. name="dsl-data-stream",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.get_data_stream(
  2. name: 'dsl-data-stream'
  3. )
  4. puts response

Js

  1. const response = await client.indices.getDataStream({
  2. name: "dsl-data-stream",
  3. });
  4. console.log(response);

コンソール

  1. GET _data_stream/dsl-data-stream

レスポンスを確認すると、両方のバックインデックスが ILM によって管理されており、次の世代インデックスも ILM によって管理されることがわかります:

コンソール-結果

  1. {
  2. "data_streams": [
  3. {
  4. "name": "dsl-data-stream",
  5. "timestamp_field": {
  6. "name": "@timestamp"
  7. },
  8. "indices": [
  9. {
  10. "index_name": ".ds-dsl-data-stream-2023.10.19-000001",
  11. "index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
  12. "prefer_ilm": true,
  13. "ilm_policy": "pre-dsl-ilm-policy",
  14. "managed_by": "Index Lifecycle Management"
  15. },
  16. {
  17. "index_name": ".ds-dsl-data-stream-2023.10.19-000002",
  18. "index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
  19. "prefer_ilm": true,
  20. "ilm_policy": "pre-dsl-ilm-policy",
  21. "managed_by": "Index Lifecycle Management"
  22. }
  23. ],
  24. "generation": 2,
  25. "status": "GREEN",
  26. "template": "dsl-data-stream-template",
  27. "next_generation_managed_by": "Index Lifecycle Management",
  28. "prefer_ilm": true,
  29. "ilm_policy": "pre-dsl-ilm-policy",
  30. "hidden": false,
  31. "system": false,
  32. "allow_custom_routing": false,
  33. "replicated": false,
  34. "rollover_on_write": false
  35. }
  36. ]
  37. }
バックインデックスの名前。
各バックインデックスについて、prefer_ilm の値を表示します。これは、両方のシステムがインデックスに対して構成されている場合、ILM がデータストリームライフサイクルよりも優先されるかどうかを示します。
このインデックスに対して構成された ILM ポリシー。
このインデックスを管理するシステム (可能な値は「インデックスライフサイクル管理」、「データストリームライフサイクル」、または「未管理」)
次の世代インデックスを管理するシステム (データストリームがロールオーバーされた後の新しい書き込みインデックス)。可能な値は「インデックスライフサイクル管理」、「データストリームライフサイクル」、または「未管理」です。
データストリームを支えるインデックステンプレートに構成された prefer_ilm の値。この値はすべての新しいバックインデックスに構成されます。インデックステンプレートに構成されていない場合、バックインデックスは true のデフォルト値を受け取ります (ILM はデフォルトでデータストリームライフサイクルよりも優先されます)。
このデータストリームを支えるインデックステンプレートに構成された ILM ポリシー (インデックステンプレートに存在する限り、すべての新しいバックインデックスに構成されます)。

データストリームをデータストリームライフサイクルに移行する

dsl-data-stream をデータストリームライフサイクルに移行するには、2つのステップを実行する必要があります:

  • 1. データストリームを支えるインデックステンプレートを更新し、prefer_ilmfalse に設定し、データストリームライフサイクルを構成します。
  • 2. 既存の dsl-data-stream のデータストリームライフサイクルを ライフサイクル API を使用して構成します。

インデックステンプレートに追加されたデータストリームライフサイクル構成は、データストリーム構成であるため、新しいデータストリームにのみ適用されます。私たちのデータストリームはすでに存在しているため、インデックステンプレートにデータストリームライフサイクル構成を追加しても dsl-data-stream には適用されません。

インデックステンプレートを更新しましょう:

Python

  1. resp = client.indices.put_index_template(
  2. name="dsl-data-stream-template",
  3. index_patterns=[
  4. "dsl-data-stream*"
  5. ],
  6. data_stream={},
  7. priority=500,
  8. template={
  9. "settings": {
  10. "index.lifecycle.name": "pre-dsl-ilm-policy",
  11. "index.lifecycle.prefer_ilm": False
  12. },
  13. "lifecycle": {
  14. "data_retention": "7d"
  15. }
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.indices.put_index_template(
  2. name: 'dsl-data-stream-template',
  3. body: {
  4. index_patterns: [
  5. 'dsl-data-stream*'
  6. ],
  7. data_stream: {},
  8. priority: 500,
  9. template: {
  10. settings: {
  11. 'index.lifecycle.name' => 'pre-dsl-ilm-policy',
  12. 'index.lifecycle.prefer_ilm' => false
  13. },
  14. lifecycle: {
  15. data_retention: '7d'
  16. }
  17. }
  18. }
  19. )
  20. puts response

Js

  1. const response = await client.indices.putIndexTemplate({
  2. name: "dsl-data-stream-template",
  3. index_patterns: ["dsl-data-stream*"],
  4. data_stream: {},
  5. priority: 500,
  6. template: {
  7. settings: {
  8. "index.lifecycle.name": "pre-dsl-ilm-policy",
  9. "index.lifecycle.prefer_ilm": false,
  10. },
  11. lifecycle: {
  12. data_retention: "7d",
  13. },
  14. },
  15. });
  16. console.log(response);

コンソール

  1. PUT _index_template/dsl-data-stream-template
  2. {
  3. "index_patterns": ["dsl-data-stream*"],
  4. "data_stream": { },
  5. "priority": 500,
  6. "template": {
  7. "settings": {
  8. "index.lifecycle.name": "pre-dsl-ilm-policy",
  9. "index.lifecycle.prefer_ilm": false
  10. },
  11. "lifecycle": {
  12. "data_retention": "7d"
  13. }
  14. }
  15. }
prefer_ilm 設定は、新しいバックインデックス (データストリームをロールオーバーして作成された) に構成され、ILM がデータストリームライフサイクルよりも優先されないようにします。
データストリームライフサイクルを構成しているため、新しい データストリームはデータストリームライフサイクルによって管理されます。

これで、新しいデータストリームがデータストリームライフサイクルによって管理されることが確実になりました。

既存の dsl-data-stream を更新し、データストリームライフサイクルを構成しましょう:

Python

  1. resp = client.indices.put_data_lifecycle(
  2. name="dsl-data-stream",
  3. data_retention="7d",
  4. )
  5. print(resp)

Ruby

  1. response = client.indices.put_data_lifecycle(
  2. name: 'dsl-data-stream',
  3. body: {
  4. data_retention: '7d'
  5. }
  6. )
  7. puts response

Js

  1. const response = await client.indices.putDataLifecycle({
  2. name: "dsl-data-stream",
  3. data_retention: "7d",
  4. });
  5. console.log(response);

コンソール

  1. PUT _data_stream/dsl-data-stream/_lifecycle
  2. {
  3. "data_retention": "7d"
  4. }

データストリームを確認して、次の世代が本当にデータストリームライフサイクルによって管理されるかどうかを確認できます:

Python

  1. resp = client.indices.get_data_stream(
  2. name="dsl-data-stream",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.get_data_stream(
  2. name: 'dsl-data-stream'
  3. )
  4. puts response

Js

  1. const response = await client.indices.getDataStream({
  2. name: "dsl-data-stream",
  3. });
  4. console.log(response);

コンソール

  1. GET _data_stream/dsl-data-stream

コンソール-結果

  1. {
  2. "data_streams": [
  3. {
  4. "name": "dsl-data-stream",
  5. "timestamp_field": {
  6. "name": "@timestamp"
  7. },
  8. "indices": [
  9. {
  10. "index_name": ".ds-dsl-data-stream-2023.10.19-000001",
  11. "index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
  12. "prefer_ilm": true,
  13. "ilm_policy": "pre-dsl-ilm-policy",
  14. "managed_by": "Index Lifecycle Management"
  15. },
  16. {
  17. "index_name": ".ds-dsl-data-stream-2023.10.19-000002",
  18. "index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
  19. "prefer_ilm": true,
  20. "ilm_policy": "pre-dsl-ilm-policy",
  21. "managed_by": "Index Lifecycle Management"
  22. }
  23. ],
  24. "generation": 2,
  25. "status": "GREEN",
  26. "template": "dsl-data-stream-template",
  27. "lifecycle": {
  28. "enabled": true,
  29. "data_retention": "7d"
  30. },
  31. "ilm_policy": "pre-dsl-ilm-policy",
  32. "next_generation_managed_by": "Data stream lifecycle",
  33. "prefer_ilm": false,
  34. "hidden": false,
  35. "system": false,
  36. "allow_custom_routing": false,
  37. "replicated": false,
  38. "rollover_on_write": false
  39. }
  40. ]
  41. }
既存のバックインデックスは引き続き ILM によって管理されます
既存のバックインデックスは引き続き ILM によって管理されます
次の世代インデックスはデータストリームライフサイクルによって管理されます
インデックステンプレートに構成された prefer_ilm 設定値が反映され、新しいバックインデックスに対して適切に構成されます。

データストリームをロールオーバーして、データストリームライフサイクルによって管理される新しい世代インデックスを確認しましょう:

Python

  1. resp = client.indices.rollover(
  2. alias="dsl-data-stream",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.rollover(
  2. alias: 'dsl-data-stream'
  3. )
  4. puts response

Js

  1. const response = await client.indices.rollover({
  2. alias: "dsl-data-stream",
  3. });
  4. console.log(response);

コンソール

  1. POST dsl-data-stream/_rollover

Python

  1. resp = client.indices.get_data_stream(
  2. name="dsl-data-stream",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.get_data_stream(
  2. name: 'dsl-data-stream'
  3. )
  4. puts response

Js

  1. const response = await client.indices.getDataStream({
  2. name: "dsl-data-stream",
  3. });
  4. console.log(response);

コンソール

  1. GET _data_stream/dsl-data-stream

コンソール-結果

  1. {
  2. "data_streams": [
  3. {
  4. "name": "dsl-data-stream",
  5. "timestamp_field": {
  6. "name": "@timestamp"
  7. },
  8. "indices": [
  9. {
  10. "index_name": ".ds-dsl-data-stream-2023.10.19-000001",
  11. "index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
  12. "prefer_ilm": true,
  13. "ilm_policy": "pre-dsl-ilm-policy",
  14. "managed_by": "Index Lifecycle Management"
  15. },
  16. {
  17. "index_name": ".ds-dsl-data-stream-2023.10.19-000002",
  18. "index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
  19. "prefer_ilm": true,
  20. "ilm_policy": "pre-dsl-ilm-policy",
  21. "managed_by": "Index Lifecycle Management"
  22. },
  23. {
  24. "index_name": ".ds-dsl-data-stream-2023.10.19-000003",
  25. "index_uuid": "PA_JquKGSiKcAKBA8abcd1",
  26. "prefer_ilm": false,
  27. "ilm_policy": "pre-dsl-ilm-policy",
  28. "managed_by": "Data stream lifecycle"
  29. }
  30. ],
  31. "generation": 3,
  32. "status": "GREEN",
  33. "template": "dsl-data-stream-template",
  34. "lifecycle": {
  35. "enabled": true,
  36. "data_retention": "7d"
  37. },
  38. "ilm_policy": "pre-dsl-ilm-policy",
  39. "next_generation_managed_by": "Data stream lifecycle",
  40. "prefer_ilm": false,
  41. "hidden": false,
  42. "system": false,
  43. "allow_custom_routing": false,
  44. "replicated": false,
  45. "rollover_on_write": false
  46. }
  47. ]
  48. }
ロールオーバー前に存在したバックインデックスは引き続き ILM によって管理されます
ロールオーバー前に存在したバックインデックスは引き続き ILM によって管理されます
新しい書き込みインデックスは、インデックステンプレートで構成した false 値を受け取り、prefer_ilm 設定に従って構成されます。
新しい書き込みインデックスは Data stream lifecycle によって管理されます

データストリームを ILM に戻す

このデータストリームを ILM に管理させるのは簡単です。なぜなら、インデックステンプレートを更新したとき に ILM ポリシーを削除しなかったからです。

これを実現する方法は2つあります:

  • 1. データストリームから ライフサイクルを削除する
  • 2. enabled フラグを false に設定してデータストリームライフサイクルを無効にする。

オプション2を実装し、データストリームライフサイクルを無効にしましょう:

Python

  1. resp = client.indices.put_data_lifecycle(
  2. name="dsl-data-stream",
  3. data_retention="7d",
  4. enabled=False,
  5. )
  6. print(resp)

Ruby

  1. response = client.indices.put_data_lifecycle(
  2. name: 'dsl-data-stream',
  3. body: {
  4. data_retention: '7d',
  5. enabled: false
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.indices.putDataLifecycle({
  2. name: "dsl-data-stream",
  3. data_retention: "7d",
  4. enabled: false,
  5. });
  6. console.log(response);

コンソール

  1. PUT _data_stream/dsl-data-stream/_lifecycle
  2. {
  3. "data_retention": "7d",
  4. "enabled": false
  5. }
enabled フラグは省略可能で、デフォルトは true ですが、ここでは明示的に false に設定します。
データストリームの状態を確認しましょう:

Python

  1. resp = client.indices.get_data_stream(
  2. name="dsl-data-stream",
  3. )
  4. print(resp)

Ruby

  1. response = client.indices.get_data_stream(
  2. name: 'dsl-data-stream'
  3. )
  4. puts response

Js

  1. const response = await client.indices.getDataStream({
  2. name: "dsl-data-stream",
  3. });
  4. console.log(response);

コンソール

  1. GET _data_stream/dsl-data-stream

コンソール-結果

  1. {
  2. "data_streams": [
  3. {
  4. "name": "dsl-data-stream",
  5. "timestamp_field": {
  6. "name": "@timestamp"
  7. },
  8. "indices": [
  9. {
  10. "index_name": ".ds-dsl-data-stream-2023.10.19-000001",
  11. "index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
  12. "prefer_ilm": true,
  13. "ilm_policy": "pre-dsl-ilm-policy",
  14. "managed_by": "Index Lifecycle Management"
  15. },
  16. {
  17. "index_name": ".ds-dsl-data-stream-2023.10.19-000002",
  18. "index_uuid": "PA_JquKGSiKcAKBA8DJ5gw",
  19. "prefer_ilm": true,
  20. "ilm_policy": "pre-dsl-ilm-policy",
  21. "managed_by": "Index Lifecycle Management"
  22. },
  23. {
  24. "index_name": ".ds-dsl-data-stream-2023.10.19-000003",
  25. "index_uuid": "PA_JquKGSiKcAKBA8abcd1",
  26. "prefer_ilm": false,
  27. "ilm_policy": "pre-dsl-ilm-policy",
  28. "managed_by": "Index Lifecycle Management"
  29. }
  30. ],
  31. "generation": 3,
  32. "status": "GREEN",
  33. "template": "dsl-data-stream-template",
  34. "lifecycle": {
  35. "enabled": false,
  36. "data_retention": "7d"
  37. },
  38. "ilm_policy": "pre-dsl-ilm-policy",
  39. "next_generation_managed_by": "Index Lifecycle Management",
  40. "prefer_ilm": false,
  41. "hidden": false,
  42. "system": false,
  43. "allow_custom_routing": false,
  44. "replicated": false,
  45. "rollover_on_write": false
  46. }
  47. ]
  48. }
書き込みインデックスは現在 ILM によって管理されています
データストリームに構成された lifecycle は現在無効になっています。
次の書き込みインデックスは ILM によって管理されます

インデックステンプレートを 更新 したときに ILM ポリシーを削除していた場合、データストリームの書き込みインデックスは現在 Unmanaged になります。なぜなら、インデックスにはフォールバックするための ILM ポリシーが構成されていなかったからです。