Управление данными с помощью TTL (время жизни)
Обзор TTL
TTL (время жизни) относится к возможности перемещения, удаления или агрегации строк или столбцов после истечения определенного интервала времени. Хотя выражение "время жизни" звучит так, будто оно применяется только для удаления старых данных, TTL имеет несколько вариантов использования:
- Удаление старых данных: нет ничего удивительного, вы можете удалить строки или столбцы после заданного временного интервала
- Перемещение данных между дисками: после определенного времени вы можете перемещать данные между хранилищами - это полезно для развертывания архитектуры горячего/теплого/холодного хранения
- Агрегация данных: агрегация ваших старых данных в различные полезные совокупности и вычисления перед их удалением
TTL может применяться как ко всем таблицам, так и к конкретным столбцам.
Синтаксис TTL
Клаузула TTL
может находиться после определения столбца и/или в конце определения таблицы. Используйте клаузулу INTERVAL
, чтобы определить длину времени (которая должна быть типом данных Date
или DateTime
). Например, следующая таблица имеет два столбца с клаузами TTL
:
- Столбец x имеет время жизни 1 месяц от столбца timestamp
- Столбец y имеет время жизни 1 день от столбца timestamp
- Когда интервал истекает, столбец истекает. ClickHouse заменяет значение столбца на значение по умолчанию его типа данных. Если все значения столбца в части данных истекают, ClickHouse удаляет этот столбец из части данных в файловой системе.
Правила TTL можно изменять или удалять. См. страницу Manipulations with Table TTL для получения дополнительных деталей.
Запуск событий TTL
Удаление или агрегация просроченных строк не происходят мгновенно - это происходит только во время слияния таблиц. Если у вас есть таблица, которая не активно сливается (по какой-либо причине), существуют две настройки, которые запускают события TTL:
merge_with_ttl_timeout
: минимальная задержка в секундах перед повторным выполнением слияния с удалением TTL. По умолчанию 14400 секунд (4 часа).merge_with_recompression_ttl_timeout
: минимальная задержка в секундах перед повторным выполнением слияния с рекомпрессией TTL (правила, которые агрегируют данные перед удалением). Значение по умолчанию: 14400 секунд (4 часа).
Таким образом, по умолчанию ваши правила TTL будут применяться к вашей таблице по крайней мере раз в 4 часа. Просто измените указанные настройки, если вам нужно, чтобы ваши правила TTL применялись чаще.
Это не лучшее решение (или то, которое мы рекомендуем использовать часто), но вы также можете принудительно выполнить слияние, используя OPTIMIZE
:
OPTIMIZE
инициализирует несогласованное слияние частей вашей таблицы, а FINAL
принуждает к переоптимизации, если ваша таблица уже является одной частью.
Удаление строк
Чтобы удалить целые строки из таблицы после определенного времени, определите правило TTL на уровне таблицы:
Кроме того, возможно, определить правило TTL на основе значения записи. Это легко реализовать, указав условие where. Разрешено несколько условий:
Удаление столбцов
Вместо удаления всей строки предположим, что вы хотите, чтобы истекали только столбцы balance и address. Давайте изменим таблицу customers
и добавим TTL для обоих столбцов на 2 часа:
Реализация агрегации
Предположим, мы хотим удалить строки через определенное время, но сохранить некоторые данные для отчетности. Мы не хотим всех деталей - лишь несколько агрегированных результатов исторических данных. Это можно реализовать, добавив клаузулу GROUP BY
к вашему выражению TTL
, а также некоторые столбцы в вашу таблицу для хранения агрегированных результатов.
Предположим, в следующей таблице hits
мы хотим удалить старые строки, но сохранить сумму и максимум столбца hits
перед удалением строк. Нам потребуется поле для хранения этих значений, и нам нужно добавить клаузулу GROUP BY
к клаузе TTL
, которая агрегирует сумму и максимум:
Некоторые примечания к таблице hits
:
- Столбцы
GROUP BY
в клаузеTTL
должны быть префиксомPRIMARY KEY
, и мы хотим группировать наши результаты по началу дня. ПоэтомуtoStartOfDay(timestamp)
был добавлен к первичному ключу - Мы добавили два поля для хранения агрегированных результатов:
max_hits
иsum_hits
- Установка значения по умолчанию для
max_hits
иsum_hits
наhits
необходима для корректной работы нашей логики, исходя из того, как определена клаузулаSET
Реализация архитектуры горячего/теплого/холодного хранения
Если вы используете ClickHouse Cloud, шаги в этом уроке не применимы. Вам не нужно беспокоиться о перемещении старых данных в ClickHouse Cloud.
Распространенной практикой при работе с большими объемами данных является перемещение этих данных по мере их старения. Вот шаги по реализации архитектуры горячего/теплого/холодного хранения в ClickHouse с использованием клаузул TO DISK
и TO VOLUME
команды TTL
. (Кстати, это не обязательно должно быть чем-то горячим и холодным - вы можете использовать TTL для перемещения данных для любой вашей задачи.)
- Опции
TO DISK
иTO VOLUME
относятся к именам дисков или томов, определенным в ваших файлах конфигурации ClickHouse. Создайте новый файл с именемmy_system.xml
(или любым другим именем файла), который определяет ваши диски, а затем определите тома, использующие ваши диски. Поместите XML-файл в/etc/clickhouse-server/config.d/
, чтобы применить конфигурацию к вашей системе:
- Указанная выше конфигурация ссылается на три диска, которые указывают на папки, из которых ClickHouse может читать и записывать данные. Тома могут содержать один или несколько дисков - мы определили том для каждого из трех дисков. Давайте посмотрим на диски:
- И... давайте проверим тома:
- Теперь мы добавим правило
TTL
, которое перемещает данные между горячими, теплыми и холодными томами:
- Новое правило
TTL
должно материализоваться, но вы можете принудить его, чтобы убедиться:
- Убедитесь, что ваши данные переместились на ожидаемые диски, используя таблицу
system.parts
:
Ответ будет выглядеть так: