Настройка многоуровневого хранилища ClickHouse

База данных ClickHouse поддерживает подход многоуровневого хранилища: горячие данные хранятся на быстрых носителях (SSD), холодные данные — на медленных носителях (HDD). Рекомендуется настроить многоуровневое хранилище, если у вас высоконагруженная инсталляция.

Данный подход выглядит следующим образом:

Уровень Тип диска Данные Резервное копирование

Cold

SATA HDD

Данные старше 7 дней

Вручную

Hot

NVMe SSD

Данные за последние 7 дней

Ежедневно

Подход многоуровневого хранилища позволяет:

  • Оптимизировать ресурсы, затрачиваемые на хранение резервных копий.

  • Ускорить резервное копирование, так как копируются только свежие данные.

  • Ускорить восстановление данных из резервной копии.

  • Охватить почти все запросы приложений, так как большинство запросов происходит к горячим данным.

Цель данного подхода: создавать резервные копии только свежих данных в случае аварии.

Данный подход не подразумевает резервное копирование всей базы данных. Данные с дисков холодного хранения (cold) будут утеряны при восстановлении.

Рекомендуется предварительно настроить резервное копирование данных с дисков холодного хранения.

Особенности восстановления с многоуровневым хранилищем ClickHouse:

  • Данные восстанавливаются на диск, установленный по умолчанию, или диск горячего хранения, даже если резервная копия была сделана с диска холодного хранения.

  • После восстановления начнется миграция данных согласно TTL-правилам.

  • При восстановлении данные с дисков холодного хранения будут утеряны.

  • Используется сценарий Disaster Recovery, который позволяет оперативно восстановить работоспособность системы из свежих данных. Подразумевается, что при аварии данные с диска холодного хранения уже находятся на безопасном отдельном диске, который можно восстановить из архивов позже.

Подробности о восстановлении из резервных копий ClickHouse приведены в разделе Восстановление из резервных копий.

Настройка многоуровневого хранилища ClickHouse состоит из следующих этапов:

Все действия необходимо производить на физическом сервере или виртуальной машине, на которых развернута база данных ClickHouse.

Настройка дисков в ClickHouse

  1. Подключитесь к консольному клиенту ClickHouse, выполнив команду:

    clickhouse-client
  2. Проверьте диски в 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  │
    └───────────────┴─────────────────────────────────┴─────────┴────────────────┴───────────────┘
  3. Проверьте, какие таблицы расположены на дисках, с помощью 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  │
    └───────────────┴──────────────────┴────────────────┴─────────────────┘
  4. Создайте файл storage.xml в директории /etc/clickhouse-server/config.d/.

  5. Добавьте в файл 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 необходимо исключить диски холодного хранения из файла конфигурации утилиты. Для этого:

  1. Откройте файл config.yml, выполнив команду:

    sudo vi /etc/clickhouse-backup/config.yml
  2. Добавьте следующие строки в файл в зависимости от сценария:

    • Исключение конкретных дисков

    • Исключение по типам дисков

    Укажите названия дисков холодного хранения, чтобы исключить их из процедуры резервного копирования:

    skip_disks:
      - <disk_name>

    Здесь:

    • <disk_name> — имя диска холодного хранения, созданного ранее, например, cold_disk_1 или s3_archive.

    Укажите тип диска, чтобы исключить конкретные типы дисков:

    skip_disk_types:
      - <disk_type>

    Здесь:

    • <disk_type> — тип диска, например, s3 или hdfs.

    Пример заполненного файла config.yml
    general:
    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:

  1. Подключитесь к консольному клиенту ClickHouse, выполнив команду:

    clickhouse-client
  2. Создайте таблицу с 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.

  3. Ограничьте хранение системных логов, выполнив следующие 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;

Была ли полезна эта страница?

Обратная связь