Раздел 38 · ClickHouse и аналитические базы

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

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Сырые события копятся быстро. Через год у «Гонца» их будут миллиарды, а нужны они недолго: продуктовая команда смотрит в сырые события за последние недели, а дальше хватает готовых итогов. Хранить всё вечно дорого, а удалять руками скучно и опасно: однажды кто-то забудет WHERE. В ClickHouse срок жизни данных записывают прямо в таблицу.

Молоко со сроком годности

На каждом пакете молока напечатан срок годности. Магазин не изучает каждый пакет отдельно: при обходе полки продавец просто снимает всё, у чего срок вышел.

TTL (time to live, время жизни) это такой срок годности на каждой строке. Записывается выражением от колонки с датой:

CREATE TABLE raw_events (...)
ENGINE = MergeTree
PARTITION BY toYYYYMM(ts)
ORDER BY (kind, ts)
TTL ts + INTERVAL 90 DAY;

Строка устаревает, когда ts + 90 дней оказывается в прошлом. Удалять её будет сам сервер.

Когда TTL срабатывает

Важная деталь: ClickHouse не проверяет сроки каждую секунду и не проверяет их при вставке. Даже строка, просроченная на месяц, после INSERT спокойно ляжет в таблицу. Сроки применяются при слиянии частей: слияние переписывает часть и выбрасывает просроченные строки по дороге. Когда в частях копится просрочка, сервер сам назначает внеочередное TTL-слияние, повторно для той же части не чаще раза в четыре часа (merge_with_ttl_timeout).

Поэтому TTL обещает, что данные исчезнут, но не в ту же секунду. Если строки должны пропасть строго в срок, в запросах всё равно пишут фильтр по дате. Принудительно применить TTL можно командой ALTER TABLE ... MATERIALIZE TTL или слиянием OPTIMIZE TABLE ... FINAL.

Удобный приём: партиционировать таблицу по тому же времени, что и TTL. Тогда устаревает сразу вся часть, и с настройкой ttl_only_drop_parts = 1 сервер удаляет её целиком, как DROP PARTITION, ничего не переписывая.

урок из курса

Урок из курса «ClickHouse и аналитические базы». Курс покупается один раз и остаётся навсегда: 500 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.