数据复制
解释分布式系统为什么维护多个数据副本,以及 leader-follower、多 leader 与 leaderless 复制在一致性、可用性和故障恢复上的取舍。
#concept
#growing
#backend
#architecture
[!info] related notes
- 所属 MOC:Distributed Systems MOC
- 前置:分布式系统、一致性模型
- 相邻:数据分片、Leader Election
数据复制
[!abstract] 一句话定义 Replication 在多个节点保存同一逻辑数据的副本,用冗余换可用性、读扩展或地域容灾。真正难点不是“多拷贝几份”,而是写入顺序、确认条件、延迟、冲突、故障切换和旧 Leader 隔离。
为什么需要复制
- 节点或磁盘故障后继续服务;
- 读请求分散到多个副本;
- 数据靠近不同地区用户;
- 提供灾难恢复副本;
- 为维护和升级留切换空间。
高可用副本与独立备份解决的问题不同:错误删除也可能快速复制到所有副本。
三种常见拓扑
Leader–Follower
Client writes → Leader
├→ Follower A
└→ Follower B
写路径简单、顺序清晰;Leader 是写瓶颈和故障切换中心。MySQL 主从、Kafka Partition Replica 常采用类似思想。
Multi-Leader
多个 Leader 可接受写入,再相互同步。适合多地域或离线场景,但并发冲突、循环复制和顺序更加复杂。
Leaderless / Quorum
Client 将写入发给多个副本,并从多个副本读取:
N replicas
W write acknowledgements
R read responses
常通过 Quorum、Version 和 Repair 提高读到新值的概率,但 R + W > N 不是在所有故障和实现中自动等于线性一致。
同步与异步复制
同步
提交前等待足够副本确认。
lower data-loss window
↔ higher latency / lower availability during replica issues
异步
Leader 本地提交后立即响应,副本稍后追赶。
lower write latency
↔ replication lag / possible loss on failover
实际系统常采用一个同步副本 + 其他异步副本等混合策略。
Replication Lag
Lag 会导致:
- 刚写完从 Replica 读不到;
- 用户读到倒退状态;
- Failover 后丢失已确认但未复制写入;
- 缓存/搜索投影继续消费旧位置。
常见缓解:
- Read-your-writes 路由到 Leader;
- 记录 Commit Position / LSN 并等待 Replica 追上;
- Bounded Staleness;
- 对关键读使用强一致路径;
- 监控 Lag 的时间和字节/Offset,而不只看单一数值。
Failover 的核心问题
Leader fails
→ detect failure
→ choose new leader
→ ensure new leader has acceptable state
→ fence old leader
→ redirect clients
→ reconcile divergent data
只完成“选出新 Leader”还不够。旧 Leader 恢复后若仍接受写入,会形成 Split Brain。
冲突处理
Multi-Leader / Leaderless 可能产生并发版本:
- Last-write-wins;
- Version / Vector Clock;
- Merge Function;
- CRDT;
- 用户或业务人工解决。
冲突策略必须维护业务不变量;按墙钟“最后时间戳胜出”可能因时钟偏差和覆盖更新而丢数据。
复制与分片
Replication → 同一 Shard 多副本
Sharding → 不同数据分到不同 Shard
生产集群常同时使用:先分片扩容量,再为每个 Shard 复制以容错。
观测重点
replication lag / apply lag
replica health and role
commit / quorum latency
under-replicated data
leader changes / failover time
conflict / repair rate
network and disk throughput
backup / restore verification
设计检查表
- 业务能接受多少数据丢失与读旧窗口。
- 提交成功需要多少副本确认。
- Replica Read 的一致性契约明确。
- Failover 有新 Leader 资格和旧 Leader Fencing。
- 冲突检测与合并符合业务不变量。
- 高可用、副本和 Backup 分开设计。
- Lag、Failover 和 Recovery 有演练与指标。