Настройка кластера СУБД ClickHouse в Docker с поддержкой репликации
8 800 555-89-02
Войти
infomaximum_logoДокументация
CTRL+K
Standalone2507
SaaS

Настройка кластера СУБД ClickHouse в Docker с поддержкой репликации

В этой статье

Настройка кластера ClickHouse с поддержкой репликации решает задачи отказоустойчивости, масштабируемости и целостности данных в распределенной аналитической системе. Репликация позволяет дублировать данные между несколькими нодами, обеспечивая их доступность даже при выходе из строя отдельных серверов. Кроме того, кластерный режим дает возможность распределять нагрузку между нодами, повышая общую производительность запросов и устойчивость системы к пиковым нагрузкам.

Запуск Docker служб кластера СУБД ClickHouse

Важно

Для обеспечения согласованности данных в кластере ClickHouse при использовании реплицированных таблиц необходимо нечетное количество нод в кластере.

Перед запуском Docker служб на каждой ноде кластера выполните те же настройки, что и при запуске ClickHouse в некластерном режиме.

Для конфигурации кластера ClickHouse при старте Docker служб на каждой ноде необходимо дополнительно указать следующие переменные окружения:

  • CLUSTER_NODE_ID — индивидуальный порядковый номер ноды
  • CLUSTER_NODES — список всех нод кластера (переменная должна быть одинаковой на всех нодах), в виде массива в формате:
    [{"id":1,"host":"node1.example.com","replica":"01-01"},{"id":2,"host":"node2.example.com","replica":"01-02"},{"id":3,"host":"node3.example.com","replica":"01-03"}]
    
    Где:
    • id — порядковый номер ноды кластера
    • host — адрес хоста ноды кластера
    • replica — макрос, указывающий на номер реплики, в формате 01-<номер_реплики>

Допустимо использовать в качестве хранилища данных только две ноды кластера. Третья нода не хранит данные, но обязательно требуется для обеспечения кворума — она выступает в роли арбитра, позволяя кластеру сохранять согласованность и избегать «расщепления» (split-brain) при временной недоступности одной из нод.

Поскольку репликация синхронизирует данные между всеми нодами, указание replica на всех трех нодах приведет к избыточному хранению и замедлению записи — данные будут дублироваться на три узла вместо двух. Поэтому базовая и рекомендуемая конфигурация — две ноды с данными и одна нода только для кворума.

В этом случае в переменной CLUSTER_NODES значение replica указывается только для нод, участвующих в хранении данных, а для арбитра — опускается. Например:

[{"id":1,"host":"node1.example.com","replica":"01-01"}, {"id":2,"host":"node2.example.com","replica":"01-02"}, {"id":3,"host":"node3.example.com"}]
Важно

Третью ноду можно развернуть на любом доступном сервере — она потребляет минимальные ресурсы, так как не хранит пользовательские данные, а лишь участвует в координации кластера, в том числе отслеживает изменения метаданных и помогает восстановить согласованность после временных сбоев. Эту ноду не следует указывать в настройках подключения к ClickHouse в приложениях — запросы направляются только на ноды с данными.

Важно

Для корректной работы кластера необходимо обеспечить сетевую доступность между нодами по портам 9000, 8123, 2181, 2180.

Защищенное взаимодействие между нодами кластера

Для обеспечения защищенного взаимодействия между нодами кластера и предотвращения несанкционированного доступа рекомендуется задать специальный ключ — секрет.

Секрет позволяет нодам кластера подтверждать подлинность друг друга. Без заданного ключа любой сервер может попытаться подключиться к кластеру.

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

Чтобы задать секрет кластера ClickHouse, создайте Docker секрет командой:

echo -n "Secure_secret_123@" | docker secret create cluster_secret -

Где Secure_secret_123@ — установленный секрет.

Заметка

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

Пример команды для запуска Docker служб на одной из нод кластера:

docker service create --name infomaximum-clickhouse-node1 \
--secret infomaximum_app_user \
--secret infomaximum_app_user_password_hash \
--secret infomaximum_external_user \
--secret infomaximum_external_user_password_hash \
--secret infomaximum_clickhouse_dhparam.pem \
--secret infomaximum_clickhouse.crt \
--secret infomaximum_clickhouse.key \
--secret cluster_secret \
--publish published=8123,target=8123,mode=host \
--publish published=9000,target=9000,mode=host \
--publish published=2181,target=2181,mode=host \
--publish published=2180,target=2180,mode=host \
--mount type=volume,src=infomaximum-clickhouse,target=/var/lib/clickhouse/ \
--mount type=volume,src=infomaximum-clickhouse-log,target=/var/log/clickhouse-server \
-e CLUSTER_NODE_ID=1 \
-e CLUSTER_NODES='[{"id":1,"host":"node1.example.com","replica":"01-01"},{"id":2,"host":"node2.example.com","replica":"01-02"},{"id":3,"host":"node3.example.com","replica":"01-03"}]' \
--restart-max-attempts 5 \
--restart-condition "on-failure" \
infomaximum/infomaximum-clickhouse:25.3.2.39

После запуска Docker служб на всех нодах кластера настройте кластерное подключение в Proceset. В качестве имени кластера укажите default.

Важно

При настройке подключения к кластерному ClickHouse на вкладке Хранилища данных в свойствах хранилища необходимо включить кластерный режим и указать все ноды в рамках кластера. Proceset будет распределять запросы к этим нодам самостоятельно. Если подключение к кластерному ClickHouse осуществляется через балансировщиков нагрузки (например, Nginx), то подключение к ClickHouse настраивается в кластерном режиме, а в качестве хоста указывается один адрес балансировщика.

Была ли статья полезна?

Да
Нет
Предыдущая
Описание структуры хранения данных в ClickHouse
infomaximum_logo_icon
8 (800) 555-89-028 (495) 150-31-45team@infomaximum.com

430006, Саранск,
Северо-восточное шоссе, д. 3

Для бизнеса
© 20102025. ООО «Инфомаксимум»
Мы используем файлы cookies, чтобы сайт был лучше для вас.
Ищете ответ? Наш чат‑бот с ИИ понимает контекст документации и предлагает самые точные результаты.
infomaximum_logo