Сжатие временного ряда данных
Сжатие обеспечивает способ уменьшения объёма данных вашего временного ряда данных, храня их с уменьшенной точностью.
Системы мониторинга собирают большие объёмы данных временных рядов, которые растут со временем. По мере старения этих данных их актуальность для текущего состояния системы снижается. Процесс сжатия сворачивает документы в пределах фиксированного временного интервала в один сводный документ. Каждый сводный документ включает статистические представления исходных данных: min, max, sum и value_count для каждой метрики. Данные потока измерений временного ряда хранятся неизменными.
Сжатие, по сути, позволяет вам пожертвовать разрешением и точностью данных ради уменьшения размера хранилища. Вы можете включить его в политику управления жизненным циклом индекса (ILM) для автоматического управления объёмом и связанными с ним затратами на данные метрик по мере их старения.
Дополнительную информацию можно найти в следующих разделах:
Как это работает
Временной ряд — это последовательность наблюдений, взятых за определённый промежуток времени для определённого объекта. Наблюдаемые образцы можно представить как непрерывную функцию, где измерения временного ряда остаются постоянными, а значения метрик временного ряда меняются со временем.
В индексе Elasticsearch для каждой метки времени создаётся отдельный документ, содержащий неизменные измерения временного ряда вместе с именами метрик и изменяющимися значениями метрик. Для одного момента времени могут храниться несколько измерений временного ряда и метрик.
Для наиболее актуальных данных метрики обычно имеют низкий интервал дискретизации, поэтому они оптимизированы для запросов, требующих высокой точности данных.
Сжатие применяется к более старым и реже используемым данным путём замены исходного временного ряда потоком данных с более высоким интервалом дискретизации и статистическими представлениями этих данных. Если исходные образцы метрик могут быть взяты, например, каждые десять секунд, по мере старения данных вы можете выбрать уменьшение точности выборки до часа или дня. Вы можете уменьшить точность cold архивных данных до месяца или реже.
Процесс сжатия
Операция сжатия обходит исходный индекс TSDS и выполняет следующие шаги:
- Создаёт новый документ для каждого значения поля
_tsidи каждого значения@timestamp, округлённого доfixed_interval, определённого в конфигурации сжатия. - Для каждого нового документа копирует все измерения временного ряда из исходного индекса в целевой индекс. Измерения в TSDS являются постоянными, поэтому это выполняется только один раз на каждом интервале.
-
Для каждого поля метрики временного ряда вычисляет агрегации для всех документов в интервале. В зависимости от типа метрики каждого поля хранится другой набор предварительно агрегированных результатов:
-
gauge: Хранятсяmin,max,sumиvalue_count;value_countхранится как типaggregate_metric_double. -
counter: Хранитсяlast_value.
-
- Для всех остальных полей копируется последнее значение в целевой индекс.
Сопоставления полей исходного и целевого индекса
Поля в целевом, сжатом индексе создаются на основе полей в исходном индексе следующим образом:
- Все поля, сопоставленные с параметром
time-series-dimension, создаются в целевом сжатом индексе с тем же отображением, что и в исходном индексе. - Все поля, сопоставленные с параметром
time_series_metric, создаются в целевом сжатом индексе с тем же отображением, что и в исходном индексе. Исключение составляют поля, сопоставленные какtime_series_metric: gauge, тип поля изменяется наaggregate_metric_double. - Все остальные поля, которые не являются измерениями или метриками (т.е. поля меток), создаются в целевом сжатом индексе с тем же отображением, что и в исходном индексе.
Запуск сжатия данных временного ряда
Для сжатия индекса временного ряда используйте API сжатия индекса и установите fixed_interval на желаемый уровень точности:
resp = client.indices.downsample(
index="my-time-series-index",
target_index="my-downsampled-time-series-index",
config={
"fixed_interval": "1d"
},
)
print(resp) response = client.indices.downsample(
index: 'my-time-series-index',
target_index: 'my-downsampled-time-series-index',
body: {
fixed_interval: '1d'
}
)
puts response const response = await client.indices.downsample({
index: "my-time-series-index",
target_index: "my-downsampled-time-series-index",
config: {
fixed_interval: "1d",
},
});
console.log(response); POST /my-time-series-index/_downsample/my-downsampled-time-series-index
{
"fixed_interval": "1d"
} Для сжатия данных временных рядов в рамках ILM включите действие сжатия в вашей политике ILM и установите fixed_interval на желаемый уровень точности:
resp = client.ilm.put_lifecycle(
name="my_policy",
policy={
"phases": {
"warm": {
"actions": {
"downsample": {
"fixed_interval": "1h"
}
}
}
}
},
)
print(resp) response = client.ilm.put_lifecycle(
policy: 'my_policy',
body: {
policy: {
phases: {
warm: {
actions: {
downsample: {
fixed_interval: '1h'
}
}
}
}
}
}
)
puts response const response = await client.ilm.putLifecycle({
name: "my_policy",
policy: {
phases: {
warm: {
actions: {
downsample: {
fixed_interval: "1h",
},
},
},
},
},
});
console.log(response); PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"warm": {
"actions": {
"downsample" : {
"fixed_interval": "1h"
}
}
}
}
}
} Запросы к сжатым индексам
Вы можете использовать конечные точки _search и _async_search для запроса к сжатому индексу. В одном запросе могут быть запрошены несколько индексов с сырыми данными и сжатыми данными, а в один запрос можно включить сжатые индексы с различной точностью (разный интервал времени корзины). То есть, вы можете запрашивать потоки данных, содержащие сжатые индексы с несколькими интервалами сжатия (например, 15m, 1h, 1d).
Результат агрегации гистограммы по времени находится в корзинах одинакового размера, и каждый сжатый индекс возвращает данные, игнорируя интервал сжатия. Например, если вы выполните агрегацию date_histogram с "fixed_interval": "1m" на сжатом индексе, сжатом с часовой точностью ("fixed_interval": "1h"), запрос возвращает одну корзину со всеми данными в 0 минуту, затем 59 пустых корзин, а затем корзину с данными для следующего часа.
Примечания по запросам к сжатым индексам
Необходимо учесть несколько моментов при запросах к сжатым индексам:
- При выполнении запросов в Kibana и через решения Elastic возвращается нормальный ответ без уведомления о том, что некоторые из запрошенных индексов сжаты.
- Для агрегаций гистограмм по времени поддерживаются только
fixed_intervals(а не интервалы, учитывающие календарь). -
Поддержка часовых поясов имеет свои особенности:
- Гистограммы по времени с интервалами, кратными часу, основаны на значениях, сгенерированных в UTC. Это хорошо работает для часовых поясов, которые находятся на целых часах, например, +5:00 или -3:00, но требует смещения отчётных интервалов времени, например,
2020-01-01T10:30:00.000вместо2020-03-07T10:00:00.000для часового пояса +5:30 (Индия), если сжатие агрегирует значения в час. В этом случае результаты включают полеdownsampled_results_offset: true, чтобы указать, что интервалы времени смещены. Этого можно избежать, если использовать интервал сжатия в 15 минут, так как он позволяет правильно вычислять часовые значения для смещённых интервалов. - Гистограммы по времени с интервалами, кратными дню, аналогично затрагиваются, если сжатие агрегирует значения в день. В этом случае начало каждого дня всегда рассчитывается в UTC при генерации сжатых значений, поэтому интервалы времени необходимо смещать, например, отображать их как
2020-03-07T19:00:00.000вместо2020-03-07T00:00:00.000для часового поясаAmerica/New_York. В этом случае также добавляется полеdownsampled_results_offset: true. - Переход на летнее/зимнее время и другие особенности часовых поясов влияют на отчётные результаты, как описано для агрегации гистограмм по времени. Кроме того, сжатие с ежедневным интервалом затрудняет отслеживание любой информации, связанной с изменением времени перехода на летнее/зимнее время.
- Гистограммы по времени с интервалами, кратными часу, основаны на значениях, сгенерированных в UTC. Это хорошо работает для часовых поясов, которые находятся на целых часах, например, +5:00 или -3:00, но требует смещения отчётных интервалов времени, например,
Ограничения и ограничения
Для сжатия применяются следующие ограничения:
- Поддерживаются только индексы в потоке данных временных рядов (потоке данных временных рядов).
- Данные сглаживаются только по временной размерности. Все остальные размерности копируются в новый индекс без каких-либо изменений.
- Внутри потока данных сглаженный индекс заменяет исходный индекс, а исходный индекс удаляется. Для заданного временного периода может существовать только один индекс.
- Исходный индекс должен быть в режиме только для чтения для успешного выполнения процесса сглаживания. Подробности см. в примере ручного запуска сглаживания.
- Поддерживается многократное сглаживание данных для одного периода (сглаживание сглаженного индекса). Интервал сглаживания должен быть кратен интервалу сглаженного индекса.
- Сглаживание предоставляется как действие ILM. См. сглаживание.
- Новый сглаженный индекс создаётся на уровне данных исходного индекса и наследует его параметры (например, количество фрагментов и реплик).
- Поддерживаются числовые типы метрик
gaugeиcounterтипы метрик. - Настройка сглаживания извлекается из карты индекса потока данных временных рядов. Единственным дополнительным необходимым параметром является сглаживание
fixed_interval.
Попробуйте
Для проведения тестирования сглаживания попробуйте наш пример ручного запуска сглаживания.
Сглаживание можно легко добавить в вашу политику ILM. Для получения информации попробуйте наш пример запуска сглаживания с 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/downsampling.html