Настройка хранилищ данных
ADQM позволяет хранить табличные данные на нескольких дисках различных типов, группировать их в тома и автоматически перемещать данные между томами в соответствии с указанными условиями.
Обзор
Поддерживаются следующие варианты хранения данных:
-
В локальной файловой системе. Возможно хранение данных на нескольких блочных устройствах — например, это может быть полезно при разделении данных на "горячие" (свежие данные, которые занимают малый объем и регулярно запрашиваются) и "холодные" (архивные данные, которые редко запрашиваются). В этом случае, "горячая" часть данных может быть размещена на быстрых локальных дисках (например, на NVMe SSD или в памяти), а "холодная" — на более медленных (например, HDD). Возможность добавления новых дисков также позволяет упростить процесс расширения хранилища.
-
На внешних дисках S3. Обеспечивается возможность хранить огромные объемы информации с автоматической поддержкой отказоустойчивости, надежности и расширяемости хранилища.
Поверх дисков, на которых хранятся данные, можно создавать кеш (чтобы повысить скорость выборки данных с внешних дисков с высокой латентностью) и зашифрованные диски (чтобы зашифровать конфиденциальные данные, хранящиеся в кластере ADQM).
Основные термины, используемые при конфигурировании хранилища данных в ADQM:
-
Диск (disk) — примонтированное в файловой системе дополнительное блочное устройство (локальный диск), внешнее хранилище S3, кеширующий или зашифрованный диск.
-
Том (volume) — упорядоченный набор равноценных дисков.
-
Политика хранения (storage policy) — набор томов с правилами записи данных таблицы.
Общая схема работы с хранилищами:
-
Создание политики хранения с указанием дисков (в составе томов), на которых будут храниться данные.
Диски, тома и политики хранения настраиваются через конфигурационные параметры сервиса ADQMDB (см. соответствующие разделы ниже). Назначенные параметрам значения сохраняются внутри тега <storage_configuration>
в файле /etc/clickhouse-server/config.d/storage.xml.
Диски
Управление дисками в ADQM можно осуществлять через интерфейс ADCM:
-
Перейдите к окну конфигурирования сервиса ADQMDB (ADQM cluster → Services → ADQMDB → Primary Configuration).
-
Включите опцию Show advanced.
-
Активируйте группу, соответствующую типу диска:
-
Enable additional local storage — локальные диски;
-
Enable S3 storage — диски S3;
-
Enable cache — кеширующие диски;
-
Enable encrypted storage — зашифрованные диски.
-
-
В развернувшейся секции можно добавлять/удалять и настраивать диски соответствующего типа. Ниже описаны параметры для каждого типа дисков.
Локальные дискиПараметр Описание 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…, но учитывайте, что политика хранения не должна ссылаться на отсутствующий в конфигурации диск.
-
Нажмите 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:
-
Зайдите на страницу конфигурирования сервиса ADQMDB (ADQM cluster → Services → ADQMDB → Primary Configuration).
-
Включите опцию Show advanced.
-
В секции 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 — список имен дисков внутри тома (том должен содержать хотя бы один диск). Если поверх диска с данными создан кеширующий диск, то для тома указывается кеширующий диск.
Порядок томов в политике хранения важен, так как при достижении условий на переполнение тома данные переносятся на следующий том. Порядок дисков в томах также важен — данные записываются по очереди на каждый из них.
-
-
Нажмите 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/
-
Добавьте локальные диски в ADQM на странице конфигурации сервиса ADQMDB в секции Enable additional local storage (убедитесь, что секция включена).
Конфигурирование локальных дисков -
В секции Storage policies создайте политику (
hot_to_cold
), которая включает два тома для хранения "горячих" и "холодных" данных.Конфигурирование политики храненияТом
volume_hot
содержит один SSD-диск (disk_ssd
). Максимальный размер куска данных, который может храниться на этом томе — 200 МБ. Все куски данных таблицы больше 200 МБ будут сразу записываться на томvolume_cold
, который содержит один HDD-диск (disk_hdd
). Табличный движок MergeTree постоянно выполняет фоновые слияния данных, объединяя с течением времени недавно вставленные небольшие куски в большие. То есть большие куски данных появляются после нескольких слияний, соответственно можно считать, что чем больше кусок, тем он старше.Также при заполнении диска
disk_ssd
более чем на 80% данные будут переноситься на дискdisk_hdd
в фоновом режиме. -
Нажмите 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>
-
Создайте таблицу, которая будет использовать новую политику хранения:
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);
-
Подождите некоторое время, и выполните следующий запрос, чтобы посмотреть, как распределились данные по дискам:
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 │ └───────────┴────────────┘