ClickHouse 的副本机制(Replication)是其分布式架构中的一个重要特性,用于实现数据的高可用性和容错能力。通过副本机制,ClickHouse 可以在多个节点上存储相同的数据副本,即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据。
分片(Shard)
一个分片是一个逻辑上的数据分区,包含整个数据集的一部分。
每个分片可以分布在不同的物理节点上。
数据通常按照某种规则(如哈希值或范围)分配到不同的分片中。
副本(Replica)
副本是分片的一个拷贝,存储在不同的节点上。
每个分片可以有多个副本,副本之间通过同步机制保持数据一致性。
副本的主要作用是提高数据的可靠性和查询性能。
ZooKeeper
ClickHouse 使用 Apache ZooKeeper 来管理副本之间的元数据和同步状态。
ZooKeeper 是副本机制的核心组件,负责协调副本之间的数据同步、写入顺序和故障检测。
副本机制工作原理
数据写入流程
当客户端向 ClickHouse 写入数据时,数据首先被写入到主副本(Leader Replica)。 主副本将写入操作记录到 ZooKeeper 中,确保其他副本可以看到该操作。 其他副本从 ZooKeeper 获取写入日志,并异步地将数据应用到本地存储。 一旦所有副本都完成了数据同步,写入操作才算完成。 数据读取流程
查询可以发送到任意副本。
数据读取流程
故障恢复

配置步骤
要启用 ClickHouse 的副本机制,需要在表引擎中使用支持副本的引擎(如 ReplicatedMergeTree
),并在配置文件中设置 ZooKeeper 的相关信息。
创建表:
CREATE TABLE test_replicated(id UInt64,name String,timestamp DateTime)ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/my_table', '{replica}')PARTITION BY toYYYYMM(timestamp)ORDER BY id;
/clickhouse/tables/{shard}/my_table:ZooKeeper 中的路径,用于存储该表的元数据。
{shard} 和 {replica}:占位符,分别表示分片 ID 和副本 ID,ClickHouse 会根据配置文件自动替换这些值。
副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表。
配置 ZooKeeper
在 ClickHouse 的配置文件(通常是 config.xml
或 metrika.xml
)中,添加 ZooKeeper 的配置:
<yandex><zookeeper><node index="1"><host>zookeeper1</host><port>2181</port></node><node index="2"><host>zookeeper2</host><port>2181</port></node><node index="3"><host>zookeeper3</host><port>2181</port></node></zookeeper></yandex>
配置分片和副本
在 metrika.xml
文件中定义分片和副本的拓扑结构:
<yandex><remote_servers><my_cluster><shard><internal_replication>true</internal_replication><replica><host>node1</host><port>9000</port></replica><replica><host>node2</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>node3</host><port>9000</port></replica><replica><host>node4</host><port>9000</port></replica></shard></my_cluster></remote_servers></yandex>
监控副本状态
查看副本信息
可以通过 system.replicas
表查看副本的状态:
SELECT database, table, is_leader, is_readonly, last_queue_updateFROM system.replicasWHERE is_session_expired = 0;
查看同步延迟
可以通过 system.metrics
表查看同步延迟:
SELECT metric, valueFROM system.metricsWHERE metric = 'ReplicatedFetch';
查看合并操作
可以通过 system.merges
表查看合并操作的状态:
SELECT metric, valueFROM system.metricsWHERE metric = 'ReplicatedFetch';
常见问题及解决方法
数据不同步
SYSTEM SYNC REPLICA命令手动触发数据同步。
查询性能下降
load_balancing参数)。
磁盘空间不足
原因
https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replication
clickhouse-数据副本机制参考官方地址




