Raft共识协议是否处理与领导者失去联系而不与其他节点失去联系的节点?

时间:2018-03-12 08:38:39

标签: consensus raft

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

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

enter image description here

节点B是当前的领导者,并向关注者发送心跳(红色)。 BC之间的连接丢失,选举超时后C成为候选人,投票支持自己并询问节点AD和{{ 1}}投票给它(绿色)。

会发生什么?

据我了解Raft,节点EAD应投票给E,这会使C成为下一位领导者(第2期) 。然后我们有两个领导者发送心跳,希望节点CAD将忽略来自E的节点因为较低的术语。

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

2 个答案:

答案 0 :(得分:1)

再次浏览Raft Paper后,我的上述方法似乎是正确的。来自论文:

  

条款   充当Raft中的逻辑时钟,它们允许服务器   检测过时的信息,如陈旧的领导者。每   服务器存储当前的术语编号,该编号会增加   单调地随着时间的推移。目前的条款是交换的   服务器通信;如果一个服务器的当前   term小于其他的,然后更新其当前值   术语到更大的价值。 如果候选人或领导者发现   它的术语已过时,它立即恢复为追随者   state。如果服务器收到过时的请求   号码,它拒绝请求

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

  • 在节点C成为候选人之后,将其术语编号增加到2 并请求来自可到达节点(AD和{的投票{1}})。
  • 这些会立即将其E变量更新为2并投票给current_term
  • 因此,节点CAD将忽略来自E的心跳,并且告诉B当前字词为2。
  • B将返回到关注状态(并且在BC之间的网络连接被修复之前不会得到更新。)

答案 1 :(得分:0)

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

  

如筏纸https://raft.github.io/raft.pdf中的图4所示   enter image description here