确定读写成功

确定读写节点在多少节点成功才可以认为写入成功:需要保证读取时至少一个包含新值。

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\), 则可以容忍两个节点不可用

局限性

  1. 如果采用了 sloppy quorum,写操作的 w 节点和读取的 r 节点可能完全不同,因此无法保证写请求一定存在重叠的节点。
  2. 并发无法明确顺序,需要进行合并并发写入。如最后写入者获胜
  3. 同时读写,写操作在一部分节点上完成,则读取新值还是旧值存在不确定性。
  4. 部分节点写入成功,但是最终写入失败无法回滚。
  5. 新值的节点失效,但恢复数据来自某个旧值,则总的新值节点数低于 w
  6. 边界情况