raft 中客户端请求失败

问题描述 投票:0回答:1

想象一个 3 节点 raft 集群。每个节点都同步有日志 [1,2,3] 并且条目 3 由领导者提交。

现在领导者收到条目 4,但由于网络不可靠而未能提交它,并向发出请求的客户端返回 FAILED 响应。

发布此消息后,客户端发出请求 5。现在,当领导者尝试提交此条目时,为了遵循日志匹配属性,条目 4 也将被复制到多数,并且领导者会将条目 4 和 5 应用到其状态机,增加提交索引。

但是,这意味着即使客户端收到 FAILED 响应,状态机也会应用条目 4。

这不是出乎意料吗?还是我错过了什么?

一些可以澄清这个答案的参考资料以及您宝贵的答案将不胜感激!

algorithm amazon-dynamodb distributed-computing distributed raft
1个回答
0
投票

这是标准操作模式。失败意味着“未知结果”,客户端应该采取额外的步骤来发现结果,例如,客户端可以执行线性化读取以查看提交日志中是否有 4。

澄清为什么失败被解释为“未知”:

  • 领导从客户那里收到了4个
  • 领导者在自己的日志中追加了4
  • leader 向每个 follower 发送 4 个
  • 网络掉线
  • 领导者不知道 4 是否到达了任何追随者;网络可能随时失败,因此可能没有追随者收到消息,或者一些追随者收到消息,或者大多数追随者收到消息
  • 无论哪种方式,领导者都会报告未能做出承诺;由客户来找出真正的结果(例如,决定是否应该再发送 4 次)
© www.soinside.com 2019 - 2024. All rights reserved.