2

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

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

在此处输入图像描述

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

会发生什么?

据我了解 Raft,nodesADshouldE投票选出CC一个领导者(第 2 学期)。然后,我们有两个领导者各自发送心跳,并希望节点发送心跳,并且A由于任期较低DE将忽略这些心跳。B

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

4

2 回答 2

1

再次浏览了Raft Paper之后,看来我的上述做法是正确的。从论文中:

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

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

  • 在节点C成为候选者后,它将其任期号增加到 2并向可达节点(AD)请求投票E
  • 那些人会立即将他们的current_term变量更新为 2 并投票给C.
  • A因此,节点DE将忽略来自的心跳B,而且会告诉B当前项是 2。
  • BC将返回跟随者状态(并且在和之间的网络连接被修复之前不会更新B)。
于 2018-03-14T07:33:30.670 回答
0

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

如图 4 来自 raft 论文https://raft.github.io/raft.pdf 在此处输入图像描述

于 2018-12-17T13:28:54.857 回答