如果写入失败后出现节点故障,raft算法如何保持强读取一致性

时间:2017-10-10 20:17:28

标签: consensus raft

考虑三个节点(A,B,C)获取键/值数据。并且发生了以下步骤

  1. 节点A接收键:值(1:15)。这是领导者
  2. 它复制到节点B和节点C
  3. 在预提交日志中对节点B进行的输入
  4. 节点C未通过该条目
  5. 节点B的确认丢失。
  6. Nod A输入失败并将失败发送给客户
  7. 节点A仍然是领导者而B不在仲裁中
  8. 客户端从节点A读取密钥1并返回旧值。
  9. 节点A已关闭
  10. 节点B和节点C已启动
  11. 现在节点B在预先提交日志中有一个条目,而节点C没有。
  12. 此时如何进行日志匹配。节点Bgoing是提交该条目还是要丢弃它。如果它要提交那么会被读取不一致或者如果要丢弃那么在其他情况下可能会丢失数据

1 个答案:

答案 0 :(得分:2)

错误在步骤8中。每个读取操作必须复制到其他节点,否则您可能会获得过时的数据,系统应该在将虚拟值写入日志后进行读取。在你的情况下(B离线),"阅读"必须影响节点AC,因此当节点B重新联机并且A死亡时,C将能够使B&无效#39; s记录。

这是一个棘手的问题,甚至Etcd过去也遇到过它(现在它是fixed)。