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