土法炼钢 · 系统与基础设施

【列存引擎内核】ReplicatedMergeTree

文章导航

分类入口
databasedistributed
标签入口
#clickhouse#replicated-mergetree#keeper#zookeeper#replication#high-availability#24-lts

目录

单节点 MergeTree 无 HA;ReplicatedMergeTree 通过协调服务(ClickHouse Keeper 或 ZooKeeper)同步 Part 级 元数据与文件,实现多副本。24.x 文档推荐 Keeper(Raft),路径语义与 ZK 兼容。

本环境未部署双节点集群——下文给可复现步骤,不伪造 system.replicas 输出。


一、架构

flowchart TB
  CH1[Replica 1] --> K[Keeper / ZK]
  CH2[Replica 2] --> K
  INS[Insert] --> CH1
  CH1 --> LOG[Log entry]
  LOG --> CH2
  CH2 --> FETCH[Fetch Part 文件]

二、ZooKeeper / Keeper 路径

官方 ReplicatedMergeTree 约定(示意):

/table_path/replicas/<replica_name>/log
/table_path/replicas/<replica_name>/queue
/table_path/replicas/<replica_name>/parts
/table_path/leader_election
/table_path/quorum

Log entry 类型:GET_PARTMERGE_PARTSDROP_PARTMUTATE_PART 等。

sequenceDiagram
  participant C as Client
  participant R1 as Replica 1
  participant K as Keeper
  participant R2 as Replica 2
  C->>R1: INSERT
  R1->>R1: 写本地 Part
  R1->>K: 追加 log entry
  K->>R2: 通知 queue
  R2->>R1: Fetch Part 或本地执行 MERGE entry
  R2->>R2: 激活 Part

三、写入与同步

  1. 客户端 insert 到任一副本(或 Distributed)。
  2. 副本写本地 Part + 写 log。
  3. 其他副本消费 queue,fetch Part 或本地执行 merge entry。
  4. quorum 设置控制 insert 确认副本数。

四、Recovery

副本 lag:system.replicasabsolute_delayqueue_sizesystem.replication_queue 看待执行任务。

断网恢复:落后副本按 queue 补 Part;严重不一致需 SYSTEM RESTORE REPLICA 等运维操作(以官方文档为准)。


五、实验步骤(读者自测)

  1. 部署 3 节点 Keeper(或单节点 Keeper 测试)。
  2. 两节点 ReplicatedMergeTreezookeeper_path 与不同 replica_name
  3. 停一节点网络,insert 持续;恢复后观察 system.replication_queue 消化。
  4. 记录本机输出,本文不编造。
SELECT database, table, is_leader, absolute_delay, queue_size
FROM system.replicas;

六、与 Distributed 关系

ReplicatedMergeTree 是 本地表引擎;Distributed 是 分片路由(第 9 篇)。生产常:每 shard 内 ReplicatedMergeTree + 上层 Distributed。


七、学术谱系:副本新鲜度 · Keeper · 非 HTAP

分布式 OLAP 的经典问题是:副本何时可见同一 Part 集合(新鲜度)与 协调服务故障域。本篇机制(ReplicatedMergeTree log + Keeper)回答工程路径;展开 TiDB/TiFlash 式 HTAP(见 db-frontier/12)。

坐标 含义 本篇落点
异步副本 允许短暂不一致换可用 system.replicas lag
协调服务 元数据/队列共识 Keeper(ZooKeeper 历史)
与 C-Store 单机 RS 为主 CH 把 RS 式 Part 复制到多节点

7.1 争论与开放问题


八、小结

副本一致性在 Part + log 层;Keeper 是协调中枢;lag 从 system.replicas 查。


上一篇索引与跳数索引

下一篇系列索引 — Distributed 规划中


参考资料

核心论文 / 坐标

  1. Stonebraker et al., C-Store, VLDB 2005(RS 只读存储直觉;A 级)——本篇将其扩展到多副本 Part。
  2. db-frontier/12 HTAP(新鲜度档位对照;不并入本系列正文结论)。

规范 / 源码 / 文档

  1. ClickHouse Documentation, ReplicatedMergeTreeClickHouse Keeper(A 级)。
  2. ClickHouse Source, StorageReplicatedMergeTree.cpp(A 级)。

ReplicatedMergeTree 日志

协调服务(ZooKeeper 或 ClickHouse Keeper)路径示例(官方 ReplicatedMergeTree):

/table_path/replicas/replica_name/log          # 待执行 entry
/table_path/replicas/replica_name/queue        # 本地队列
/table_path/replicas/replica_name/parts         # 已确认 part
/table_path/leader_election                    # leader 选举

Log entry 类型:GET_PART、MERGE_PARTS、DROP_PART、MUTATE_PART 等。

副本一致性

Insert 在 leader(或任意副本写 log);follower 拉 part 文件或本地 merge。system.replicassystem.replication_queue 诊断 lag。

Keeper

24.x 推荐 ClickHouse Keeper 替代 ZooKeeper(Raft);路径语义兼容,运维组件不同。

Merge selector

SimpleMergeSelector / TTLMergeSelector 等根据 Part 大小、年龄、分区挑选 merge 任务;目标减少 Part 数且控制写放大。

ReplacingMergeTree

replace 版本列默认 is_deleted 或显式 version;merge 同排序键保留 version 最大。查询仍可能见重复行,除非 FINAL 或应用层去重。

CollapsingMergeTree

Sign 列 +1/-1 表示插入与撤销;merge 折叠成 net 行。适合变更流而非物理 DELETE。

Mutation 路径

ALTER TABLE UPDATE/DELETEMutationCommands 队列 → 后台读 Part 重写新 Part → 原子替换。堆积时 system.mutations 可见;与 merge 争用 BackgroundSchedulePool

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。

2026-07-01 · database / distributed

【流式数据处理】副本、ISR 与 Consumer Group

从 Leader/Follower 复制、HW/LEO/ISR 到 acks 与 min.insync.replicas 的 durability 边界,再到 consumer group 分区分配、rebalance 代价,以及 offset 提交与 Flink checkpoint 的分工。

2026-07-07 · database / distributed

【分布式 OLAP 查询引擎】引擎选型与数据平台阅读地图

用决策树收束 Trino/Spark/ClickHouse/DuckDB/DataFusion/PostgreSQL 的适用边界:交互式联邦、批 ETL、嵌入式分析、流批一体各走哪条路径;给出能力对照表(无吞吐排名)与 postgresql→columnar→lakehouse→stream→query-engine 全栈阅读顺序,闭合数据平台栈。

2026-07-01 · database / distributed

【流式数据处理】交付语义:从 at-most-once 到 exactly-once

用 Source、引擎、Sink 三层模型拆解 at-most-once、at-least-once、exactly-once 的组合规则与最弱环决定律;对照 Flink checkpoint 模式、Kafka 事务与幂等 producer、重复消费/重复写入的三类修复手段,为两阶段提交 sink 铺垫。


By .