Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 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.  }
  1. 后备索引的名称。
  2. 对于每个后备索引,我们会显示 prefer_ilm 配置的值,该值将指示在两个系统都配置了索引的情况下,ILM 是否优先于数据流生命周期。
  3. 为此索引配置的 ILM 策略。
  4. 管理该索引的系统(可能的值为 "Index Lifecycle Management"、"Data stream lifecycle" 或 "Unmanaged")
  5. 将管理下一个索引的系统(一旦数据流滚动,该数据流的新写入索引)。 可能的值为 "Index Lifecycle Management"、"Data stream lifecycle" 或 "Unmanaged"。
  6. 在支持数据流的索引模板中配置的 prefer_ilm 值。 该值将为所有新的后备索引配置。 如果未在索引模板中配置,则后备索引将接收 true 作为默认值(默认情况下,ILM 优先于数据流生命周期,因为它目前功能更丰富)。
  7. 在支持此数据流的索引模板中配置的 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.  }
  1. 现有支持索引将继续由 ILM 管理
  2. 现有支持索引将继续由 ILM 管理
  3. 下一代索引将由 Data stream lifecycle 管理
  4. 我们在索引模板中配置的 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.  }
  1. 翻转(rollover)前存在的后备索引将继续由 ILM 管理
  2. 翻转前存在的后备索引将继续由 ILM 管理
  3. 正如我们在索引模板中配置的那样,新的写入索引收到的 prefer_ilm 设置为 false
  4. 新的写入索引由 Data stream lifecycle 管理

将数据流迁移回 ILM

我们可以轻松地将此数据流更改为由 ILM 管理,因为我们在上面更新索引模板时没有删除 ILM 策略。

我们可以通过两种方式实现这一目标:

  1. 从数据流中删除生命周期
  2. 通过将 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.  }
  1. 写入索引现在由 ILM 管理
  2. 在数据流上配置的 lifecycle 现已禁用。
  3. 下一次写入索引将由 ILM 管理

如果我们在更新索引模板时从索引模板中删除了 ILM 策略,则数据流的写入索引现在将处于 Unmanged 状态,因为该索引不会将 ILM 策略配置为回退到之前的状态。

相关推荐
Elastic 中国社区官方博客7 小时前
Elasticsearch:Painless scripting 语言(一)
大数据·运维·elasticsearch·搜索引擎·全文检索
DDD5858 小时前
ELK优化之Elasticsearch
大数据·elasticsearch·搜索引擎
阿里巴巴P8资深技术专家9 小时前
安装elasticsearch
java·运维·elasticsearch·jenkins
x2lab11 小时前
部署最新版本elasticsearch 8.14.1和 kibana 8.14.1
大数据·elasticsearch·搜索引擎
不要飞升12 小时前
百日筑基第十二天-入门Elasticsearch
java·大数据·elasticsearch·jenkins·实习
magic3341656318 小时前
elasticsearch-users和elasticsearch-reset-password介绍
大数据·elasticsearch·搜索引擎·kibana
developerFBI19 小时前
ES8.13.0 java client请求响应报错status: 200, [es/search] Failed to decode response
java·开发语言·elasticsearch
小冷在努力1 天前
elasticsearch镜像化安装部署
大数据·elasticsearch·jenkins·es
进击的小白菜1 天前
ES|使用Postman更新ES内所有文档的指定字段
elasticsearch·postman·es
magic334165631 天前
Linux启动elasticsearch,提示权限不够
linux·elasticsearch·jenkins