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 автоматизирует жизненный цикл данных по их возрасту.
- Умеет удалять, перемещать между дисками и сворачивать историю.
- Работает во время фоновых слияний — с небольшой задержкой.
- Заменяет ручные скрипты очистки и политики хранения.