Настройка хранилищ данных

ADQM позволяет хранить табличные данные на нескольких дисках различных типов, группировать их в тома и автоматически перемещать данные между томами в соответствии с указанными условиями.

Обзор

Поддерживаются следующие варианты хранения данных:

  • В локальной файловой системе. Возможно хранение данных на нескольких блочных устройствах — например, это может быть полезно при разделении данных на "горячие" (свежие данные, которые занимают малый объем и регулярно запрашиваются) и "холодные" (архивные данные, которые редко запрашиваются). В этом случае, "горячая" часть данных может быть размещена на быстрых локальных дисках (например, на NVMe SSD или в памяти), а "холодная" — на более медленных (например, HDD). Возможность добавления новых дисков также позволяет упростить процесс расширения хранилища.

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

Поверх дисков, на которых хранятся данные, можно создавать кеш (чтобы повысить скорость выборки данных с внешних дисков с высокой латентностью) и зашифрованные диски (чтобы зашифровать конфиденциальные данные, хранящиеся в кластере ADQM).

 
Основные термины, используемые при конфигурировании хранилища данных в ADQM:

  • Диск (disk) — примонтированное в файловой системе дополнительное блочное устройство (локальный диск), внешнее хранилище S3, кеширующий или зашифрованный диск.

  • Том (volume) — упорядоченный набор равноценных дисков.

  • Политика хранения (storage policy) — набор томов с правилами записи данных таблицы.

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

  1. Создание и конфигурирование дисков.

  2. Создание политики хранения с указанием дисков (в составе томов), на которых будут храниться данные.

  3. Назначение таблице политики хранения.

Диски, тома и политики хранения настраиваются через конфигурационные параметры сервиса ADQMDB (см. соответствующие разделы ниже). Назначенные параметрам значения сохраняются внутри тега <storage_configuration> в файле /etc/clickhouse-server/config.d/storage.xml.

Диски

Управление дисками в ADQM можно осуществлять через интерфейс ADCM:

  1. Перейдите к окну конфигурирования сервиса ADQMDB (ADQM cluster → Services → ADQMDB → Primary Configuration).

  2. Включите опцию Show advanced.

  3. Активируйте группу, соответствующую типу диска:

    • Enable additional local storage — локальные диски;

    • Enable S3 storage — диски S3;

    • Enable cache — кеширующие диски;

    • Enable encrypted storage — зашифрованные диски.

  4. В развернувшейся секции можно добавлять/удалять и настраивать диски соответствующего типа. Ниже описаны параметры для каждого типа дисков.

    Локальные диски
    Параметр Описание

    disk_name

    Уникальное имя диска

    disk_path

    Абсолютный путь к директории, в которую смонтировано блочное устройство. При указании относительного пути (то есть без начального /) возникает ошибка, информирующая о том, что директория не существует

    keep_free_space_bytes

    Размер зарезервированного свободного места на диске (в байтах)

    Если опция Recursively create directories активирована, ADQM автоматически создаст указанные директории для локальных дисков (если эти директории не существуют) и назначит им владельца clickhouse:clickhouse с маской прав доступа 0770.

    Диски S3
    Параметр Описание

    disk_name

    Уникальное имя диска

    endpoint

    URL-адрес бакета с указанием пути к корневой директории на сервере, где хранятся данные

    access_key_id

    Идентификатор ключа доступа к S3

    secret_access_key

    Секретный ключ доступа к S3

    proxy

    Список прокси-серверов

    custom_parameters

    Другие параметры (полный список доступных для дисков S3 параметров описан в разделе Configuring the S3 disk документации ClickHouse)

    Кеширующие диски
    Параметр Описание

    parent_disk_name

    Имя родительского диска (внешнего диска S3), поверх которого создается кеширующий

    cache_disk_name

    Уникальное имя кешируещего диска

    cache_disk_path

    Абсолютный путь к директории, в которую будет записываться кеш

    max_size_bytes

    Максимальный размер кеша (в байтах)

    cache_on_write_operations

    Включает кеширование данных при любых операциях записи (запросы INSERT, фоновые слияния)

    enable_filesystem_query_cache_limit

    Позволяет ограничить размер кеша, загружаемого в рамках каждого запроса (зависит от пользовательской настройки max_query_cache_size)

    enable_cache_hits_threshold

    Число, определяющее сколько раз данные должны быть считаны, прежде чем они будут закешированы

    do_not_evict_index_and_mark_files

    Позволяет не исключать небольшие часто используемые файлы в соответствии с политикой кеширования

    max_file_segment_size_bytes

    Максимальный размер одного кеш-файла (в байтах)

    max_elements

    Ограничение на количество кеш-файлов

    Если опция Recursively create directories активирована, ADQM автоматически создаст указанные директории для хранения кеша (если эти директории не существуют) и назначит им владельца clickhouse:clickhouse с маской прав доступа 0770.

    Зашифрованные диски
    Параметр Описание

    parent_disk_name

    Имя родительного диска, поверх которого создается зашифрованный

    encrypted_disk_name

    Уникальное имя зашифрованного диска

    encrypted_disk_path

    Абсолютный или относительный путь к директории на диске, где будут сохранены данные в зашифрованном виде. При указании относительного пути создается поддиректория на родительском диске

    encryption_algorithm

    Алгоритм шифрования данных. Возможные значения: AES_128_CTR, AES_192_CTR, AES_256_CTR

    encryption_key_hex

    Ключ в виде шестнадцатиричного значения, используемый для шифрования (например, 00112233445566778899AABBCCDDEEFF)

    Если опция Recursively create directories активирована, ADQM автоматически создаст указанные директории для хранения зашифрованных данных (если эти директории не существуют) и назначит им владельца clickhouse:clickhouse с маской прав доступа 0770.

    Группу дисков по типу можно временно отключить, используя переключатель Enable…​, но учитывайте, что политика хранения не должна ссылаться на отсутствующий в конфигурации диск.

  5. Нажмите Save и выполните действие Reconfig and restart для сервиса ADQMDB, чтобы сохранить изменения в конфигурации и перезапустить сервис.

Информацию о сконфигурированных в ADQM дисках можно посмотреть в системной таблице system.disks:

SELECT
    name,
    path,
    formatReadableSize(free_space) AS free,
    formatReadableSize(total_space) AS total,
    formatReadableSize(keep_free_space) AS reserved
FROM system.disks;

При установке ADQM по умолчанию конфигурируется один локальный диск default. Данные будут сохраняться в каталог, указанный через параметр Data path в секции Directories на странице конфигурации сервиса ADQMDB (по умолчанию — /var/lib/clickhouse/).

┌─name────┬─path─────────────────┬─free──────┬─total─────┬─reserved─┐
│ default │ /var/lib/clickhouse/ │ 39.33 GiB │ 49.99 GiB │ 0.00 B   │
└─────────┴──────────────────────┴───────────┴───────────┴──────────┘

Политики хранения

Политика хранения группирует диски в один или несколько томов, а также определяет правила записи данных таблицы на диски и то, как данные будут перемещаться между томами или отдельными дисками в томах.

Добавлять и конфигурировать политики хранения можно в интерфейсе ADCM:

  1. Зайдите на страницу конфигурирования сервиса ADQMDB (ADQM cluster → Services → ADQMDB → Primary Configuration).

  2. Включите опцию Show advanced.

  3. В секции Storage policies сконфигурируйте необходимые политики хранения в списке Policies.

    Параметры политики хранения
    Параметр Описание

    policy_name

    Уникальное имя политики

    move_factor

    Доля доступного свободного места на томе. Если места становится меньше, чем указанный фактор, данные автоматически начнут перемещаться на следующий том, если он есть. Для перемещения куски данных сортируются по размеру от большего к меньшему и выбираются куски, совокупный размер которых достаточен для соблюдения условия move_factor. Если совокупный размер всех кусков недостаточен, будут перемещены все куски

    volumes

    Список томов политики (политика должна содержать хотя бы один том). Конфигурационные параметры тома:

    • volume_name — уникальное имя тома.

    • max_data_part_size_bytes — максимальный размер куска данных, который может находиться на любом диске тома. Если в результате слияния размер куска ожидается больше значения max_data_part_size_bytes, этот кусок будет записан в следующий том. В основном эта функция позволяет хранить новые данные (небольшие куски) на горячем томе (SSD) и перемещать их на холодный том (HDD), когда они достигают большого размера (см. пример ниже). Не используйте этот параметр, если политика имеет только один том.

    • prefer_not_to_merge — отключает слияние кусков данных, хранящихся на томе. Это позволяет контролировать работу ADQM с медленными дисками.

    • volume_disks — список имен дисков внутри тома (том должен содержать хотя бы один диск). Если поверх диска с данными создан кеширующий диск, то для тома указывается кеширующий диск.

    Порядок томов в политике хранения важен, так как при достижении условий на переполнение тома данные переносятся на следующий том. Порядок дисков в томах также важен — данные записываются по очереди на каждый из них.

  4. Нажмите Save и выполните действие Reconfig and restart для сервиса ADQMDB, чтобы сохранить информацию о политиках хранения в конфигурации и перезапустить сервис.

Получить информацию о политиках хранения, сконфигурированных в ADQM, можно из системной таблицы system.storage_policies:

SELECT policy_name, volume_name, disks FROM system.storage_policies;

По умолчанию ADQM содержит одну политику хранения default с одним томом, которая определяет, что все данные таблицы записываются на один диск default:

┌─policy_name─┬─volume_name─┬─disks───────┐
│ default     │ default     │ ['default'] │
└─────────────┴─────────────┴─────────────┘

Назначение таблице политики хранения

После того, как политики хранения сконфигурированы, их можно назначать таблицам. Для этого необходимо указать имя политики хранения в качестве значения параметра storage_policy, используя выражение SETTINGS при создании таблицы. Синтаксис запроса для создания таблицы MergeTree с указанием политики хранения данных в общем виде можно записать следующим образом:

CREATE TABLE <table_name> (<column_definitions>)
ENGINE = MergeTree
ORDER BY <sorting_key>
SETTINGS storage_policy = '<policy_name>';

По умолчанию таблице назначается политика хранения default.

Посмотреть, какая политика хранения используется таблицей и где хранятся данные, можно в полях storage_policy и data_paths системной таблицы system.tables. Например, выполните следующие запросы, чтобы создать таблицу без указания политики хранения, заполнить ее данными и вывести информацию о назначенной политике и директории для хранения данных:

CREATE TABLE test_table (id Int32) Engine=MergeTree ORDER BY id;
INSERT INTO test_table SELECT rand() FROM numbers(10000000);
SELECT name, storage_policy, data_paths FROM system.tables WHERE name = 'test_table' FORMAT Vertical;
Row 1:
──────
name:           test_table
storage_policy: default
data_paths:     ['/var/lib/clickhouse/store/50d/50d13b59-89d8-44ef-87f6-08ee8f71066c/']

Изменить политику хранения после создания таблицы можно c помощью запроса ALTER TABLE …​ MODIFY SETTING. При этом необходимо учесть, что новая политика должна содержать все тома и диски предыдущей политики с теми же именами.

Пример конфигурирования многоуровневого хранилища

В данном примере для хранения данных используются два блочных устройства различных типов — SSD- и HDD-диск, примонтированные в следующие каталоги:

  • /mnt/ssd/adqm/

  • /mnt/hdd/adqm/

Каждому каталогу назначен владелец clickhouse:

$ sudo chown clickhouse:clickhouse -R /mnt/ssd/adqm/ /mnt/hdd/adqm/
  1. Добавьте локальные диски в ADQM на странице конфигурации сервиса ADQMDB в секции Enable additional local storage (убедитесь, что секция включена).

    Конфигурирование локальных дисков
    Конфигурирование локальных дисков
  2. В секции Storage policies создайте политику (hot_to_cold), которая включает два тома для хранения "горячих" и "холодных" данных.

    Конфигурирование политики хранения
    Конфигурирование политики хранения

    Том volume_hot содержит один SSD-диск (disk_ssd). Максимальный размер куска данных, который может храниться на этом томе — 200 МБ. Все куски данных таблицы больше 200 МБ будут сразу записываться на том volume_cold, который содержит один HDD-диск (disk_hdd). Табличный движок MergeTree постоянно выполняет фоновые слияния данных, объединяя с течением времени недавно вставленные небольшие куски в большие. То есть большие куски данных появляются после нескольких слияний, соответственно можно считать, что чем больше кусок, тем он старше.

    Также при заполнении диска disk_ssd более чем на 80% данные будут переноситься на диск disk_hdd в фоновом режиме.

  3. Нажмите Save и выполните действие Reconfig and restart для сервиса, чтобы применить изменения.

    После этого, информация о дисках и политиках появится в соответствующих тегах внутри секции <storage_configuration> файла /etc/clickhouse-server/config.d/storage.xml.

    <storage_configuration>
        <disks>
            <disk_ssd>
                <type>local</type>
                <path>/mnt/ssd/adqm/</path>
            </disk_ssd>
            <disk_hdd>
                <type>local</type>
                <path>/mnt/hdd/adqm/</path>
            </disk_hdd>
        </disks>
        <policies>
            <hot_to_cold>
                <volumes>
                    <volume_hot>
                        <disk>disk_ssd</disk>
                        <max_data_part_size_bytes>200000000</max_data_part_size_bytes>
                    </volume_hot>
                    <volume_cold>
                        <disk>disk_hdd</disk>
                    </volume_cold>
                </volumes>
                <move_factor>0.2</move_factor>
            </hot_to_cold>
        </policies>
    </storage_configuration>
  4. Создайте таблицу, которая будет использовать новую политику хранения:

    CREATE TABLE test_table1 (id Int32) Engine=MergeTree ORDER BY id SETTINGS storage_policy = 'hot_to_cold';

    Заполните таблицу тестовыми данными, повторив несколько раз запрос на вставку данных:

    INSERT INTO test_table1 SELECT rand() FROM numbers(10000000);
  5. Подождите некоторое время, и выполните следующий запрос, чтобы посмотреть, как распределились данные по дискам:

    SELECT
        disk_name,
        formatReadableSize(bytes_on_disk) AS size
    FROM system.parts
    WHERE (table = 'test_table1') AND active;

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

    ┌─disk_name─┬─size───────┐
    │ disk_hdd  │ 530.49 MiB │
    │ disk_ssd  │ 22.26 MiB  │
    │ disk_ssd  │ 22.26 MiB  │
    └───────────┴────────────┘
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней