警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。
在本教程中,我们将了解如何将现有数据流(data stream)从索引生命周期管理 (ILM) 迁移到数据流生命周期。 现有的 ILM 管理的支持指数将继续由 ILM 管理,直到它们过期并被 ILM 删除; 但是,新的支持索引将由数据流生命周期管理。 这样,数据流逐渐从由 ILM 管理迁移到由数据流生命周期管理。 正如我们将看到的,ILM 和数据流生命周期可以共同管理数据流; 但是,一个索引一次只能由一个系统管理。
如果你对 ILM 还不是很清楚的话,请详细阅读文章 "Elasticsearch:Index 生命周期管理入门"。针对数据流生命周期,请详细阅读文章 "Data streams(一)(二)(三)"
长话短说
要将数据流从 ILM 迁移到数据流生命周期,我们必须执行两个步骤:
- 更新支持数据流的索引模板,将 prefer_ilm 设置为 false,并配置数据流生命周期。
- 使用生命周期 API 为现有数据流配置数据流生命周期。
设置 ILM 管理的数据流
首先,我们创建一个具有两个由 ILM 管理的支持索引的数据流。 我们首先创建 ILM 策略:
bash
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:
markdown
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 为目标的文档来创建数据流,并且我们还将手动翻转 (rollover) 数据流以创建另一代索引:
sql
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. }
bash
POST dsl-data-stream/_rollover
json
1. {
2. "acknowledged": true,
3. "shards_acknowledged": true,
4. "old_index": ".ds-dsl-data-stream-2024.03.21-000001",
5. "new_index": ".ds-dsl-data-stream-2024.03.21-000002",
6. "rolled_over": true,
7. "dry_run": false,
8. "conditions": {}
9. }
我们将使用 GET _data_stream API 来检查数据流的状态:
bash
GET _data_stream/dsl-data-stream
检查响应,我们将看到两个后备索引(backing indices)均由 ILM 管理,并且下一个索引也将由 ILM 管理:
json
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", (1)
11. "index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
12. "prefer_ilm": true, (2)
13. "ilm_policy": "pre-dsl-ilm-policy", (3)
14. "managed_by": "Index Lifecycle Management" (4)
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", (5)
28. "prefer_ilm": true, (6)
29. "ilm_policy": "pre-dsl-ilm-policy", (7)
30. "hidden": false,
31. "system": false,
32. "allow_custom_routing": false,
33. "replicated": false
34. }
35. ]
36. }
- 后备索引的名称。
- 对于每个后备索引,我们会显示 prefer_ilm 配置的值,该值将指示在两个系统都配置了索引的情况下,ILM 是否优先于数据流生命周期。
- 为此索引配置的 ILM 策略。
- 管理该索引的系统(可能的值为 "Index Lifecycle Management"、"Data stream lifecycle" 或 "Unmanaged")
- 将管理下一个索引的系统(一旦数据流滚动,该数据流的新写入索引)。 可能的值为 "Index Lifecycle Management"、"Data stream lifecycle" 或 "Unmanaged"。
- 在支持数据流的索引模板中配置的 prefer_ilm 值。 该值将为所有新的后备索引配置。 如果未在索引模板中配置,则后备索引将接收 true 作为默认值(默认情况下,ILM 优先于数据流生命周期,因为它目前功能更丰富)。
- 在支持此数据流的索引模板中配置的 ILM 策略(将在所有新的后备索引上配置,只要它存在于索引模板中)。
将数据流迁移到数据流生命周期
要将 dsl-data-stream 迁移到数据流生命周期,我们必须执行两个步骤:
- 更新支持数据流的索引模板,将 prefer_ilm 设置为 false,并配置数据流生命周期。
- 使用 lifecycle API 为现有 dsl-data-stream 配置数据流生命周期。
重要:添加到索引模板中的数据流生命周期配置作为数据流配置,仅适用于新的数据流。 我们的数据流已经存在,因此即使我们在索引模板中添加了数据流生命周期配置,它也不会应用于 dsl-data-stream。
让我们更新索引模板:
bash
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 (1)
10. },
11. "lifecycle": {
12. "data_retention": "7d" (2)
13. }
14. }
15. }
- 现在将在新的后备索引(通过滚动数据流创建)上配置 prefer_ilm 设置,以便 ILM 不会优先于数据流生命周期。
- 我们正在配置数据流生命周期,以便新数据流将由数据流生命周期管理。
我们现在已经确保新的数据流将由数据流生命周期进行管理。让我们更新现有的 dsl-data-stream 并配置数据流生命周期:
bash
1. PUT _data_stream/dsl-data-stream/_lifecycle
2. {
3. "data_retention": "7d"
4. }
我们可以检查数据流以检查下一代是否确实由数据流生命周期管理:
bash
GET _data_stream/dsl-data-stream
json
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" (1)
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" (2)
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", (3)
33. "prefer_ilm": false,
34. "hidden": false, (4)
35. "system": false,
36. "allow_custom_routing": false,
37. "replicated": false
38. }
39. ]
40. }
- 现有支持索引将继续由 ILM 管理
- 现有支持索引将继续由 ILM 管理
- 下一代索引将由 Data stream lifecycle 管理
- 我们在索引模板中配置的 prefer_ilm 设置值将被反映,并将针对新的支持索引进行相应配置。
现在,我们将滚动数据流以查看由数据流生命周期管理的新一代索引:
bash
POST dsl-data-stream/_rollover
bash
GET _data_stream/dsl-data-stream
json
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" (1)
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" (2)
22. },
23. {
24. "index_name": ".ds-dsl-data-stream-2023.10.19-000003",
25. "index_uuid": "PA_JquKGSiKcAKBA8abcd1",
26. "prefer_ilm": false, (3)
27. "ilm_policy": "pre-dsl-ilm-policy",
28. "managed_by": "Data stream lifecycle" (4)
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. }
46. ]
47. }
- 翻转(rollover)前存在的后备索引将继续由 ILM 管理
- 翻转前存在的后备索引将继续由 ILM 管理
- 正如我们在索引模板中配置的那样,新的写入索引收到的 prefer_ilm 设置为 false
- 新的写入索引由 Data stream lifecycle 管理
将数据流迁移回 ILM
我们可以轻松地将此数据流更改为由 ILM 管理,因为我们在上面更新索引模板时没有删除 ILM 策略。
我们可以通过两种方式实现这一目标:
- 从数据流中删除生命周期
- 通过将 enabled 标志配置为 false 来禁用数据流生命周期
让我们实现选项 2 并禁用数据流生命周期:
bash
1. PUT _data_stream/dsl-data-stream/_lifecycle
2. {
3. "data_retention": "7d",
4. "enabled": false (1)
5. }
enabled 标志可以省略,默认为 true,但是这里我们显式地将其配置为 false 让我们检查数据流的状态:
bash
GET _data_stream/dsl-data-stream
json
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. }
46. ]
47. }
- 写入索引现在由 ILM 管理
- 在数据流上配置的 lifecycle 现已禁用。
- 下一次写入索引将由 ILM 管理
如果我们在更新索引模板时从索引模板中删除了 ILM 策略,则数据流的写入索引现在将处于 Unmanged 状态,因为该索引不会将 ILM 策略配置为回退到之前的状态。