【问题标题】:What happens to uncommitted previous term log entries in Raft algorithm?Raft 算法中未提交的上学期日志条目会发生什么?
【发布时间】:2020-09-02 12:36:48
【问题描述】:

StackOverflow 上有很多关于图 8 的问题,在original Raft paper 的第 5.4.2 节中讨论过:

Figure 8

论文并没有明确说明问题条目(2, 3) 的确切命运。我的问题有两个:

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

【问题讨论】:

    标签: consensus raft


    【解决方案1】:

    图中提到 S5 不会成为领导者,因为多数 将拒绝其 RequestVotes

    就像在 raft 纸中的 (e) 中一样,S5 不会成为领导者,因为 S5 的日志至少不会与多数日志 (S1,S2,S3) 保持同步

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

    是的,S5 的日志会被当前领导者的日志覆盖。引自草稿纸:

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

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

    不,客户端仅在已安全复制条目时才会收到已提交条目的确认。请参阅 raft paper 的报价:

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

    还有一种情况是leader已经复制了log entry,但是在响应client之前就崩溃了或者通过网络发送响应丢失了,client需要重试导致命令被执行多次。引自牛皮纸:

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

    【讨论】:

    • 感谢您的详尽解释!
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 2022-09-28
    • 2020-12-03
    • 2023-02-06
    • 2016-04-08
    • 2011-02-04
    • 2015-07-17
    • 2016-08-02
    相关资源
    最近更新 更多