想象一个 3 节点 raft 集群。每个节点都同步有日志 [1,2,3] 并且条目 3 由领导者提交。
现在领导者收到条目 4,但由于网络不可靠而未能提交它,并向发出请求的客户端返回 FAILED 响应。
发布此消息后,客户端发出请求 5。现在,当领导者尝试提交此条目时,为了遵循日志匹配属性,条目 4 也将被复制到多数,并且领导者会将条目 4 和 5 应用到其状态机,增加提交索引。
但是,这意味着即使客户端收到 FAILED 响应,状态机也会应用条目 4。
这不是出乎意料吗?还是我错过了什么?
一些可以澄清这个答案的参考资料以及您宝贵的答案将不胜感激!
这是标准操作模式。失败意味着“未知结果”,客户端应该采取额外的步骤来发现结果,例如,客户端可以执行线性化读取以查看提交日志中是否有 4。
澄清为什么失败被解释为“未知”: