Настройка многоуровневого хранилища ClickHouse
База данных ClickHouse поддерживает подход многоуровневого хранилища: горячие данные хранятся на быстрых носителях (SSD), холодные данные — на медленных носителях (HDD). Рекомендуется настроить многоуровневое хранилище, если у вас высоконагруженная инсталляция.
Данный подход выглядит следующим образом:
| Уровень | Тип диска | Данные | Резервное копирование |
|---|---|---|---|
Cold |
SATA HDD |
Данные старше 7 дней |
Вручную |
Hot |
NVMe SSD |
Данные за последние 7 дней |
Ежедневно |
Подход многоуровневого хранилища позволяет:
-
Оптимизировать ресурсы, затрачиваемые на хранение резервных копий.
-
Ускорить резервное копирование, так как копируются только свежие данные.
-
Ускорить восстановление данных из резервной копии.
-
Охватить почти все запросы приложений, так как большинство запросов происходит к горячим данным.
Цель данного подхода: создавать резервные копии только свежих данных в случае аварии.
|
Данный подход не подразумевает резервное копирование всей базы данных. Данные с дисков холодного хранения (cold) будут утеряны при восстановлении. Рекомендуется предварительно настроить резервное копирование данных с дисков холодного хранения. |
|
Особенности восстановления с многоуровневым хранилищем ClickHouse:
Подробности о восстановлении из резервных копий ClickHouse приведены в разделе Восстановление из резервных копий. |
Настройка многоуровневого хранилища ClickHouse состоит из следующих этапов:
| Все действия необходимо производить на физическом сервере или виртуальной машине, на которых развернута база данных ClickHouse. |
Настройка дисков в ClickHouse
-
Подключитесь к консольному клиенту ClickHouse, выполнив команду:
clickhouse-client -
Проверьте диски в ClickHouse, выполнив SQL-запрос:
SELECT name, path, type, total_space, free_space FROM system.disks;Пример вывода
┌─name──────────┬─path───────────────────────────┬─type───┬──total_space───┬──free_space──┐ │ cold_disk_1 │ /var/lib/clickhouse/cold-1/ │ Local │ 103894020096 │ 74152300544 │ │ default │ /var/lib/clickhouse/ │ Local │ 103894020096 │ 74152300544 │ │ hot_disk_1 │ /var/lib/clickhouse/hot-1/ │ Local │ 103894020096 │ 74152300544 │ └───────────────┴─────────────────────────────────┴─────────┴────────────────┴───────────────┘
-
Проверьте, какие таблицы расположены на дисках, с помощью SQL-запроса:
SELECT database, table, disk_name, sum(bytes_on_disk) as size FROM system.parts WHERE active GROUP BY database, table, disk_name ORDER BY database, table, disk_name;Пример вывода
┌─database─────┬─table────────────┬─disk_name─────┬─────────size───┐ │ default │ example_table │ default │ 148217891135 │ │ default │ logs │ default │ 199151132155 │ │ system │ query-log │ cold_disk_1 │ 103895353096 │ │ system │ trace-log │ cold_disk_1 │ 102882828226 │ │ analytics │ events │ hot_disk_1 │ 103894020096 │ │ analytics │ sessions │ hot_disk_1 │ 103894020096 │ └───────────────┴──────────────────┴────────────────┴─────────────────┘ -
Создайте файл
storage.xmlв директории/etc/clickhouse-server/config.d/. -
Добавьте в файл
storage.xmlданные о разделенных дисках. Например:<clickhouse> <storage_configuration> <disks> <!-- HOT: быстрый диск SSD для свежих данных. --> <hot_disk_1> <path>/var/lib/clickhouse/hot-1/</path> <keep_free_space_bytes>10737418240</keep_free_space_bytes> <!-- 10GB резерв. --> </hot_disk_1> <!-- COLD: медленный диск HDD для архивных данных. --> <cold_disk_1> <path>/var/lib/clickhouse/cold-1/</path> <keep_free_space_bytes>53687091200</keep_free_space_bytes> <!-- 50GB резерв. --> </cold_disk_1> </disks> <policies> <siem_storage_policy> <volumes> <!-- При перечислении томов (volume) важен порядок, так как новые данные пишутся в первый том. --> <hot_volume> <disk>hot_disk_1</disk> </hot_volume> <cold_volume> <disk>cold_disk_1</disk> <!-- Отключение merge на диске HDD для снижения I/O. --> <prefer_not_to_merge>true</prefer_not_to_merge> </cold_volume> </volumes> <!-- Перемещение партиции на диск холодного хранения (cold), если диск горячего хранения (hot) заполнен более чем на 90%. --> <move_factor>0.1</move_factor> </siem_storage_policy> </policies> </storage_configuration> </clickhouse>Вы можете добавить новые диски в теге
<disks>. Для новых дисков также нужно добавить новые данные в теге<volumes>.
Настройка clickhouse-backup для работы с многоуровневым хранилищем
Для корректной работы утилиты clickhouse-backup необходимо исключить диски холодного хранения из файла конфигурации утилиты. Для этого:
-
Откройте файл
config.yml, выполнив команду:sudo vi /etc/clickhouse-backup/config.yml -
Добавьте следующие строки в файл в зависимости от сценария:
-
Исключение конкретных дисков
-
Исключение по типам дисков
Укажите названия дисков холодного хранения, чтобы исключить их из процедуры резервного копирования:
skip_disks: - <disk_name>Здесь:
-
<disk_name>— имя диска холодного хранения, созданного ранее, например,cold_disk_1илиs3_archive.
Укажите тип диска, чтобы исключить конкретные типы дисков:
skip_disk_types: - <disk_type>Здесь:
-
<disk_type>— тип диска, например,s3илиhdfs.
Пример заполненного файла
config.ymlgeneral: disable_progress_bar: true backups_to_keep_local: 0 backups_to_keep_remote: 0 remote_storage: s3 clickhouse: host: localhost port: 9000 username: backup_user password: "secure_password" skip_tables: - system.* - INFORMATION_SCHEMA.* - information_schema.* skip_disks: - cold_disk_1 - s3_archive # skip_disk_types: # - s3 # - hdfs timeout: 5m -
Настройка TTL для автоматической миграции данных
TTL (time-to-live) в ClickHouse — это механизм управления жизненным циклом данных. Вы можете задать правила, по которым данные могут удаляться или перемещаться между дисками по истечении определенного времени.
Чтобы настроить TTL:
-
Подключитесь к консольному клиенту ClickHouse, выполнив команду:
clickhouse-client -
Создайте таблицу с TTL или добавьте настройки TTL в существующую таблицу. Примеры SQL-запросов для создания таблицы с TTL или настройки TTL в существующей таблице:
-
Создание таблицы
-
Изменение существующей таблицы
CREATE TABLE events ON CLUSTER '{cluster}' ( event_time DateTime64(3) CODEC(Delta, ZSTD(1)), event_date Date DEFAULT toDate(event_time), event_type LowCardinality(String), severity LowCardinality(String), source_ip IPv4, dest_ip IPv4, message String CODEC(ZSTD(3)), raw_event String CODEC(ZSTD(5)) ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/events', '{replica}') PARTITION BY toYYYYMMDD(event_date) ORDER BY (event_date, event_type, event_time) -- Настройка TTL-правил. Без них данные не будут перемещаться. TTL -- Перемещает данные в том с диском холодного хранения через 7 дней. event_time + INTERVAL 7 DAY TO VOLUME '<volume_name>', -- Удаляет данные через 90 дней. Необходимо раскомментировать параметр для применения. -- event_time + INTERVAL 90 DAY DELETE. SETTINGS storage_policy = '<storage_policy>', -- Проверка TTL раз в сутки (по умолчанию 24 часа). merge_with_ttl_timeout = 86400, -- Удаление партиций без перезаписи данных. ttl_only_drop_parts = 1;Здесь:
-
<volume_name>— название тома с дисками холодного хранения из файлаstorage.xml, например,cold_volume. -
<storage_policy>— название политики хранилища из файлаstorage.xml, например,siem_storage_policy.
-- Шаг 1: Добавить настройки TTL. ALTER TABLE <table_name> ON CLUSTER '{cluster}' MODIFY TTL -- Перемещает данные в том с диском холодного хранения через 7 дней. event_time + INTERVAL 7 DAY TO VOLUME '<volume_name>', -- Удаляет данные через 90 дней. Для применения необходимо раскомментировать параметр ниже. -- event_time + INTERVAL 90 DAY DELETE; -- Шаг 2: Принудительно применить TTL (опционально). Данное действие создает нагрузку на базу данных. -- Без этого шага TTL применится при следующем слиянии (merge). Для применения необходимо раскомментировать строки ниже. -- ALTER TABLE <table_name> ON CLUSTER '{cluster}' -- MATERIALIZE TTL; -- Шаг 3: Мониторинг прогресса миграции. SELECT partition, disk_name, formatReadableSize(sum(bytes_on_disk)) as size, sum(rows) as rows FROM system.parts WHERE table = '<table_name>' AND active GROUP BY partition, disk_name ORDER BY partition DESC;Здесь:
-
<volume_name>— название тома с дисками холодного хранения из файлаstorage.xml, например,cold_volume. -
<table_name>— название таблицы ClickHouse.
-
-
Ограничьте хранение системных логов, выполнив следующие SQL-запросы:
ALTER TABLE system.query_log MODIFY TTL event_date + INTERVAL 7 DAY; ALTER TABLE system.trace_log MODIFY TTL event_date + INTERVAL 3 DAY; ALTER TABLE system.metric_log MODIFY TTL event_date + INTERVAL 3 DAY; ALTER TABLE system.text_log MODIFY TTL event_date + INTERVAL 7 DAY; ALTER TABLE system.asynchronous_metric_log MODIFY TTL event_date + INTERVAL 3 DAY;
Была ли полезна эта страница?