什么是无主复制
无主复制(Leaderless)没有主节点:客户端直接向多个副本并行读写,写入达到 W 个副本成功即返回,读取并发读 R 个副本并按版本或时间戳选取结果。当 R 加 W 大于副本数 N 时,读写集合必然相交,读者能读到较新的版本。副本间的长期一致依赖读修复、提示移交与反熵同步等收敛机制。
基本信息
| 写入 | 并行写多个副本,达到 W 个成功即返回 |
|---|---|
| 读取 | 并行读 R 个副本,按版本号或时间戳选择最新 |
| 法定人数 | R + W > N 时读写集合相交,可读到较新版本 |
| 收敛机制 | 读修复、提示移交、Merkle 树反熵同步 |
经典与改进架构
| 维度 | 经典无主复制 | 改进架构 |
|---|---|---|
| 请求路径 | 客户端直连多个副本 | 客户端或协调节点代理读写 |
| 一致性判定 | 按法定人数拼接结果 | 按版本与状态选择,部分实现引入领导者 |
| 主要优势 | 无主节点,避免选举与故障切换停顿 | 延迟更稳定,网络抖动下波动更小 |
| 典型代价 | 语义复杂,需要客户端处理合并 | 组件复杂度上升,扩展性讨论另论 |
读写参数示例
读写参数示例
# 三副本场景
N = 3 副本,W = 2,R = 2
R + W > N -> 读写集合相交,能读到较新版本
# 弱网与跨地域策略
- 可用性优先:降低 W(如 W=1),写更快但更容易读到旧值
- 一致性优先:提高 R(如 R=3),读更慢但更容易读到最新
- 折中:W=2、R=2,容忍一个副本不可用
# 收敛动作
读修复:读时发现旧副本,回写最新版本
提示移交:目标副本不可用时暂存于其他节点,事后转交
反熵:后台比对 Merkle 树差异,同步缺失数据典型使用场景
- 高可用写入:不希望因主节点故障而停止写入的场景
- 多地域写入:各区域并行写,事后解决冲突
- 弱网环境:部分副本不可达时仍能完成写入
- 时序与指标数据:按时间戳选择最新值,冲突影响有限
- 分布式键值存储:需要对等节点拓扑与自动收敛能力
- 读密集场景:通过提高 R 保证读一致性,写仍保持高可用
无主复制必须明确冲突解决规则:不同副本返回不同版本时,业务侧要能接受合并结果或明确选择策略。
只用时间戳选版本风险明显:时钟偏差或回拨会让旧值胜出,且这一过程没有告警,事后难以察觉。