什么是多主复制
多主复制允许每个副本节点都接受写入,并把写入异步复制到其他节点。它的收益是本地写入延迟低、单节点故障不影响本区域写入;代价是同一记录被并发修改时会产生冲突,必须由系统显式给出解决方案。冲突策略的选择直接决定数据是否会静默丢失。
基本信息
| 适用场景 | 多地域本地写入、离线编辑后同步、跨区域多活 |
|---|---|
| 冲突策略 | 最后写入胜出(LWW)、版本向量加应用合并、CRDT 自动收敛 |
| 主要风险 | 并发修改产生分叉,需要回放与对账,运维复杂度显著上升 |
| 辅助机制 | 写前校验、分区归属(让某类写入固定落到指定主节点) |
冲突解决策略对比
| 策略 | 机制 | 代价 |
|---|---|---|
| LWW | 按时间戳覆盖写 | 依赖时钟同步,可能丢数据 |
| 版本向量 | 检测并发修改并暴露冲突 | 需要应用层合并逻辑 |
| CRDT | 数据结构自动收敛 | 结构受限、迁移成本高 |
| 写前归属 | 按用户或键固定写入主节点 | 牺牲部分本地写优势 |
典型使用场景
- 多地域写入:每个区域本地写,降低跨地域往返延迟
- 离线编辑:移动端或边缘节点离线修改后回传合并
- 多活容灾:两个区域都能承接写入,故障时无需切换主节点
- 全球协作工具:文档、日历类数据允许多端并发修改
- 边缘聚合:边缘节点先本地暂存写入,再向中心同步
- 分区容忍:网络分裂时各侧仍可写,恢复后再解决冲突
冲突处理与观测
冲突处理与观测
# 收敛规则(示意)
# 1) 尽量让写入可交换:计数用累加、集合用并集、字符串用结构化字段
# 2) 无法交换的字段用版本向量检测并发修改,冲突交应用合并
# 3) 标记冲突记录:写入 conflict 标记与冲突来源,便于事后处理
# 观测指标
- 冲突发生率(按记录类型统计)
- 复制延迟分位(跨区域复制滞后的 P99)
- 未解决冲突数量与最旧时长LWW 依赖时钟:时钟回拨或节点间偏差会导致「较早的修改」覆盖较新内容,且丢失过程无告警。
能避免冲突就不要解决冲突:按用户或业务键固定写入所属节点,比事后合并更简单可靠。