TTL: автоматический жизненный цикл данных

Пусть база сама удаляет и перекладывает старые данные по расписанию.

TTL (Time To Live) — правило, по которому ClickHouse автоматически удаляет, перемещает или сворачивает данные по достижении заданного возраста.

Проблема растущих данных

Логи и события копятся бесконечно. Хранить вечно — дорого и не нужно: детальные данные старше года почти никто не смотрит. Раньше пришлось бы писать скрипты, которые по ночам удаляют старое. TTL встраивает эту логику прямо в таблицу.

Удаление по возрасту

Самый частый сценарий — удалять данные старше N времени. Задаётся выражением от колонки с датой:

CREATE TABLE logs
(
    event_time DateTime,
    level      String,
    message    String
)
ENGINE = MergeTree
ORDER BY event_time
TTL event_time + INTERVAL 30 DAY;

Здесь строки старше 30 дней будут удалены автоматически. Можно добавить TTL и к уже существующей таблице через ALTER TABLE ... MODIFY TTL.

Перемещение между «горячим» и «холодным» хранилищем

Свежие данные держат на быстрых SSD, старые — на дешёвых HDD. TTL умеет переносить куски между дисками/томами по возрасту:

TTL
    event_time + INTERVAL 7 DAY  TO VOLUME 'ssd',
    event_time + INTERVAL 30 DAY TO VOLUME 'hdd',
    event_time + INTERVAL 1 YEAR DELETE;

Так выстраивается «температурная» политика: неделя на SSD, потом на HDD, через год — удаление.

Сворачивание истории (TTL + GROUP BY)

Иногда старое не удаляют, а прореживают: детальные строки старше срока сворачивают в агрегаты (например, посуточные суммы), экономя место без полной потери информации. Это делается выражением TTL с GROUP BY и агрегатами.

Сводка применений TTL

ЦельДействие TTL
Экономия места... DELETE по возрасту
Горячее/холодное хранение... TO VOLUME / TO DISK
Сжать историю... GROUP BY с агрегатами

Как работает под капотом

TTL применяется не мгновенно: ClickHouse выполняет его во время фоновых слияний кусков (или по расписанию). Поэтому данные «старше срока» могут существовать ещё какое-то время, пока не дойдёт очередь до слияния их куска. Это не баг, а компромисс ради того, чтобы не нагружать систему постоянными проверками.

Частые ошибки

  • Ждать удаления секунда-в-секунду. TTL отрабатывает при слияниях; небольшая задержка нормальна.
  • TTL по неиндексной колонке. Выражение должно опираться на колонку с датой/временем; обычно это поле есть в ORDER BY.
  • Удалять старое построчным DELETE вместо TTL/DROP PARTITION. Дороже и медленнее.

Итоги

  • TTL автоматизирует жизненный цикл данных по их возрасту.
  • Умеет удалять, перемещать между дисками и сворачивать историю.
  • Работает во время фоновых слияний — с небольшой задержкой.
  • Заменяет ручные скрипты очистки и политики хранения.
Проверьте себя
1. Что делает правило TTL event_time + INTERVAL 30 DAY?
AСоздаёт резервную копию каждые 30 дней
BАвтоматически удаляет строки старше 30 дней
CЗапрещает запросы старше 30 дней
DСортирует данные по 30 дней
2. Почему данные старше TTL могут какое-то время ещё существовать?
ATTL не работает
BTTL применяется во время фоновых слияний, а не мгновенно
CНужно вручную нажимать кнопку
DЭто всегда означает поломку