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