Raft算法中未提交的前一个学期日志条目会发生什么情况



关于图8的StackOverflow,这里有很多问题,在Raft原始论文的5.4.2节中进行了讨论:

图8

论文和任何答案都没有明确的是有问题的条目(2, 3)的确切命运。我的问题有两个:

  1. S5在第3学期(2, 3)期间索引2处的条目究竟发生了什么?该数字提到,S5不会成为领导者,因为大多数人会拒绝其请求投票。这是否意味着,在接收到AppendEntries RPC时,S5将按照(e(中的当前前导,用(2, 2)(3, 4)覆盖其条目(2, 3)
  2. 如果S5被强制覆盖该条目,并且它从未被提交,那么发送(1, 3)的客户端应该接收什么响应?客户端是否收到未提交条目的确认,就好像它们已经应用到状态机一样

该图提到S5不会成为领导者,因为大多数将拒绝其请求投票

如筏纸中的(e(所示,S5不会成为领先者,因为S5的日志至少与大多数(S1、S2、S3(的日志不同步

这是否意味着在接收到AppendEntries RPC时,S5将根据当前用(2,2(和(3,4(覆盖其条目(2,3((e(中的领导者?

是的,S5的日志将被当前领导者的日志覆盖。引自木筏纸:

如果跟随者的日志与引导者的日志不一致,则AppendEntries一致性检查将在下一个AppendEntrys RPC中失败。拒绝后,引导器递减nextIndex并重试AppendEntries RPC。最终nextIndex将达到领导者和追随者日志匹配的点。当这种情况发生时,AppendEntries将成功,它将删除跟随者日志中任何冲突的条目,并从引导者日志中附加条目(如果有的话(

客户端是否收到未提交条目的确认,如同它们已经应用于状态机了?

否,只有在安全复制了已提交的条目后,客户端才会收到对该条目的确认。请参阅raft paper的报价:

当条目被安全复制(如下所述(时,leader将该条目应用于其状态机并返回结果执行到客户端

还有一种情况是,领导者复制了日志条目,但在响应客户端之前崩溃,或者在通过网络发送响应时丢失,客户端需要重试,导致命令被执行多次。引用自筏纸:

然而,如目前所述,Raft可以多次执行一个命令:例如,如果leader在提交日志条目后但在响应客户端之前崩溃,则客户端将使用新的leader重试该命令,从而使其再次执行。解决方案是客户端为每个命令分配唯一的序列号。然后,状态机跟踪最新的为每个客户端处理的序列号以及相关联的响应。如果它接收到序列号已经执行的命令,它会立即响应,而不重新执行请求

相关内容

最新更新