Учебник: Удержание потоков данных
В этом руководстве мы рассмотрим срок хранения потоков данных; мы определим его, рассмотрим, как его можно настроить и как он применяется. Имейте в виду, что следующие параметры применяются только к потокам данных, управляемым циклом жизни потока данных.
Вы можете проверить, управляется ли поток данных циклом жизни потока данных, с помощью API для получения цикла жизни потока данных:
resp = client.indices.get_data_lifecycle(
name="my-data-stream",
)
print(resp) response = client.indices.get_data_lifecycle( name: 'my-data-stream' ) puts response
const response = await client.indices.getDataLifecycle({
name: "my-data-stream",
});
console.log(response); GET _data_stream/my-data-stream/_lifecycle
Результат должен выглядеть следующим образом:
{
"data_streams": [
{
"name": "my-data-stream",
"lifecycle": {
"enabled": true
}
}
]
} | Имя вашего потока данных. | |
| Убедитесь, что цикл жизни включён, то есть это должно быть |
Что такое хранение потока данных?
Мы определяем хранение как минимальный период времени, в течение которого данные потока данных будут храниться в Elasticsearch. По истечении этого периода Elasticsearch разрешается удалить эти данные, чтобы освободить место и/или управлять затратами.
Хранение не определяет период удаления данных, а минимальный период их хранения.
Мы определяем 4 разных типа хранения:
- Хранение потока данных, или
data_retention, которое задаётся для потока данных. Его можно установить в шаблоне индекса для будущих потоков данных или с помощью API PUT data stream lifecycle для существующего потока данных. Если хранение потока данных не задано, это подразумевает, что данные должны храниться вечно. - Глобальное хранение по умолчанию, назовем его
default_retention, которое настраивается с помощью параметра кластераdata_streams.lifecycle.retention.defaultи применяется ко всем потокам данных, управляемым циклом жизни потока данных, у которых не заданоdata_retention. В сущности, это гарантирует, что не будет потоков данных, хранящих данные вечно. Это можно установить с помощью API для обновления настроек кластера. - Глобальный максимальный срок хранения, назовем его
max_retention, который настраивается с помощью параметра кластераdata_streams.lifecycle.retention.maxи применяется ко всем потокам данных, управляемым циклом жизни потока данных. В сущности, это гарантирует, что срок хранения ни для одного потока данных не превысит этот период. Это можно установить с помощью API для обновления настроек кластера. - Эффективное хранение, или
effective_retention, которое применяется к потоку данных в данный момент. Эффективное хранение нельзя задать, оно выводится, учитывая все настроенные типы хранения, и рассчитывается, как описано здесь.
Глобальное хранение по умолчанию и максимальное хранение не применяются к внутренним потокам данных elastic. Внутренние потоки данных распознаются по значению флага system, установленного в true, или если их имя начинается с точки (.).
Как настроить хранение?
-
Установив
data_retentionна уровне потока данных. Это хранение можно настроить двумя способами:— Для новых потоков данных оно может быть определено в шаблоне индекса, который будет применён при создании потока данных. Вы можете использовать API для создания шаблона индекса, например:
resp = client.indices.put_index_template( name="template", index_patterns=[ "my-data-stream*" ], data_stream={}, priority=500, template={ "lifecycle": { "data_retention": "7d" } }, meta={ "description": "Template with data stream lifecycle" }, ) print(resp)const response = await client.indices.putIndexTemplate({ name: "template", index_patterns: ["my-data-stream*"], data_stream: {}, priority: 500, template: { lifecycle: { data_retention: "7d", }, }, _meta: { description: "Template with data stream lifecycle", }, }); console.log(response);PUT _index_template/template { "index_patterns": ["my-data-stream*"], "data_stream": { }, "priority": 500, "template": { "lifecycle": { "data_retention": "7d" } }, "_meta": { "description": "Template with data stream lifecycle" } }— Для существующего потока данных оно может быть установлено с помощью API PUT для цикла жизни потока данных.
resp = client.indices.put_data_lifecycle( name="my-data-stream", data_retention="30d", ) print(resp)response = client.indices.put_data_lifecycle( name: 'my-data-stream', body: { data_retention: '30d' } ) puts responseconst response = await client.indices.putDataLifecycle({ name: "my-data-stream", data_retention: "30d", }); console.log(response);PUT _data_stream/my-data-stream/_lifecycle { "data_retention": "30d" }Срок хранения этого потока данных установлен на 30 дней.
-
Установив глобальное хранение с помощью
data_streams.lifecycle.retention.defaultи/илиdata_streams.lifecycle.retention.max, которые задаются на уровне кластера. Их можно задать с помощью API для обновления настроек кластера. Например:resp = client.cluster.put_settings( persistent={ "data_streams.lifecycle.retention.default": "7d", "data_streams.lifecycle.retention.max": "90d" }, ) print(resp)const response = await client.cluster.putSettings({ persistent: { "data_streams.lifecycle.retention.default": "7d", "data_streams.lifecycle.retention.max": "90d", }, }); console.log(response);PUT /_cluster/settings { "persistent" : { "data_streams.lifecycle.retention.default" : "7d", "data_streams.lifecycle.retention.max" : "90d" } }
Как вычисляется эффективный срок хранения?
Эффективный срок хранения вычисляется следующим образом:
-
effective_retention— этоdefault_retention, когдаdefault_retentionопределено, а у потока данных нетdata_retention. -
effective_retention— этоdata_retention, когдаdata_retentionопределено, и еслиmax_retentionопределено, оно меньше, чемmax_retention. -
effective_retention— этоmax_retention, когдаmax_retentionопределено, и поток данных либо не имеетdata_retention, либо егоdata_retentionбольше, чемmax_retention.
Приведённые выше примеры продемонстрированы ниже:
default_retention | max_retention | data_retention | effective_retention | Определённое хранение |
|---|---|---|---|---|
Не задано | Не задано | Не задано | Бесконечное | Н/Д |
Неактуально | 12 месяцев | 30 дней | 30 дней |
|
Неактуально | Не задано | 30 дней | 30 дней |
|
30 дней | 12 месяцев | Не задано | 30 дней |
|
30 дней | 30 дней | Не задано | 30 дней |
|
Неактуально | 30 дней | 12 месяцев | 30 дней |
|
Не задано | 30 дней | Не задано | 30 дней |
|
Взяв наш пример, если мы получим цикл жизни my-data-stream:
resp = client.indices.get_data_lifecycle(
name="my-data-stream",
)
print(resp) response = client.indices.get_data_lifecycle( name: 'my-data-stream' ) puts response
const response = await client.indices.getDataLifecycle({
name: "my-data-stream",
});
console.log(response); GET _data_stream/my-data-stream/_lifecycle
Мы видим, что оно останется таким же, как настроенное пользователем:
{
"global_retention" : {
"max_retention" : "90d",
"default_retention" : "7d"
},
"data_streams": [
{
"name": "my-data-stream",
"lifecycle": {
"enabled": true,
"data_retention": "30d",
"effective_retention": "30d",
"retention_determined_by": "data_stream_configuration"
}
}
]
} | Максимальное время хранения, настроенное в кластере. | |
| Значение хранения по умолчанию, настроенное в кластере. | |
| Запрошенное время хранения для этого потока данных. | |
| Время хранения, применяемое жизненным циклом потока данных для этого потока данных. | |
| Настройка, определяющая эффективное время хранения. В данном случае это |
Как применяется эффективное время хранения?
Время хранения применяется к оставшимся базовым индексам потока данных в качестве последнего шага запуска жизненного цикла потока данных. Жизненный цикл потока данных получит базовые индексы, чьё generation_time больше, чем период эффективного хранения, и удалит их. generation_time применимо только к перероллированным базовым индексам и представляет собой либо время, прошедшее с момента перероллирования базового индекса, либо время, настроенное необязательно в настройке index.lifecycle.origination_date.
Мы используем generation_time вместо времени создания, поскольку это гарантирует, что все данные в базовом индексе прошли период хранения. В результате, период хранения — это не точное время удаления данных, а минимальное время хранения данных.
© 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-manage-data-stream-retention.html