Учебник: Миграция управляемого ILM потока данных в жизненный цикл потоков данных
В этом учебнике мы рассмотрим миграцию существующего потока данных из Управления жизненным циклом индексов (ILM) в жизненный цикл потоков данных. Существующие управляемые ILM индексы-источники будут продолжать управляться ILM до тех пор, пока они не устареют и не будут удалены ILM; однако новые индексы-источники будут управляться жизненным циклом потоков данных. Таким образом, поток данных постепенно мигрирует от управления ILM к управлению жизненным циклом потоков данных. Как мы увидим, ILM и жизненный цикл потоков данных могут совместно управлять потоком данных; однако индекс может управляться только одной системой за раз.
Кратко
Для миграции потока данных из ILM в жизненный цикл потоков данных нам нужно выполнить два шага:
- Обновить шаблон индекса, поддерживающего поток данных, для установки prefer_ilm в
falseи для настройки жизненного цикла потока данных. - Настроить жизненный цикл потока данных для существующего потока данных с помощью API жизненного цикла.
Для более подробной информации см. раздел миграция в жизненный цикл потока данных.
Настройка потока данных, управляемого ILM
Давайте сначала создадим поток данных с двумя управляемыми ILM индексами-источниками. Сначала создадим политику ILM:
resp = client.ilm.put_lifecycle(
name="pre-dsl-ilm-policy",
policy={
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50gb"
}
}
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {}
}
}
}
},
)
print(resp) response = client.ilm.put_lifecycle(
policy: 'pre-dsl-ilm-policy',
body: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: '50gb'
}
}
},
delete: {
min_age: '7d',
actions: {
delete: {}
}
}
}
}
}
)
puts response const response = await client.ilm.putLifecycle({
name: "pre-dsl-ilm-policy",
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: "50gb",
},
},
},
delete: {
min_age: "7d",
actions: {
delete: {},
},
},
},
},
});
console.log(response); PUT _ilm/policy/pre-dsl-ilm-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50gb"
}
}
},
"delete": {
"min_age": "7d",
"actions": {
"delete": {}
}
}
}
}
} И давайте создадим шаблон индекса, который будет поддерживать поток данных и настраивать ILM:
resp = client.indices.put_index_template(
name="dsl-data-stream-template",
index_patterns=[
"dsl-data-stream*"
],
data_stream={},
priority=500,
template={
"settings": {
"index.lifecycle.name": "pre-dsl-ilm-policy"
}
},
)
print(resp) response = client.indices.put_index_template(
name: 'dsl-data-stream-template',
body: {
index_patterns: [
'dsl-data-stream*'
],
data_stream: {},
priority: 500,
template: {
settings: {
'index.lifecycle.name' => 'pre-dsl-ilm-policy'
}
}
}
)
puts response const response = await client.indices.putIndexTemplate({
name: "dsl-data-stream-template",
index_patterns: ["dsl-data-stream*"],
data_stream: {},
priority: 500,
template: {
settings: {
"index.lifecycle.name": "pre-dsl-ilm-policy",
},
},
});
console.log(response); 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, чтобы создать поток данных, и также вручную переролим поток данных, чтобы создать другой индекс поколения:
resp = client.index(
index="dsl-data-stream",
document={
"@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"
},
)
print(resp) response = client.index(
index: 'dsl-data-stream',
body: {
"@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'
}
)
puts response const response = await client.index({
index: "dsl-data-stream",
document: {
"@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',
},
});
console.log(response); 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"
} resp = client.indices.rollover(
alias="dsl-data-stream",
)
print(resp) response = client.indices.rollover( alias: 'dsl-data-stream' ) puts response
const response = await client.indices.rollover({
alias: "dsl-data-stream",
});
console.log(response); POST dsl-data-stream/_rollover
Мы будем использовать API GET _data_stream для проверки состояния потока данных:
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp) response = client.indices.get_data_stream( name: 'dsl-data-stream' ) puts response
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response); 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, настроенная для этого индекса. | |
| Система, управляющая этим индексом (возможные значения — «Управление жизненным циклом индексов», «Жизненный цикл потока данных» или «Без управления») | |
| Система, которая будет управлять индексом следующего поколения (новый индекс записи этого потока данных после переролирования потока данных). Возможные значения — «Управление жизненным циклом индексов», «Жизненный цикл потока данных» или «Без управления». | |
| Значение prefer_ilm, настроенное в шаблоне индекса, который поддерживает поток данных. Это значение будет настроено для всех новых индексов-источников. Если оно не настроено в шаблоне индекса, индексы-источники получат значение по умолчанию | |
| Политика ILM, настроенная в шаблоне индекса, поддерживающем этот поток данных (которая будет настроена на всех новых индексах-источниках, если она существует в шаблоне индекса). |
Миграция потока данных в жизненный цикл потока данных
Для миграции dsl-data-stream в жизненный цикл потока данных нам нужно выполнить два шага:
- Обновить шаблон индекса, поддерживающего поток данных, для установки prefer_ilm в
falseи для настройки жизненного цикла потока данных. - Настроить жизненный цикл потока данных для существующего
dsl-data-streamс помощью API жизненного цикла.
Настройка жизненного цикла потока данных, добавленная в шаблон индекса, как настройка потока данных, будет применяться только к новым потокам данных. Наш поток данных уже существует, поэтому, даже если мы добавили настройку жизненного цикла потока данных в шаблон индекса, она не будет применена к dsl-data-stream.
Давайте обновим шаблон индекса:
resp = client.indices.put_index_template(
name="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"
}
},
)
print(resp) response = client.indices.put_index_template(
name: 'dsl-data-stream-template',
body: {
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'
}
}
}
)
puts response const response = await client.indices.putIndexTemplate({
name: "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",
},
},
});
console.log(response); 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"
}
}
} | Настройка | |
| Мы настраиваем жизненный цикл потока данных, поэтому новые потоки данных будут управляться жизненным циклом потока данных. |
Теперь мы убедились, что новые потоки данных будут управляться жизненным циклом потока данных.
Давайте обновим наш существующий dsl-data-stream и настроим жизненный цикл потока данных:
resp = client.indices.put_data_lifecycle(
name="dsl-data-stream",
data_retention="7d",
)
print(resp) response = client.indices.put_data_lifecycle(
name: 'dsl-data-stream',
body: {
data_retention: '7d'
}
)
puts response const response = await client.indices.putDataLifecycle({
name: "dsl-data-stream",
data_retention: "7d",
});
console.log(response); PUT _data_stream/dsl-data-stream/_lifecycle
{
"data_retention": "7d"
} Мы можем проверить состояние потока данных, чтобы убедиться, что следующее поколение действительно будет управляться жизненным циклом потока данных:
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp) response = client.indices.get_data_stream( name: 'dsl-data-stream' ) puts response
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response); 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 | |
| Индекс следующего поколения будет управляться жизненным циклом потока данных | |
| Значение настройки |
Теперь переролим поток данных, чтобы увидеть, как новый индекс поколения будет управляться жизненным циклом потока данных:
resp = client.indices.rollover(
alias="dsl-data-stream",
)
print(resp) response = client.indices.rollover( alias: 'dsl-data-stream' ) puts response
const response = await client.indices.rollover({
alias: "dsl-data-stream",
});
console.log(response); POST dsl-data-stream/_rollover
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp) response = client.indices.get_data_stream( name: 'dsl-data-stream' ) puts response
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response); 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 | |
| Новый индекс записи получил значение | |
| Новый индекс записи управляется |
Переместить поток данных обратно в ILM
Мы можем легко изменить этот поток данных, чтобы он управлялся ILM, потому что мы не удалили политику ILM при обновлении шаблона индекса.
Это можно сделать двумя способами:
- Удалить жизненный цикл из потоков данных
- Отключить жизненный цикл потока данных, настроив флаг
enabledв значениеfalse.
Давайте реализуем вариант 2 и отключим жизненный цикл потока данных:
resp = client.indices.put_data_lifecycle(
name="dsl-data-stream",
data_retention="7d",
enabled=False,
)
print(resp) response = client.indices.put_data_lifecycle(
name: 'dsl-data-stream',
body: {
data_retention: '7d',
enabled: false
}
)
puts response const response = await client.indices.putDataLifecycle({
name: "dsl-data-stream",
data_retention: "7d",
enabled: false,
});
console.log(response); PUT _data_stream/dsl-data-stream/_lifecycle
{
"data_retention": "7d",
"enabled": false
} | Флаг |
resp = client.indices.get_data_stream(
name="dsl-data-stream",
)
print(resp) response = client.indices.get_data_stream( name: 'dsl-data-stream' ) puts response
const response = await client.indices.getDataStream({
name: "dsl-data-stream",
});
console.log(response); 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 | |
| Настроенное на потоке данных значение | |
| Следующий индекс записи будет управляться ILM |
Если бы мы удалили политику ILM из шаблона индекса при обновлении его, индекс записи потока данных теперь будет Unmanaged, потому что в индексе не было бы настроенной политики ILM для резервного копирования.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/tutorial-migrate-data-stream-from-ilm-to-dsl.html