Репликация в ClickHouse осуществляется асинхронно и управляется с помощью ZooKeeper. Она обеспечивает высокую доступность, создавая несколько реплик одних и тех же данных на разных узлах.
Ключевые особенности репликации в ClickHouse
✅ Движок ReplicatedMergeTree обеспечивает автоматическую синхронизацию данных.
✅ ZooKeeper управляет репликами и предотвращает конфликты.
✅ Автоматическое переключение на резервные реплики в случае сбоя.
1. Архитектура репликации в ClickHouse
2. Шаги для настройки репликации в ClickHouse
✅ Шаг 1: Установить и настроить ZooKeeper
ZooKeeper необходим для управления реплицированными таблицами.
Установите ZooKeeper на каждом узле:
sudo apt-get install -y zookeeper
Конфигурация ZooKeeper (/etc/clickhouse-server/config.xml):
<zookeeper>
<node index="1">
<host>zoo1</host>
<port>2181</port>
</node>
<node index="2">
<host>zoo2</host>
<port>2181</port>
</node>
<node index="3">
<host>zoo3</host>
<port>2181</port>
</node>
</zookeeper>
Перезапустите ClickHouse:
sudo systemctl restart clickhouse-server
✅ Шаг 2: Определите узлы кластера в ClickHouse (config.xml)
На всех узлах ClickHouse обновите /etc/clickhouse-server/config.xml:
<remote_servers>
<my_cluster>
<shard>
<replica>
<host>clickhouse1</host>
<port>9000</port>
</replica>
<replica>
<host>clickhouse2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<replica>
<host>clickhouse3</host>
<port>9000</port>
</replica>
<replica>
<host>clickhouse4</host>
<port>9000</port>
</replica>
</shard>
</my_cluster>
</remote_servers>
Перезапустите ClickHouse:
sudo systemctl restart clickhouse-server
✅ Шаг 3: Создайте реплицированные таблицы на каждом узле
Каждая реплика должна содержать таблицу ReplicatedMergeTree с уникальным путем ZooKeeper.
На clickhouse1 (Первая реплика):
CREATE TABLE events (
event_id UInt32,
event_time DateTime,
user_id UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/shard1/events', 'replica_1')
ORDER BY event_time;
На clickhouse2 (Вторая реплика для Шарда 1):
CREATE TABLE events (
event_id UInt32,
event_time DateTime,
user_id UInt32
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/shard1/events', 'replica_2')
ORDER BY event_time;
✅ Каждая реплика использует один и тот же путь в ZooKeeper (/clickhouse/tables/shard1/events
).
✅ Имя реплики (replica_1
, replica_2
) должно быть уникальным для каждого узла.
✅ Шаг 4: Создайте распределенную таблицу для маршрутизации запросов
Распределенная таблица направляет запросы на правильные шарды.
На всех узлах:
CREATE TABLE events_distributed ON CLUSTER my_cluster AS events
ENGINE = Distributed(my_cluster, default, events, rand());
✅ Запросы теперь автоматически маршрутизируются к доступным репликам.
✅ Шаг 5: Проверьте статус репликации
Проверьте статус репликации:
SELECT * FROM system.replicas;
Для ручной синхронизации реплик:
SYSTEM SYNC REPLICA events;
✅ Если одна реплика выходит из строя, кластер продолжает работать.
✅ Шаг 6: Тестирование репликации
Вставьте данные в распределенную таблицу:
INSERT INTO events_distributed VALUES (1, now(), 1001);
Проверьте, что данные реплицированы на узлы:
На clickhouse1:
SELECT * FROM events;
На clickhouse2:
SELECT * FROM events;
✅ Данные автоматически копируются между репликами!
3. Как ClickHouse обрабатывает отказ реплики
Если clickhouse1 выходит из строя:
- ZooKeeper обнаруживает сбой.
- Запросы автоматически перенаправляются на clickhouse2.
- Когда clickhouse1 восстанавливается, выполните:
SYSTEM SYNC REPLICA events;
✅ Репликация обеспечивает нулевой простой!
4. Резюме: Шаги для настройки репликации
Шаг | Действие |
---|---|
✅ Установите ZooKeeper | На всех узлах |
✅ Настройте ZooKeeper в ClickHouse | Измените /etc/clickhouse-server/config.xml |
✅ Определите узлы кластера | Обновите remote_servers в ClickHouse |
✅ Создайте реплицированные таблицы | Используйте ReplicatedMergeTree на каждой реплике |
✅ Создайте распределенную таблицу | Маршрутизация запросов между репликами |
✅ Проверьте репликацию | Выполните SELECT * FROM system.replicas |
✅ Обработайте отказ | Запросы автоматически перенаправляются |
🚀 Рекомендация:
Используйте ReplicatedMergeTree для отказоустойчивости.
Используйте Distributed Table для балансировки запросов между репликами.
Используйте SYSTEM SYNC REPLICA для ручного восстановления узлов после сбоев.