Учебник: Автоматизация перекатывания с помощью ILM
При непрерывном индексировании временных документов в Elasticsearch, обычно используется поток данных, чтобы периодически переключаться на новый индекс. Это позволяет реализовать архитектуру «горячие-тёплые-холодные» для удовлетворения требований производительности для новых данных, контролировать затраты со временем, применять политики хранения и максимально эффективно использовать данные.
Потоки данных лучше всего подходят для дополнений. Если вам нужно обновлять или удалять существующие временные ряды данных, вы можете выполнить операции обновления или удаления непосредственно в индексе, поддерживающем поток данных. Если вы часто отправляете несколько документов с использованием одного и того же _id, ожидая последнего записанного значения, вы можете использовать псевдоним индекса с индексом записи вместо него. Вы по-прежнему можете использовать ILM для управления и переключения индексов псевдонима. Перейти к Управление данными временных рядов без потоков данных.
Управление данными временных рядов с потоками данных
Для автоматизации переключения и управления потоком данных с помощью ILM, необходимо:
- Создать политику жизненного цикла, которая определяет соответствующие фазы и действия.
- Создать шаблон индекса для создания потока данных и применения политики ILM, а также настроек индексов и конфигурации отображений для поддерживающих индексов.
- Проверить, что индексы перемещаются через фазы жизненного цикла, как ожидается.
При включении управления жизненным циклом индексов для Beats или плагина Logstash Elasticsearch output, политики жизненного цикла настраиваются автоматически. Вам не нужно выполнять никаких других действий. Вы можете изменить стандартные политики через Управление Kibana или API ILM.
Создать политику жизненного цикла
Политика жизненного цикла определяет фазы жизненного цикла индекса и действия, выполняемые в каждой фазе. Жизненный цикл может иметь до пяти фаз: hot, warm, cold, frozen и delete.
Например, вы можете определить timeseries_policy, имеющий две фазы:
- Фаза
hot, которая определяет действие переключения для указания переключения индекса, когда он достигает либоmax_primary_shard_sizeв 50 гигабайт, либоmax_ageв 30 дней. - Фаза
delete, которая устанавливаетmin_ageдля удаления индекса через 90 дней после переключения.
Значение min_age относится ко времени переключения, а не к времени создания индекса. Узнать больше.
Вы можете создать политику через Kibana или с помощью API создания или обновления политики. Чтобы создать политику из Kibana, откройте меню и перейдите к Управление стеком > Политики жизненного цикла индексов. Нажмите Создать политику.
Пример API
resp = client.ilm.put_lifecycle(
name="timeseries_policy",
policy={
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50GB",
"max_age": "30d"
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
},
)
print(resp) response = client.ilm.put_lifecycle(
policy: 'timeseries_policy',
body: {
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: '50GB',
max_age: '30d'
}
}
},
delete: {
min_age: '90d',
actions: {
delete: {}
}
}
}
}
}
)
puts response const response = await client.ilm.putLifecycle({
name: "timeseries_policy",
policy: {
phases: {
hot: {
actions: {
rollover: {
max_primary_shard_size: "50GB",
max_age: "30d",
},
},
},
delete: {
min_age: "90d",
actions: {
delete: {},
},
},
},
},
});
console.log(response); PUT _ilm/policy/timeseries_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_size": "50GB",
"max_age": "30d"
}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
} |
| |
| Запустите действие | |
| Переместите индекс в фазу | |
| Запустите действие |
Создать шаблон индекса для создания потока данных и применения политики жизненного цикла
Для настройки потока данных сначала создайте шаблон индекса для указания политики жизненного цикла. Поскольку шаблон предназначен для потока данных, он также должен включать определение data_stream.
Например, вы можете создать timeseries_template для использования в будущем потоке данных с именем timeseries.
Чтобы включить ILM в управление потоком данных, шаблон настраивает одну настройку ILM:
-
index.lifecycle.nameуказывает имя политики жизненного цикла, которую необходимо применить к потоку данных.
Вы можете использовать мастер создания шаблона Kibana для добавления шаблона. В Kibana откройте меню и перейдите к Управление стеком > Управление индексами. На вкладке Шаблоны индексов нажмите Создать шаблон.
Этот мастер запускает API создания или обновления шаблона индекса для создания шаблона индекса с указанными параметрами.
Пример API
resp = client.indices.put_index_template(
name="timeseries_template",
index_patterns=[
"timeseries"
],
data_stream={},
template={
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "timeseries_policy"
}
},
)
print(resp) response = client.indices.put_index_template(
name: 'timeseries_template',
body: {
index_patterns: [
'timeseries'
],
data_stream: {},
template: {
settings: {
number_of_shards: 1,
number_of_replicas: 1,
'index.lifecycle.name' => 'timeseries_policy'
}
}
}
)
puts response const response = await client.indices.putIndexTemplate({
name: "timeseries_template",
index_patterns: ["timeseries"],
data_stream: {},
template: {
settings: {
number_of_shards: 1,
number_of_replicas: 1,
"index.lifecycle.name": "timeseries_policy",
},
},
});
console.log(response); PUT _index_template/timeseries_template
{
"index_patterns": ["timeseries"],
"data_stream": { },
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "timeseries_policy"
}
}
} | Применить шаблон при индексировании документа в целевой | |
| Имя политики ILM, используемой для управления потоком данных. |
Создать поток данных
Для начала проиндексируйте документ в имя или шаблон подстановок, определенные в index_patterns шаблона индекса. Пока не существует существующий поток данных, индекс или псевдоним индекса с таким именем, запрос индекса автоматически создаст соответствующий поток данных с одним поддерживающим индексом. Elasticsearch автоматически индексирует документы запроса в этот поддерживающий индекс, который также действует как индекс записи потока.
Например, следующий запрос создаёт поток данных timeseries и первый поддерживающий индекс под названием .ds-timeseries-2099.03.08-000001.
resp = client.index(
index="timeseries",
document={
"message": "logged the request",
"@timestamp": "1591890611"
},
)
print(resp) response = client.index(
index: 'timeseries',
body: {
message: 'logged the request',
"@timestamp": '1591890611'
}
)
puts response const response = await client.index({
index: "timeseries",
document: {
message: "logged the request",
"@timestamp": "1591890611",
},
});
console.log(response); POST timeseries/_doc
{
"message": "logged the request",
"@timestamp": "1591890611"
} При выполнении условия переключения в политике жизненного цикла действие rollover:
- Создаёт второй поддерживающий индекс под названием
.ds-timeseries-2099.03.08-000002. Поскольку это поддерживающий индекс для потока данныхtimeseries, конфигурация из шаблона индексаtimeseries_templateприменяется к новому индексу. - Поскольку это последний индекс поколения для потока данных
timeseries, только что созданный поддерживающий индекс.ds-timeseries-2099.03.08-000002становится индексом записи потока данных.
Этот процесс повторяется каждый раз, когда выполняется условие переключения. Вы можете искать во всех поддерживающих индексах потока данных, управляемых timeseries_policy, с именем потока данных timeseries. Операции записи должны отправляться в имя потока данных, которое направит их на текущий индекс записи. Операции чтения по потоку данных будут обрабатываться всеми его поддерживающими индексами.
Проверить ход выполнения жизненного цикла
Для получения информации о состоянии управляемых индексов используется API ILM explain. Это позволяет узнать, например:
- В какой фазе находится индекс и когда он вошел в эту фазу.
- Текущее действие и какой этап выполнения.
- Возникли ли ошибки или заблокирован прогресс.
Например, следующий запрос получает информацию о поддерживающих индексах потока данных timeseries:
resp = client.ilm.explain_lifecycle(
index=".ds-timeseries-*",
)
print(resp) response = client.ilm.explain_lifecycle( index: '.ds-timeseries-*' ) puts response
const response = await client.ilm.explainLifecycle({
index: ".ds-timeseries-*",
});
console.log(response); GET .ds-timeseries-*/_ilm/explain
Следующий ответ показывает, что базовый индекс первого поколения потока данных ожидает действия hot фазы rollover. Он остаётся в этом состоянии, и ILM продолжает вызывать check-rollover-ready, пока не будут выполнены условия перехода.
{
"indices": {
".ds-timeseries-2099.03.07-000001": {
"index": ".ds-timeseries-2099.03.07-000001",
"index_creation_date_millis": 1538475653281,
"time_since_index_creation": "30s",
"managed": true,
"policy": "timeseries_policy",
"lifecycle_date_millis": 1538475653281,
"age": "30s",
"phase": "hot",
"phase_time_millis": 1538475653317,
"action": "rollover",
"action_time_millis": 1538475653317,
"step": "check-rollover-ready",
"step_time_millis": 1538475653317,
"phase_execution": {
"policy": "timeseries_policy",
"phase_definition": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "30d"
}
}
},
"version": 1,
"modified_date_in_millis": 1539609701576
}
}
}
} | Возраст индекса, используемого для расчёта момента перехода индекса с помощью | |
| Политика, используемая для управления индексом | |
| Возраст индексируемых данных, используемых для перехода к следующей фазе (в данном случае он совпадает с возрастом индекса). | |
| Шаг, выполняемый ILM над индексом | |
| Определение текущей фазы (фазы |
Управление временными рядами без потоков данных
Несмотря на то, что потоки данных являются удобным способом масштабирования и управления данными временных рядов, они разработаны для добавления данных только в конец. Мы признаём, что могут быть случаи, когда данные необходимо обновлять или удалять на месте, а потоки данных не поддерживают запросы на удаление и обновление напрямую, поэтому для работы с данными потока данных необходимо использовать API индексов напрямую. В этих случаях мы по-прежнему рекомендуем использовать поток данных.
Если вы часто отправляете несколько документов с помощью того же _id, ожидая, что последнее записанное значение будет перекрывать предыдущие, вы можете использовать псевдоним индекса вместо потока данных для управления индексами, содержащими данные временных рядов, и периодически переходить к новому индексу.
Для автоматизации перехода и управления индексами временных рядов с помощью ILM с использованием псевдонима индекса, вам необходимо:
- Создать политику жизненного цикла, определяющую соответствующие фазы и действия. См. создание политики жизненного цикла выше.
- создать шаблон индекса для применения политики к каждому новому индексу.
- Инициализировать индекс как начальный индекс записи.
- Проверить, что индексы перемещаются по фазам жизненного цикла как ожидается.
Создать шаблон индекса для применения политики жизненного цикла
Чтобы автоматически применять политику жизненного цикла к новому индексу записи при переходе, укажите политику в шаблоне индекса, используемом для создания новых индексов.
Например, вы можете создать timeseries_template, который применяется к новым индексам, имена которых соответствуют шаблону индекса timeseries-*.
Для активации автоматического перехода шаблон настраивает два параметра ILM:
-
index.lifecycle.nameуказывает имя политики жизненного цикла, которая должна применяться к новым индексам, соответствующим шаблону индекса. -
index.lifecycle.rollover_aliasуказывает псевдоним индекса, который должен быть переведён, когда для индекса запускается действие перехода.
Вы можете использовать мастер Kibana по созданию шаблонов для добавления шаблона. Чтобы открыть мастер, откройте меню и перейдите к Управление стеком > Управление индексами. На вкладке Шаблоны индексов нажмите Создать шаблон.
Запрос на создание шаблона для примера шаблона выглядит следующим образом:
resp = client.indices.put_index_template(
name="timeseries_template",
index_patterns=[
"timeseries-*"
],
template={
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "timeseries_policy",
"index.lifecycle.rollover_alias": "timeseries"
}
},
)
print(resp) const response = await client.indices.putIndexTemplate({
name: "timeseries_template",
index_patterns: ["timeseries-*"],
template: {
settings: {
number_of_shards: 1,
number_of_replicas: 1,
"index.lifecycle.name": "timeseries_policy",
"index.lifecycle.rollover_alias": "timeseries",
},
},
});
console.log(response); PUT _index_template/timeseries_template
{
"index_patterns": ["timeseries-*"],
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1,
"index.lifecycle.name": "timeseries_policy",
"index.lifecycle.rollover_alias": "timeseries"
}
}
} | Применить шаблон к новому индексу, если его имя начинается с | |
| Имя политики жизненного цикла, которая должна применяться к каждому новому индексу. | |
| Имя псевдонима, используемого для ссылки на эти индексы. Требуется для политик, использующих действие перехода. |
Инициализировать начальный индекс временных рядов с псевдонимом записи индекса
Для начала вам нужно инициализировать начальный индекс и назначить его индексом записи для псевдонима перехода, указанного в вашем шаблоне индекса. Имя этого индекса должно соответствовать шаблону индекса и заканчиваться числом. При переходе это значение увеличивается, чтобы сгенерировать имя для нового индекса.
Например, следующий запрос создаёт индекс под названием timeseries-000001 и делает его индексом записи для псевдонима timeseries.
resp = client.indices.create(
index="timeseries-000001",
aliases={
"timeseries": {
"is_write_index": True
}
},
)
print(resp) const response = await client.indices.create({
index: "timeseries-000001",
aliases: {
timeseries: {
is_write_index: true,
},
},
});
console.log(response); PUT timeseries-000001
{
"aliases": {
"timeseries": {
"is_write_index": true
}
}
} Когда выполняются условия перехода, действие rollover:
- Создаёт новый индекс под названием
timeseries-000002. Он соответствует шаблонуtimeseries-*, поэтому настройки изtimeseries_templateприменяются к новому индексу. - Назначает новый индекс индексом записи и делает индекс инициализации только для чтения.
Этот процесс повторяется каждый раз, когда выполняются условия перехода. Вы можете искать во всех индексах, управляемых timeseries_policy с помощью псевдонима timeseries. Операции записи должны отправляться в псевдоним, который будет направлять их в текущий индекс записи.
Проверка прогресса жизненного цикла
Получение информации о состоянии управляемых индексов очень похоже на случай с потоками данных. См. раздел проверки прогресса потока данных для получения дополнительной информации. Единственное различие заключается в пространстве имен индексов, поэтому получение прогресса потребует следующего вызова API:
resp = client.ilm.explain_lifecycle(
index="timeseries-*",
)
print(resp) response = client.ilm.explain_lifecycle( index: 'timeseries-*' ) puts response
const response = await client.ilm.explainLifecycle({
index: "timeseries-*",
});
console.log(response); GET timeseries-*/_ilm/explain
© 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/getting-started-index-lifecycle-management.html