Quorum 一致性
- tags: 一致性
确定读写成功⌗
确定读写节点在多少节点成功才可以认为写入成功:需要保证读取时至少一个包含新值。
n 个副本的情况下,写入需要 \(w\) 个节点确认,读取必须至少查询 \(r\) 个节点,则只要 \(w + r > n\) ,读取的节点中一定会包含最新值。
- \(w\) 仲裁写(法定票数写)
- \(r\) 仲裁读(法定票说读)
一般 \(n\) 设置为奇数: \(w=r=(n+1)/2\) (向上取整)。
可容忍的失效节点数⌗
仲裁条件 \(w+r>n\) 定义了系统可容忍的失效节点数。
- \(w<n\) ,如果一个节点不可用,仍然可以处理写入。
- \(r<n\) ,如果一个节点不可用,仍然可以处理读取。
- \(n=3\),\(w=2\),\(r=2\),则可以容忍一个节点不可用
- \(n=5\),\(w=3\),\(r=3\), 则可以容忍两个节点不可用
局限性⌗
- 如果采用了 sloppy quorum,写操作的 w 节点和读取的 r 节点可能完全不同,因此无法保证写请求一定存在重叠的节点。
- 并发无法明确顺序,需要进行合并并发写入。如最后写入者获胜。
- 同时读写,写操作在一部分节点上完成,则读取新值还是旧值存在不确定性。
- 部分节点写入成功,但是最终写入失败无法回滚。
- 新值的节点失效,但恢复数据来自某个旧值,则总的新值节点数低于 w
- 边界情况