Сырые события копятся быстро. Через год у «Гонца» их будут миллиарды, а нужны они недолго: продуктовая команда смотрит в сырые события за последние недели, а дальше хватает готовых итогов. Хранить всё вечно дорого, а удалять руками скучно и опасно: однажды кто-то забудет 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 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.