多主复制

多个节点都能接受写入并互相复制,提升本地写入可用性;代价是写冲突必须显式解决(最后写入胜出、版本合并或应用层合并)。

什么是多主复制

多主复制允许每个副本节点都接受写入,并把写入异步复制到其他节点。它的收益是本地写入延迟低、单节点故障不影响本区域写入;代价是同一记录被并发修改时会产生冲突,必须由系统显式给出解决方案。冲突策略的选择直接决定数据是否会静默丢失。

基本信息

适用场景多地域本地写入、离线编辑后同步、跨区域多活
冲突策略最后写入胜出(LWW)、版本向量加应用合并、CRDT 自动收敛
主要风险并发修改产生分叉,需要回放与对账,运维复杂度显著上升
辅助机制写前校验、分区归属(让某类写入固定落到指定主节点)

冲突解决策略对比

策略机制代价
LWW按时间戳覆盖写依赖时钟同步,可能丢数据
版本向量检测并发修改并暴露冲突需要应用层合并逻辑
CRDT数据结构自动收敛结构受限、迁移成本高
写前归属按用户或键固定写入主节点牺牲部分本地写优势

典型使用场景

  • 多地域写入:每个区域本地写,降低跨地域往返延迟
  • 离线编辑:移动端或边缘节点离线修改后回传合并
  • 多活容灾:两个区域都能承接写入,故障时无需切换主节点
  • 全球协作工具:文档、日历类数据允许多端并发修改
  • 边缘聚合:边缘节点先本地暂存写入,再向中心同步
  • 分区容忍:网络分裂时各侧仍可写,恢复后再解决冲突

冲突处理与观测

冲突处理与观测
# 收敛规则(示意)
# 1) 尽量让写入可交换:计数用累加、集合用并集、字符串用结构化字段
# 2) 无法交换的字段用版本向量检测并发修改,冲突交应用合并
# 3) 标记冲突记录:写入 conflict 标记与冲突来源,便于事后处理
# 观测指标
- 冲突发生率(按记录类型统计)
- 复制延迟分位(跨区域复制滞后的 P99)
- 未解决冲突数量与最旧时长
LWW 依赖时钟:时钟回拨或节点间偏差会导致「较早的修改」覆盖较新内容,且丢失过程无告警。
能避免冲突就不要解决冲突:按用户或业务键固定写入所属节点,比事后合并更简单可靠。

易错点

  • 直接使用时间戳覆盖解决冲突,数据静默丢失且无痕迹可查
  • 冲突处理逻辑未测试,真出故障时才临时讨论合并规则
  • 复制延迟未监控,读到旧值被误判为数据丢失
  • 所有记录都允许多点写入,实际业务语义只支持单点归属,冲突率居高不下

数据来源与参考

  • 《数据密集型应用系统设计》(Kleppmann)第 5 章
  • CRDT 相关论文(Shapiro 等,2011)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌