В этой публикации я приведу опорную инструкцию с опорными шагами о том, как выполняется развертывание кластера ClickHouse с координацией через Apache ZooKeeper. В прошлой публикации я привел инструкцию по развертыванию сервера ClickHouse в одниночном варианте.
Для развертывания стенда для практики этого руководства должно быть достаточно.
Общая схема решения
Общая схеме решения приведена ниже.

В таблице ниже я привел сводный перечень серверов.
| Имя сервера | Роль | IP-адрес | Используемые порты (TCP) |
| ZK01 | ZooKeeper узел 1 | 192.168.56.37 | 2181, 2888, 3888 |
| ZK02 | ZooKeeper узел 2 | 192.168.56.36 | 2181, 2888, 3888 |
| ZK03 | ZooKeeper узел 3 | 192.168.56.158 | 2181, 2888, 3888 |
| CH01 | ClickHouse узел 1 | 192.168.56.34 | 8123, 9000 |
| CH02 | ClickHouse узел 2 | 192.168.56.157 | 8123, 9000 |
| CH03 | ClickHouse узел 3 | 192.168.56.50 | 8123, 9000 |
| CH04 | ClickHouse узел 4 | 192.168.56.150 | 8123, 9000 |
Не забудьте открыть соответствующие порты в брандмауэре.
Версии ПО
Операционная система: Rocky Linux release 9.8 (Blue Onyx).
Apache ZooKeeper: 3.8.6.
ClickHouse: 26.5.2.39.
Предварительная настройка серверов
Перед непосредственным развертыванием кластера ClickHouse необходимо выполнить предварительную подготовку серверов:
1. Установить актуальные обновления:
dnf update
2. Установить необходимы утилиты:
dnf -y install wget mc nano yum-utils
3. Настроить разрешения имен (если в контуре с серверами нет DNS сервера):
cat << 'EOF' >> /etc/hosts
192.168.56.37 ZK01 ZK01.itproblog.ru
192.168.56.36 ZK02 ZK02.itproblog.ru
192.168.56.158 ZK03 ZK03.itproblog.ru
192.168.56.34 CH01 CH01.itproblog.ru
192.168.56.157 CH02 CH02.itproblog.ru
192.168.56.50 CH03 CH03.itproblog.ru
192.168.56.150 CH04 CH04.itproblog.ru
EOF
Установка Apache ZooKeeper
Сначала нам нужен кластер ZooKeeper. Приступаем к его развертыванию:
1. Предварительно устанавливаем JAVA:
dnf install -y java-11-openjdk-headless
2. Затем устанавливаем непосредственно ZooKeeper:
cd /opt
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.6/apache-zookeeper-3.8.6-bin.tar.gz
tar -xzf apache-zookeeper-3.8.6-bin.tar.gz
mv apache-zookeeper-3.8.6-bin zookeeper
rm -f apache-zookeeper-3.8.6-bin.tar.gz
3. Редактируем конфигурационный файл zoo.cfg на каждом из узлов ZooKeeper:
nano /opt/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/lib/zookeeper
clientPort=2181
maxClientCnxns=60
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=zk01.itproblog.ru:2888:3888
server.2=zk02.itproblog.ru:2888:3888
server.3=zk03.itproblog.ru:2888:3888
4. Далее для каждого узла ZooKeeper нужно задать уникальный ID:
# на ZK01:
mkdir /var/lib/zookeeper
echo "1" | sudo tee /var/lib/zookeeper/myid
# на ZK02:
touch /var/lib/zookeeper/myid
echo "2" | sudo tee /var/lib/zookeeper/myid
# на ZK03:
touch /var/lib/zookeeper/myid
echo "3" | sudo tee /var/lib/zookeeper/myid
5. Пробуем запустить ZooKeeper:
/opt/zookeeper/bin/zkServer.sh start
[root@ZK01 opt]# /opt/zookeeper/bin/zkServer.sh start
/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@ZK01 opt]#

6. Проверяем статус сервиса:
/opt/zookeeper/bin/zkServer.sh status
[root@ZK02 opt]# /opt/zookeeper/bin/zkServer.sh status
/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

Один из узлов будет лидер (leader), два остальных узла будут ведомые (follower).
[root@ZK03 opt]# /opt/zookeeper/bin/zkServer.sh status
/bin/java
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@ZK03 opt]#

Если что-то пошло не так, то смотрим журналы вот тут — /opt/zookeeper/logs
Развертывание кластера ClickHouse
Теперь можем переходить к развертыванию кластера ClickHouse:
1. Добавляем репозиторий ClickHouse:
yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
2. Затем устанавливаем сервер и клиент ClickHouse:
dnf install -y clickhouse-server clickhouse-client
3. Настроим прослушивание сервиса на всех IP-адресах:
cat << 'EOF' > /etc/clickhouse-server/config.d/listen.xml
<clickhouse>
<listen_host>0.0.0.0</listen_host>
</clickhouse>
EOF
4. Следующим шагом укажем серверу ClickHouse на каких серверах искать узлы ZooKeeper:
cat << 'EOF' > /etc/clickhouse-server/config.d/zookeeper.xml
<clickhouse>
<zookeeper>
<node>
<host>ZK01.itproblog.ru</host>
<port>2181</port>
</node>
<node>
<host>ZK01.itproblog.ru</host>
<port>2181</port>
</node>
<node>
<host>ZK01.itproblog.ru</host>
<port>2181</port>
</node>
</zookeeper>
</clickhouse>
EOF
5. Теперь индивидуальные конфигурации для каждого из узлов. Начнем с узла CH01:
cat << 'EOF' > /etc/clickhouse-server/config.d/cluster.xml
<clickhouse>
<remote_servers>
<cluster_2shards_2replicas>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch01.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch02.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch03.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch04.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
</cluster_2shards_2replicas>
</remote_servers>
<macros>
<shard>01</shard>
<replica>replica1</replica>
</macros>
</clickhouse>
EOF
6. Конфигурация для узла CH02:
cat << 'EOF' > /etc/clickhouse-server/config.d/cluster.xml
<clickhouse>
<remote_servers>
<cluster_2shards_2replicas>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch01.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch02.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch03.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch04.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
</cluster_2shards_2replicas>
</remote_servers>
<macros>
<shard>01</shard>
<replica>replica2</replica>
</macros>
</clickhouse>
EOF
7. Для узла CH03 нужно внести следующие изменения в конфигурационный файл:
cat << 'EOF' > /etc/clickhouse-server/config.d/cluster.xml
<clickhouse>
<remote_servers>
<cluster_2shards_2replicas>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch01.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch02.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch03.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch04.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
</cluster_2shards_2replicas>
</remote_servers>
<macros>
<shard>02</shard>
<replica>replica1</replica>
</macros>
</clickhouse>
EOF
8. Заключительным шагом вносим изменения в конфигурационный файл на узле CH04:
cat << 'EOF' > /etc/clickhouse-server/config.d/cluster.xml
<clickhouse>
<remote_servers>
<cluster_2shards_2replicas>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch01.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch02.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch03.itproblog.ru</host>
<port>9000</port>
</replica>
<replica>
<host>ch04.itproblog.ru</host>
<port>9000</port>
</replica>
</shard>
</cluster_2shards_2replicas>
</remote_servers>
<macros>
<shard>02</shard>
<replica>replica2</replica>
</macros>
</clickhouse>
EOF
9. Теперь запускаем сервис ClickHouse на каждом из узлов:
sudo systemctl enable --now clickhouse-server
10. Проверяем статус сервиса ClickHouse на каждом из четырех узлов:
systemctl status clickhouse-server
[root@CH04 admin]# systemctl status clickhouse-server
● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
Loaded: loaded (/usr/lib/systemd/system/clickhouse-server.service; enabled; preset: disabled)
Active: active (running) since Sun 2026-06-14 11:06:09 UTC; 36s ago
Main PID: 71983 (clickhouse-serv)
Tasks: 681 (limit: 22960)
Memory: 330.8M (peak: 336.5M)
CPU: 5.532s
CGroup: /system.slice/clickhouse-server.service
├─71975 clickhouse-watchdog "" "" "" "" "" "" "" --config=/etc/clickhouse-server/config.xml --pid-file=/run/cli>
└─71983 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server>
Jun 14 11:06:07 CH04.plex.local systemd[1]: Starting ClickHouse Server (analytic DBMS for big data)...
Jun 14 11:06:07 CH04.plex.local clickhouse-server[71975]: Processing configuration file '/etc/clickhouse-server/config.xml'.
Jun 14 11:06:07 CH04.plex.local clickhouse-server[71975]: Merging configuration file '/etc/clickhouse-server/config.d/cluste>
Jun 14 11:06:07 CH04.plex.local clickhouse-server[71975]: Merging configuration file '/etc/clickhouse-server/config.d/listen>
Jun 14 11:06:07 CH04.plex.local clickhouse-server[71975]: Merging configuration file '/etc/clickhouse-server/config.d/zookee>
Jun 14 11:06:07 CH04.plex.local clickhouse-server[71975]: Logging trace to /var/log/clickhouse-server/clickhouse-server.log
Jun 14 11:06:07 CH04.plex.local clickhouse-server[71975]: Logging errors to /var/log/clickhouse-server/clickhouse-server.err>
Jun 14 11:06:07 CH04.plex.local systemd[1]: clickhouse-server.service: Supervising process 71983 which is not our child. We'>
Jun 14 11:06:09 CH04.plex.local systemd[1]: Started ClickHouse Server (analytic DBMS for big data).

Сервис должен быть запущен.
В случае проблем нужно смотреть журналы вот тут — /var/log/clickhouse-server
11. Проверим статус кластера через консольный клиент:
clickhouse-client --host ch01 --query "SELECT * FROM system.clusters"
[root@CH01 admin]# clickhouse-client --host ch01 --query "SELECT * FROM system.clusters"
cluster_2shards_2replicas 1 1 1 1 ch01.itproblog.ru 192.168.56.34 9000 1 default 0 0 0 0 \N \N \N \N
cluster_2shards_2replicas 1 1 1 2 ch02.itproblog.ru 192.168.56.157 9000 0 default 0 0 0 0 \N \N \N \N
cluster_2shards_2replicas 2 1 1 1 ch03.itproblog.ru 192.168.56.50 9000 0 default 0 0 0 0 \N \N \N \N
cluster_2shards_2replicas 2 1 1 2 ch04.itproblog.ru 192.168.56.150 9000 0 default 0 0 0 0 \N \N \N \N
default 1 1 0 1 localhost ::1 9000 1 default 0 0 0 0\N \N \N \N
[root@CH01 admin]#

12. Заключительным шагом я установлю пароль для пользователя default. Этот шаг опциональный — если его не выполнить, то подключаться нужно будет без указания пароля для пользователя default. Я же установлю пароль для пользователя default:
cat << 'EOF' > /etc/clickhouse-server/users.d/default.xml
<clickhouse>
<users>
<default>
<password>Qwerty123</password>
</default>
</users>
</clickhouse>
EOF
13. Заключительным шагом нужно перезапустить сервис:
systemctl restart clickhouse-server
Проверка подключения
Для подключения к ClickHouse я использую Dbeaver.
Настроим подключение:
1. Выбираем соответствующие тип подключения.

2. В качестве адреса сервера можно использовать адрес любого из четырех узлов. Схема и пользователь — default. Пароль пустой, либо если вы задали свой пароль (шаг 12 из предыдущего раздела), то укажите ваш кастомный пароль:

3. Протестируем подключение:

4. Подключение выполнено успешно:

Развертывание кластера ClickHouse с координацией через Apache ZooKeeper завершено.
