在大数据场景中,数据高可用是核心需求之一。ClickHouse作为高性能列式数据库,虽默认具备优异的查询性能,但需通过副本机制实现数据冗余与故障转移——这一点与MySQL主从架构思路相似,但ClickHouse副本无主从之分,配置更依赖ZooKeeper集群协调。本文将从架构解析、ZooKeeper搭建到ClickHouse副本配置,带你完整实现高可用部署。
一、ClickHouse副本架构解析
ClickHouse副本的核心目标是将数据冗余到多台机器,避免单点故障。其架构有两个关键特性:
下图为ClickHouse副本典型架构: 
注:副本配置需针对表级实现,核心是使用ReplicatedMergeTree引擎(属于MergeTree家族),官方文档可参考ClickHouse Replication。
二、前置准备:ZooKeeper集群搭建
ClickHouse副本依赖ZooKeeper协调,因此需先搭建3节点ZooKeeper集群(生产环境建议奇数节点,确保选举机制正常)。本次搭建使用机器IP为192.168.184.155、192.168.184.156、192.168.184.157,操作需在三台机器上同步执行。
2.1 下载并解压ZooKeeper
cd /data/zookeeper
tar zxvf apache-zookeeper-3.9.4-bin.tar.gz
cd apache-zookeeper-3.9.4-bin/conf
2.2 修改ZooKeeper配置文件
server.2=192.168.184.156:2888:3888
server.3=192.168.184.157:2888:3888
- 2888:节点间通信端口(Leader与Follower交互);
- 3888:选举端口(节点选举Leader时使用)。
2.3 配置节点唯一标识(myid)
- 192.168.184.155:echo 1 > /tmp/zookeeper/myid
- 192.168.184.156:echo 2 > /tmp/zookeeper/myid
- 192.168.184.157:echo 3 > /tmp/zookeeper/myid
2.4 启动ZooKeeper集群
在三台机器上分别执行启动命令:
/data/zookeeper/apache-zookeeper-3.9.4-bin/bin/zkServer.sh start
- 可通过zkServer.sh status查看节点状态(会显示Leader或Follower,确认集群正常运行)。
ZooKeeper 集群状态查看报错处理步骤:



三、ClickHouse副本配置与测试
完成ZooKeeper集群搭建后,开始配置ClickHouse副本。本次选择192.168.184.155和192.168.184.156作为两个ClickHouse副本节点。
3.1 修改ClickHouse配置文件
<node>
<host>maria-05</host>
<port>2181</port>
</node>
<node>
<host>maria-06</host>
<port>2181</port>
</node>
<node>
<host>maria-07</host>
<port>2181</port>
</node>
</zookeeper>
# 加入以下内容
192.168.184.155 maria-05
192.168.184.156 maria-06
192.168.184.157 maria-07
3.2 创建副本表(ReplicatedMergeTree引擎)
ClickHouse副本通过表级配置实现,需在两个副本节点上分别创建表,核心是确保ReplicatedMergeTree引擎的ZooKeeper路径一致。
步骤1:在192.168.184.155(副本1)创建表
create database db_repl;
— 创建副本表
CREATE TABLE db_repl.repl_test
(
EventDate DateTime, — 时间字段
CounterID UInt32, — 计数器ID
UserID UInt32 — 用户ID
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/repl_test', — ZooKeeper中存储表元数据的路径(需一致)
'maria01' — 副本名称(每个副本唯一,如maria01、maria02)
)
PARTITION BY toYYYYMM(EventDate) — 按年月分区
ORDER BY (CounterID, EventDate, intHash32(UserID)) — 排序键
SAMPLE BY intHash32(UserID); — 采样键(用于近似查询)
步骤2:在192.168.184.156(副本2)创建表
与副本1语句基本一致,仅需修改副本名称为maria02:
create database db_repl;
CREATE TABLE db_repl.repl_test
(
EventDate DateTime,
CounterID UInt32,
UserID UInt32
)
ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/repl_test', — 路径与副本1完全一致
'maria02' — 副本名称唯一
)
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);
关键原则:只要两个表在ZooKeeper中的路径(第一个参数)一致,即可自动同步数据。
3.3 测试副本数据同步
若查询结果显示插入的(2030-01-01 12:00:00, 1, 1),则说明副本同步正常。
同步测试效果示意图: 

四、总结
ClickHouse副本配置的核心是“ZooKeeper协调+ReplicatedMergeTree引擎”,关键要点可归纳为三点:
通过以上步骤,即可实现ClickHouse数据的高可用冗余,应对单点故障风险,适合生产环境部署使用。
