ClickHouse 数据复制(Replication) 是构建高可用、可扩展 OLAP 系统的核心能力。它允许数据在多个节点之间自动同步,防止单点故障,支持读写负载均衡,是生产环境部署 ClickHouse 集群的必备功能。
本篇将全面、深入地详解 ClickHouse 的数据复制机制,涵盖其原理、架构、配置、使用场景及最佳实践。
🧩 一、什么是 ClickHouse 数据复制?
✅ 定义
ClickHouse 的数据复制是指:同一份数据在多个服务器(副本)上存储并保持一致,当某个节点宕机时,其他副本仍可提供服务。
🔁 它是表级别的复制,不是整个实例的复制。
✅ 核心目标
- ✅ 高可用(High Availability):节点宕机不影响服务
- ✅ 读扩展(Read Scalability):查询可分发到多个副本
- ✅ 自动故障转移(Failover):客户端可自动切换副本
- ✅ 数据安全:防止单盘/单机故障导致数据丢失
🏗️ 二、复制架构与核心组件
ClickHouse 的复制依赖两个核心组件:
1. Replicated 表引擎
如:
ReplicatedMergeTreeReplicatedReplacingMergeTreeReplicatedAggregatingMergeTree
这些引擎在 MergeTree 基础上增加了复制能力。
2. ZooKeeper 或 ClickHouse Keeper
- 存储元数据、副本状态、同步队列、选举信息
- 协调多个副本之间的数据同步
- 使用 ZooKeeper(传统)或 ClickHouse Keeper(v21+ 内置替代)
📌 注意:数据本身不经过 ZooKeeper 传输,ZooKeeper 只负责协调。
🔗 三、复制工作原理(以 ReplicatedMergeTree 为例)
1. 数据写入流程
客户端
│
↓
[Replica 1] → 写入本地 part(数据片段)
│
↓
向 ZooKeeper 提交“写入任务”(包含数据路径、校验和)
│
↓
[Replica 2,3...] 监听 ZooKeeper,发现新任务
│
↓
其他副本从 Replica 1 下载数据(P2P 方式)
│
↓
所有副本本地合并数据,保持一致
✅ 特点:
- 写入任意一个副本即可
- 其他副本通过 ZooKeeper 协调自动同步
- 数据通过 P2P(点对点) 传输,不经过 ZooKeeper
2. 合并(Merge)同步
- 后台合并(Merge)任务也通过 ZooKeeper 协调。
- 所有副本执行相同的合并策略,确保最终一致性。
3. 故障恢复
- 若某副本宕机,重启后会从 ZooKeeper 获取缺失的任务,自动补同步。
- 支持断点续传、数据校验。
🛠️ 四、配置复制(实战示例)
1. 准备环境
- 至少 2 个 ClickHouse 节点(node1, node2)
- 1 个 ZooKeeper 集群(或 ClickHouse Keeper)
2. 配置 ZooKeeper(config.xml)
在每个 ClickHouse 节点的 config.xml 中添加:
<zookeeper>
<node>
<host>zoo1</host>
<port>2181</port>
</node>
<node>
<host>zoo2</host>
<port>2181</port>
</node>
<node>
<host>zoo3</host>
<port>2181</port>
</node>
</zookeeper>
3. 创建复制表
CREATE TABLE user_log_replicated (
user_id UInt32,
event_date Date,
action String,
duration UInt32
) ENGINE = ReplicatedMergeTree(
'/clickhouse/tables/{shard}/user_log', -- ZooKeeper 路径
'{replica}' -- 副本标识(自动替换)
)
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, user_id);
🔍 参数说明:
{shard}:分片标识(如shard1){replica}:副本标识(如replica1,replica2),通常用主机名或 IP- 路径必须唯一,不同表不能共用路径
4. 部署多副本集群(典型结构)
| 分片(Shard) | 副本(Replica) | 节点 |
|---|---|---|
| shard1 | replica1 | node1 |
| shard1 | replica2 | node2 |
| shard2 | replica1 | node3 |
| shard2 | replica2 | node4 |
✅ 每个分片有 2 个副本,实现高可用。
5. 使用 Distributed 表(跨分片查询)
CREATE TABLE user_log_all ON CLUSTER 'your_cluster'
ENGINE = Distributed(
'your_cluster', -- 集群名(在 config.xml 中定义)
'default', -- 数据库
'user_log_replicated', -- 本地表
rand()
);
✅ 查询
user_log_all会自动路由到所有分片的副本,支持负载均衡。
🔄 五、ClickHouse Keeper(替代 ZooKeeper)
从 v21 开始,ClickHouse 提供了内置的 ClickHouse Keeper,功能等价于 ZooKeeper,但更轻量、易管理。
启用方式(config.xml)
<clickhouse_keeper_server>
<tcp_port>9181</tcp_port>
<server_id>1</server_id>
<coordination_settings>
<operation_timeout_ms>10000</operation_timeout_ms>
</coordination_settings>
<raft_configuration>
<server>
<id>1</id>
<hostname>node1</hostname>
<port>9444</port>
</server>
<server>
<id>2</id>
<hostname>node2</hostname>
<port>9444</port>
</server>
</raft_configuration>
</clickhouse_keeper_server>
✅ 优点:
- 无需额外部署 ZooKeeper
- 配置统一,运维更简单
- 性能接近 ZooKeeper
⚠️ 六、复制的注意事项与陷阱
| 问题 | 说明 | 建议 |
|---|---|---|
不要使用 POPULATE | CREATE ... AS SELECT with POPULATE 会在每个副本上执行,导致数据重复 | 手动插入一次即可 |
| ZooKeeper 单点故障 | ZooKeeper 集群必须高可用(至少 3 节点) | 使用 3/5 节点 ZooKeeper 集群 |
| 网络分区(脑裂) | 网络中断可能导致副本不一致 | 合理设置超时和选举策略 |
| 写入性能 | 多副本需同步,写入延迟略高 | 通常可接受,吞吐仍很高 |
| 磁盘空间 | 每个副本都存储完整数据,空间翻倍 | 按副本数规划存储 |
| ALTER TABLE 风险 | ALTER 操作可能在副本间不一致 | 使用 ON CLUSTER 或逐个执行 |
✅ 七、复制的最佳实践
| 场景 | 推荐做法 |
|---|---|
| 副本数量 | 通常 2 副本(平衡可用性与成本) |
| ZooKeeper | 至少 3 节点,独立部署 |
| ClickHouse Keeper | 新集群推荐使用 |
| 表命名 | 区分本地表(_replicated)和分布式表(_all) |
| 写入 | 写任意副本,或通过负载均衡器 |
| 查询 | 使用 Distributed 表,自动路由 |
| 监控 | 监控 system.replication_queue, system.replicas |
| 备份 | 备份一个副本即可 |
📊 八、监控复制状态
1. 查看副本状态
SELECT
table,
is_leader,
is_readonly,
is_session_expired,
queue_size,
absolute_delay
FROM system.replicas
WHERE database = 'default';
关键字段:
is_leader:是否为当前主副本(协调者)queue_size:同步队列积压任务数absolute_delay:延迟秒数
2. 查看同步队列
SELECT * FROM system.replication_queue WHERE database = 'default';
🎯 九、总结:ClickHouse 复制的核心价值
| 能力 | 说明 |
|---|---|
| 🛡️ 高可用 | 任意副本宕机,服务不中断 |
| 📈 读扩展 | 查询可分发到多个副本 |
| 🔁 自动同步 | 数据变更自动传播 |
| 🔄 故障恢复 | 重启后自动补同步 |
| 🧩 与分片结合 | 构建完整的分布式 OLAP 集群 |
🎯 ClickHouse 复制不是“可选功能”,而是生产环境的“生命线”。
3480

被折叠的 条评论
为什么被折叠?



