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

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

Для развертывания стенда для практики этого руководства должно быть достаточно.

Общая схема решения

Общая схеме решения приведена ниже.

В таблице ниже я привел сводный перечень серверов.

Имя сервераРольIP-адресИспользуемые порты
(TCP)
ZK01ZooKeeper узел 1192.168.56.372181, 2888, 3888
ZK02ZooKeeper узел 2192.168.56.362181, 2888, 3888
ZK03ZooKeeper узел 3192.168.56.1582181, 2888, 3888
CH01ClickHouse узел 1192.168.56.348123, 9000
CH02ClickHouse узел 2192.168.56.1578123, 9000
CH03ClickHouse узел 3192.168.56.508123, 9000
CH04ClickHouse узел 4192.168.56.1508123, 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 завершено.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *