五个交互演示:① 集群拓扑 · ② Distributed 写入路径 · ③ Distributed 查询 fan-out/fan-in · ④ Replicated 同步流程 · ⑤ 副本 vs 分片对照
下面的可视化会按你设置的「分片数 × 副本数」实时渲染节点图,并自动计算总机器数、总数据量、容错能力等指标:
下面会演示一条 INSERT 在 3 分片 × 2 副本下的完整路由。重点看 internal_replication 开关对写入流量的影响:
internal_replication=true 时,写入流量 = 1(Distributed 只发一次)+ 1(Replicated 同步)= 2 次网络传输,但客户端只等 1 次。关掉之后,Distributed 自己发 N 次,会和 ReplicatedMergeTree 双重写入,导致数据被写两遍。
跑一条聚合 SQL,看 Initiator 节点如何把请求扇出(fan-out)到各分片、各分片如何返回中间状态(partial state)、最后在 Initiator 上扇入(fan-in)合并:
uniqState这种「聚合中间状态」(HyperLogLog 草图)。所以即便每个分片有 1 亿行,Initiator 拿到的中间结果也只有几 KB,最后用uniqMerge合并出最终值。这是 ClickHouse 能秒级聚合亿行的核心秘诀。
看一次 INSERT 后,源副本如何在 ZooKeeper / Keeper 登记 log,其他副本又如何主动从「公告板」拉取并下载 Part:
同一份数据印 3 份。3 台机器各 1TB → 总数据量仍是 1TB。
原数据切成 3 份。3 台机器各 1TB → 总数据量 3TB。
| 维度 | 副本(Replica) | 分片(Shard) |
|---|---|---|
| 解决什么问题 | 高可用、读扩展 | 扩容量、写并行 |
| 数据关系 | 完全镜像 | 互不相交 |
| 3 台 × 1TB 能装多少 | 1 TB | 3 TB |
| 挂 1 台后果 | 业务无感 | 该分片不可读 |
| 实现引擎 | ReplicatedMergeTree | Distributed + 本地表 |
| 协调依赖 | ZK / Keeper | remote_servers 配置 |
| 数据如何均衡 | 一定均衡(镜像) | 看分片键设计 |
| 类比 | 同书印多本 | 百科分卷 |
| MySQL 类比 | 主从复制 | 分库分表 / Vitess |