如果是网络分区,Raft保持一致。但是,如果只有一个节点失去联系仅给领导者,成为候选人并要求投票,会发生什么?
这是设置,我调整了http://thesecretlivesofdata.com/raft/中的示例以满足我的需求:
节点B
是当前的领导者,并向关注者发送心跳(红色)。 B
和C
之间的连接丢失,选举超时后C
成为候选人,投票支持自己并询问节点A
,D
和{{ 1}}投票给它(绿色)。
会发生什么?
据我了解Raft,节点E
,A
和D
应投票给E
,这会使C
成为下一位领导者(第2期) 。然后我们有两个领导者发送心跳,希望节点C
,A
和D
将忽略来自E
的节点因为较低的术语。
这是正确的还是有更好的机制?
答案 0 :(得分:1)
再次浏览Raft Paper后,我的上述方法似乎是正确的。来自论文:
条款 充当Raft中的逻辑时钟,它们允许服务器 检测过时的信息,如陈旧的领导者。每 服务器存储当前的术语编号,该编号会增加 单调地随着时间的推移。目前的条款是交换的 服务器通信;如果一个服务器的当前 term小于其他的,然后更新其当前值 术语到更大的价值。 如果候选人或领导者发现 它的术语已过时,它立即恢复为追随者 state。如果服务器收到过时的请求 号码,它拒绝请求
突出显示的部分是我上面遗漏的部分。所以过程是:
C
成为候选人之后,将其术语编号增加到2 并请求来自可到达节点(A
,D
和{的投票{1}})。E
变量更新为2并投票给current_term
。C
,A
和D
将忽略来自E
的心跳,并且告诉B
当前字词为2。B
将返回到关注状态(并且在B
和C
之间的网络连接被修复之前不会得到更新。)答案 1 :(得分:0)
由于A,B,D向领导B保持健康心跳(期限1),因此他们不会响应C的投票请求(期限2),因此C会超时并重复投票并重复超时。
如筏纸https://raft.github.io/raft.pdf中的图4所示