Raft 算法中未提交的前任期日志条目会发生什么?

What happens to uncommitted previous term log entries in Raft algorithm?

Whosebug 上有许多关于图 8 的问题,在 original Raft paper 的第 5.4.2 节中进行了讨论:

Figure 8

论文和 none 的答案没有说清楚的是那个有问题的条目 (2, 3) 的确切命运。我的问题有两个:

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

The figure mentions that S5 will not become a leader because majority will reject its RequestVotes

如 raft paper 中的 (e) 所示,S5 不会成为领导者,因为 S5 的日志至少与多数 (S1,S2,S3) 的日志不同步

Does that mean that upon receiving AppendEntries RPC, S5 will then overwrite its entry (2, 3) with (2, 2) and (3, 4) as per current leader in (e)?

是的,S5的日志会被当前leader的日志覆盖。引自筏纸:

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

Do the clients receive acknowledgements for uncommitted entries as if they were already applied to a state-machine?

不,客户端仅在条目已安全复制后才会收到对已提交条目的确认。请参阅筏纸的引用:

当条目被安全复制后(如下所述),领导者将条目应用到它的状态机,returns结果 执行到客户端。

还有一种情况是leader已经复制了log entry,但是还没有响应client就crash了,或者响应在网络发送的时候丢失了,client需要重试导致command被执行了多次。引自筏纸:

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