ClickHouse или когда мало места на диске, как добавить места? Подключить к нему дополнительные диски без танцев с бубнами.
Когда-то clickhouse поддерживал только одно устройство хранения. После версии 19.15 данные можно сохранять на разных устройствах хранения, и их можно автоматически перемещать между разными устройствами. Таким образом, clickhouse может реализовать поэтапное многоуровневое хранилище, то есть холодные и горячие данные разделяются и хранятся на разных типах устройств хранения.
В ежедневных интерактивных запросах 95% запросов обращаются к данным за последние дни, а оставшиеся 5% выполняют какие-то долгосрочные пакетные задачи. Благодаря многоуровневому хранилищу мы можем размещать последние актуальные данные на высокопроизводительных носителях, таких как SSD, а старые исторические данные - на дешевом механическом жестком диске. Кроме того, сохраняя данные на нескольких устройствах хранения для расширения емкости сервера, clickhouse также может автоматически перемещать данные между различными устройствами хранения.
Каждая таблица MergeTree имеет политику хранения, определяющую способ записи данных таблицы. Политики разделяют разные диски на один или несколько томов и определяют порядок записи данных и способы перемещения данных между дисками.
Если не указано, каждая таблица имеет политику хранения по умолчанию default, которая хранит данные по пути, указанному в поле path в файле конфигурации.
В исходном состоянии каталог хранилища данных, указанный в файле конфигурации clickhouse, является:
/var/lib/clickhouse/data/
У каждого сисадмина наступает тот самый момент, когда мало места на основном диске. Есть один или несколько свободных дисков, и вы их конечно же предварительно примонтировали в систему. Комада lsblk покажет все ваши смонтированные тома.
В нашем примере это /mnt/backup/
Конфигурирование
Создайте в нем директорию
mkdir -p /mnt/backup/clickhouse/
chown -R clickhouse.clickhouse /mnt/backup/clickhouse/
Чтобы ClikHouse получил диски в свое распоряжение, достаточно сделать простейшие действия.
Создаем файл /etc/clikhouse-server/config.d/disk.xml
Со следующим содержимым (конечно же добавляйте свой путь, в конце обязательно не забудьте / , иначе кликхаус не стартанет):
<clickhouse>
<storage_configuration>
<disks>
<hot_disk>
<path>/mnt/backup/clickhouse/</path>
</hot_disk>
</disks>
<policies>
<hot_policy>
<volumes>
<hot_volume>
<disk>hot_disk</disk>
</hot_volume>
</volumes>
<perform_ttl_move_on_insert>false</perform_ttl_move_on_insert>
</hot_policy>
</policies>
</storage_configuration>
</clickhouse>
Размещение файла конфигурации
Поместите созданный файл конфигурации в директорию /etc/clickhouse-server/config.d/disk.xml.
Перезапуск сервера:
После внесения изменений перезапустите сервер ClickHouse.
Эти шаги позволят вам использовать дополнительные диски в ClickHouse для организации многоуровневого хранения данных.
service clickhouse-server stop
service clickhouse-server start
Проверка функционала
SELECT
name,
path,
formatReadableSize(free_space) AS free,
formatReadableSize(total_space) AS total,
formatReadableSize(keep_free_space) AS reserved
FROM system.disks
Получите вывод, например такой:
Создайте новую таблицу
CREATE TABLE sampledisk
(
`id` UInt64
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 'hot_policy'
Заполните тестовую таблицу рандомными данными
insert into sampledisk select * from numbers(1000000);
insert into sampledisk select * from numbers(1000000);
insert into sampledisk select * from numbers(1000000);
insert into sampledisk select * from numbers(1000000);
Проверьте, как хранятся данные в таблице
SELECT
name,
disk_name,
path
FROM system.parts
WHERE table = 'sampledisk'
Query id: f1f0709f-8163-4a61-a069-a29e71b10492
┌─name──────┬─disk_name─┬─path──────────────────────────┐
│ all_1_1_0 │ hot_disk │ /mnt/backup/clickhouse/store/8c7/8c7e84b2-aac6-46e0-9139-5462d579c711/all_1_1_0/ │
│ all_2_2_0 │ hot_disk │ /mnt/backup/clickhouse/store/8c7/8c7e84b2-aac6-46e0-9139-5462d579c711/all_2_2_0/ │
│ all_3_3_0 │ hot_disk │ /mnt/backup/clickhouse/store/8c7/8c7e84b2-aac6-46e0-9139-5462d579c711/all_3_3_0/ │
│ all_4_4_0 │ hot_disk │ /mnt/backup/clickhouse/store/8c7/8c7e84b2-aac6-46e0-9139-5462d579c711/all_4_4_0/ │
└───────────┴───────────┴──────────────────────────────────────────────────────────────────────────────────┘
Как видите, данные сохранились в новом диске.
Когда например, места будет мало новые данные можно будет начать лить в новые таблички используя параметр при их создании:
SETTINGS storage_policy = 'hot_policy'
Чтобы добавить настройку storage_policy='hot_policy' для существующей таблицы в ClickHouse, используйте следующий синтаксис:
ALTER TABLE table_name MODIFY SETTINGS storage_policy = 'hot_policy'
Замените table_name на имя вашей таблицы. Этот запрос изменит настройки таблицы, установив для неё политику хранения hot_policy.
В ClickHouse нельзя одновременно использовать несколько политик хранения для одной таблицы. Однако, если вам нужно настроить различные политики хранения для разных типов данных в одной таблице, вы можете создать несколько разделов в таблице и назначить разные политики хранения для каждого раздела.
Обратите внимание, что метаданные по-прежнему существуют в каталоге диска по умолчанию. Фоновая задача слияния будет регулярно объединять эти небольшие задачи
части данных и создание более крупных частей данных,Для записи на эти диски используется тот же метод опроса.
Вы можете вручную запустить выполнение задачи слияния
OPTIMIZE TABLE sampledisk;
SELECT
name,
disk_name,
path
FROM system.parts
WHERE (table = 'sampledisk') AND active;
┌name──┬disk_name──┬─path─┬
│all_1_4 │ disk_name_4 │ mnt/backup/clickhouse/data/default/sampledisk/all_1_4/