【问题标题】:Does the Raft consensus protocol handle nodes that lost contact to the leader but not to the other nodes?Raft 共识协议是否处理与领导者失去联系但与其他节点没有联系的节点?
【发布时间】:2018-08-20 05:25:53
【问题描述】:

在网络分区的情况下,Raft 保持一致。但是,如果只有一个节点only失去了与领导者的联系,成为候选人并要求投票,会发生什么?

这是设置,我调整了http://thesecretlivesofdata.com/raft/ 中的示例以满足我的需要:

节点B 是当前的领导者,并向追随者发送心跳(红色)。 BC 之间的连接丢失,选举超时后 C 成为候选人,为自己投票并要求节点 ADE 投票给它(绿色)。

会发生什么?

据我了解 Raft,节点 ADE 应该投票给 C,这使得 C 成为下一个领导者(第 2 期)。然后我们有两个领导者各自发送心跳,希望节点ADE 将忽略来自B 的那些,因为任期较短。

这是正确的还是有更好的机制?

【问题讨论】:

    标签: consensus raft


    【解决方案1】:

    再经过Raft Paper之后,看来我上面的做法是正确的。来自论文:

    条款 在 Raft 中充当逻辑时钟,它们允许服务器 检测过时的信息,例如过时的领导者。每个 服务器存储当前术语编号,这增加 随着时间的推移单调。当前条款已交换 每当服务器通信时;如果一台服务器的当前 期限小于另一个,然后它更新它的当前 项到较大的值。 如果候选人或领导者发现 它的任期已过时,它立即恢复为追随者 状态。 如果服务器收到一个过期的请求 号,它拒绝请求

    突出显示的部分是我上面缺少的部分。所以流程是:

    • 节点C 成为候选节点后,将其任期号增加到 2 并向可达节点(ADE)请求投票。李>
    • 这些人会立即将他们的 current_term 变量更新为 2 并投票给 C
    • 因此,节点ADE 将忽略来自B 的心跳,并且告诉B 当前项是2。
    • B 将返回关注者状态(直到CB 之间的网络连接恢复后才会更新)。

    【讨论】:

    • 我相信在实际的 Raft 实现中,有一个成为候选人的预备步骤,节点询问其他人“如果我要成为候选人,你会投票给我(你还和领导有联系吗)?”在这种情况下,大多数节点会响应“我仍然与节点 D 保持联系”,因此 C 不会将自己进行选举,以避免不必要的选举周期。
    • 当B变成follower状态,在B和C之间的网络还没愈合之前,B会不会再次变成候选人(因为它无法接收到C的心跳)并开始新的选举?如果是这样,领导者将在 B 和 C 之间来回跳跃。
    【解决方案2】:

    由于 A、B、D 向领导者 B(Term 1)保持健康心跳,他们不会响应 C(Term 2)的投票请求,C 将超时并重复投票并重复超时。

    如图 4 来自草稿纸https://raft.github.io/raft.pdf

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 1970-01-01
      • 2019-03-30
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 2021-09-19
      相关资源
      最近更新 更多