警告:此功能处于技术预览阶段,可能会在未来版本中更改或删除。 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 策略:
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
{
"acknowledged": true,
"shards_acknowledged": true,
"old_index": ".ds-dsl-data-stream-2024.03.21-000001",
"new_index": ".ds-dsl-data-stream-2024.03.21-000002",
"rolled_over": true,
"dry_run": false,
"conditions": {}
}
我们将使用 GET _data_stream API 来检查数据流的状态:
GET _data_stream/dsl-data-stream
检查响应,我们将看到两个后备索引(backing indices)均由 ILM 管理,并且下一个索引也将由 ILM 管理:
{
"data_streams": [
{
"name": "dsl-data-stream",
"timestamp_field": {
"name": "@timestamp"
},
"indices": [
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000001", (1)
"index_uuid": "xCEhwsp8Tey0-FLNFYVwSg",
"prefer_ilm": true, (2)
"ilm_policy": "pre-dsl-ilm-policy", (3)
"managed_by": "Index Lifecycle Management" (4)
},
{
"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", (5)
"prefer_ilm": true, (6)
"ilm_policy": "pre-dsl-ilm-policy", (7)
"hidden": false,
"system": false,
"allow_custom_routing": false,
"replicated": 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,并配置数据流生命周期。
- 使用 lifecycle 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 (1)
},
"lifecycle": {
"data_retention": "7d" (2)
}
}
}
- 现在将在新的后备索引(通过滚动数据流创建)上配置 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" (1)
},
{
"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" (2)
}
],
"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", (3)
"prefer_ilm": false,
"hidden": false, (4)
"system": false,
"allow_custom_routing": false,
"replicated": false
}
]
}
- 现有支持索引将继续由 ILM 管理
- 现有支持索引将继续由 ILM 管理
- 下一代索引将由 Data stream lifecycle 管理
- 我们在索引模板中配置的 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" (1)
},
{
"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" (2)
},
{
"index_name": ".ds-dsl-data-stream-2023.10.19-000003",
"index_uuid": "PA_JquKGSiKcAKBA8abcd1",
"prefer_ilm": false, (3)
"ilm_policy": "pre-dsl-ilm-policy",
"managed_by": "Data stream lifecycle" (4)
}
],
"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)前存在的后备索引将继续由 ILM 管理
- 翻转前存在的后备索引将继续由 ILM 管理
- 正如我们在索引模板中配置的那样,新的写入索引收到的 prefer_ilm 设置为 false
- 新的写入索引由 Data stream lifecycle 管理
将数据流迁移回 ILM
我们可以轻松地将此数据流更改为由 ILM 管理,因为我们在上面更新索引模板时没有删除 ILM 策略。
我们可以通过两种方式实现这一目标:
- 从数据流中删除生命周期
- 通过将 enabled 标志配置为 false 来禁用数据流生命周期
让我们实现选项 2 并禁用数据流生命周期:
PUT _data_stream/dsl-data-stream/_lifecycle
{
"data_retention": "7d",
"enabled": false (1)
}
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
}
]
}
- 写入索引现在由 ILM 管理
- 在数据流上配置的 lifecycle 现已禁用。
- 下一次写入索引将由 ILM 管理
如果我们在更新索引模板时从索引模板中删除了 ILM 策略,则数据流的写入索引现在将处于 Unmanged 状态,因为该索引不会将 ILM 策略配置为回退到之前的状态。