ClickHouse分布式部署核心在于分片与副本的协同设计,需物理隔离存储路径、使用ReplicatedMergeTree引擎并依赖ZooKeeper实现同步与一致性。

ClickHouse 分布式部署的核心不在“存多少”,而在“怎么分、怎么同步、怎么查”。存储方案必须围绕分片(Shard)与副本(Replica)协同设计,不能只盯着磁盘目录。关键不是换路径,而是让数据按逻辑分布、物理隔离、副本可靠。
分片与副本的存储分离设计
每个分片应独占独立存储路径,避免多分片混存导致 I/O 冲突和扩容困难。例如:
- 分片 1 的所有副本(replica-01、replica-02)共用同一份 ZooKeeper 路径前缀
/clickhouse/tables/shard1/xxx,但各自本地数据目录需物理隔离,如:/data/clickhouse/shard1/replica01//data/clickhouse/shard1/replica02/ - 分片 2 对应路径为
/data/clickhouse/shard2/replica01/,与分片 1 完全不共享磁盘或 inode - 推荐按分片+副本两级目录命名,便于运维识别和故障隔离
本地表引擎必须用 ReplicatedMergeTree
分布式表本身不存数据,真正承载数据的是各节点上的本地表。要支持副本自动同步,本地表必须使用 ReplicatedMergeTree,且 ZooKeeper 路径中必须含 {shard} 和 {replica} 宏:
- ZooKeeper 路径示例:
/clickhouse/tables/{shard}/local_table—— 同一分片内所有副本指向同一路径,实现同步协调 - 副本标识示例:
{replica}—— 每个节点在metrika.xml中需明确定义唯一值,如replica01、replica02 - 若误用
MergeTree,副本间不会同步,分布式写入后查询将丢失部分数据
存储路径配置与权限管理
ClickHouse 默认用 /var/lib/clickhouse,生产环境务必迁移并严格管控:
- 修改
/etc/clickhouse-server/config.xml中的<path>和<tmp_path>,指向大容量独立磁盘,如/data/clickhouse/ - 确保
clickhouse用户对新路径有读写权限:chown -R clickhouse:clickhouse /data/clickhouse - 禁用默认
/var/lib路径,防止误写;可配合df -h监控各分片目录使用率,实现容量预警
ZooKeeper 是存储协同的“大脑”
副本间的数据同步、选主、元数据一致性,全部依赖 ZooKeeper。它不存业务数据,但决定数据能否可靠落盘:
- ZooKeeper 集群需独立部署(至少 3 节点),严禁与 ClickHouse 共用机器或磁盘
- 每个
ReplicatedMergeTree表的/clickhouse/tables/...路径下会生成log、leader_election、replicas等 znode,用于日志分发与状态同步 - 若 ZooKeeper 不可用,新写入会阻塞,已有副本仍可查本地数据,但跨副本一致性暂停


















