将 ILM 托管的数据流迁移到数据流生命周期
本教程介绍了如何将数据流从索引生命周期管理 (ILM) 迁移到更新的数据流生命周期。它解释了迁移步骤、兼容性注意事项以及验证的最佳实践。
在迁移过程中,现有的由 ILM 管理的后端索引将继续由 ILM 管理,直到它们过期并被 ILM 删除。新创建的后端索引将由数据流生命周期管理。通过这种方式,数据流会逐渐从由 ILM 管理过渡到由数据流生命周期管理。ILM 和数据流生命周期可以共同管理同一个数据流,但一个索引在同一时间只能由一个系统管理。
从 Elastic Stack 9.2 版本开始,数据流 (Streams) 页面在 Kibana 中为常见的数据管理任务提供了一个集中式界面,包括配置数据保留策略等任务。您可以选择永久保留数据、保留一段自定义时间,或者遵循现有的 ILM 策略。有关更多信息,请参阅 在 Streams 中管理数据保留。
要使用 API 将数据流从 ILM 迁移到数据流生命周期,您需要执行两个步骤
- 更新支持数据流的索引模板,将 prefer_ilm 设置为
false,并配置数据流生命周期。 - 使用 生命周期 API 为现有数据流配置数据流生命周期。
有关更多详细信息,请参阅 迁移到数据流生命周期。
首先,让我们创建一个由 ILM 管理的带有两个后端索引的数据流。我们先创建一个 ILM 策略
PUT _ilm/policy/pre-dsl-ilm-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50gb"
}
}
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {}
}
}
}
}
}
然后,让我们创建一个支持数据流并配置 ILM 的索引模板
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 以创建该数据流,并且我们还将手动对该数据流执行滚动更新 (rollover),以便创建另一个代次的索引
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"
}
POST dsl-data-stream/_rollover
我们将使用 GET _data_stream API 来检查数据流的状态
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 策略。
- 管理此索引的系统(可能的值为 "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,并配置数据流生命周期。 - 使用 生命周期 API 为现有
dsl-data-stream配置数据流生命周期。
添加到索引模板中的数据流生命周期配置,作为数据流配置,仅适用于新数据流。我们的数据流已经存在,因此即使我们在索引模板中添加了数据流生命周期配置,它也不会应用于 dsl-data-stream。
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 并配置数据流生命周期
PUT _data_stream/dsl-data-stream/_lifecycle
{
"data_retention": "7d"
}
我们可以检查数据流,以确认下一代确实将由数据流生命周期管理
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",
"effective_retention": "7d",
"retention_determined_by": "data_stream_configuration"
},
"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设置值已反映出来,并将为新的后端索引进行相应的配置。
我们现在将对数据流执行滚动更新,以查看由数据流生命周期管理的新一代索引
POST dsl-data-stream/_rollover
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",
"effective_retention": "7d",
"retention_determined_by": "data_stream_configuration"
},
"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设置的false值,正如我们在索引模板中配置的那样 - 新的写入索引由
Data stream lifecycle管理
我们可以轻松地将此数据流更改为由 ILM 管理,因为我们在 更新索引模板 时没有删除 ILM 策略。
我们可以通过两种方式实现这一点
- 从数据流中删除生命周期
- 通过将
enabled标志配置为false来禁用数据流生命周期。
让我们执行选项 2 并禁用数据流生命周期
PUT _data_stream/dsl-data-stream/_lifecycle
{
"data_retention": "7d",
"enabled": false
}
enabled标志可以省略,默认为true,但是,这里我们明确将其配置为false。让我们检查一下数据流的状态
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 策略。