【问题标题】:How does newly elected leader apply entries in raft?How does newly elected leader apply entries in raft?
【发布时间】:2021-09-27 08:19:21
【问题描述】:

假设您有 3 个服务器 S1S2S3S1(领导者),将日志复制到S2S3,然后将日志响应应用到客户端并崩溃。所以我们有

S1   1
S2   1
S3   1

现在当S2 成为领导者(来自S3 的投票)它将如何应用日志?根据 Raft 论文

If there exists an N such that N > commitIndex, a majority
of matchIndex[i] ≥ N, and log[N].term == currentTerm:
set commitIndex = N.

在上述情况下,S2 (commitIndex = 0) 的期限为 2,而日志的期限始终为 1;因此,最后一个条件不会满足?我错过了什么吗?

【问题讨论】:

    标签: replication distributed-system consensus raft


    【解决方案1】:

    每个节点都有一个事件日志,其中包含两个核心指针:已提交事件和未提交事件。 raft 协议的重点是在整个系统中复制两个这些指针。

    | 0 1 2 3 | 4 5 6 7 8 9 |
              ^             ^
      Committed   Uncommitted
    

    Follower 从 Leader 接收到的每条复制消息都会更新这两个指针。该消息包含要附加到日志的事件(更新uncommitted 指针)。它还有一个更新committed指针的索引。

    当追随者收到此消息并更新其committed 指针时,它应用所有刚刚从未提交移动到已提交的事件.

    发送给追随者的committed 指针是领导者在其日志中的副本。领导者在收到来自追随者的法定人数时更新其committed 指针,并应用所有从未提交移动到已提交的事件。

    a 新选举的领导者首先需要确保其日志的版本复制到粉丝,并且随着新的领导者从追随者收到Quorum,它会更新其committed指针,复制该指针返回追随者,并应用上述事件。

    【讨论】:

    • 如 raft 文件中所述,我们维护 lastApplied 和 commitIndex,但在上述场景中,当 S1(第一个领导者)死亡时,它的状态类似于 S1(logs:[1], commitIndex: 1, lastApplied: 1) 虽然 s2 和 s3 有 S2(logs:[1], commitIndex: 0, lastApplied: 0) S3(logs:[1], commitIndex: 0, lastApplied: 0) 由于领导者从不提交较早的日志,因此这些永远不会提交日志。
    • 不是真的!如果任何节点曾经有一个已提交的日志值,那么最终所有其他节点都会将该值视为已提交。这就是共识算法中提交的定义。
    • 一旦创建条目的领导者在大多数服务器上复制了日志条目,就会提交日志条目。因此,一旦它被复制,领导者就会提交它。我认为缺少的部分是论文在第 8 节中提到的领导者完整性属性保证领导者拥有所有已提交的条目,但在其任期开始时,它可能不知道那些是哪些。要找出答案,它需要从其任期中提交一个条目。 Raft 通过让每个领导者在其任期开始时向日志中提交一个空白的 no-op 条目来处理这个问题。
    猜你喜欢
    • 2022-12-02
    • 2022-12-02
    • 1970-01-01
    • 2017-02-25
    • 2022-12-27
    • 2019-03-30
    • 2022-12-26
    • 2022-12-01
    • 2014-02-23
    相关资源
    最近更新 更多