写点什么

raft 协议中, 候选人角色能参与投票吗

发布于: 2020 年 07 月 18 日
raft协议中, 候选人角色能参与投票吗

来源知乎提问


raft 协议中, 候选人角色能参与投票吗?

如果不能,其他不合适节点成为候选人,也无法获取成为 leader。

此时假如多个候选人,每次选举都不成功,如何解决?


我在这里补充一下;


假如 5 个节点 ,crash2 个阶段,其中 只有一个节点根据 leader 选举规则,成为新的 leader,

但是因为根据选举超时协议,[T,2T]时间内,第一个出现,第二个候选人出现


Raft uses randomized election timeouts to ensure that

split votes are rare and that they are resolved quickly


此时,最能成为 leader 节点,没有成为候选人,怎么办?




验证


  • 假设 5 个节点,刚启动,然后 crash2 个节点,其中 s4 第一成为候选人,S5 马上成为第二个




S4,S5 个投票自己一次。

只有一个

S4,S5 最多获取 2 票,失败



  • s4 和 S5 开启第二轮


S4 和 S5 各自 term+1,然后各自投自己一票


S4 获取 2 票,但是不够三票,最后失败,继续开启新的一轮



S5 此时只能获取一票,开启新的一轮



  • 开启 term 为 5 的选举





原来在这里 S5 当前 term=4,发现更高的 term=5,变为 follower 状态


总结


raft 协议中, 候选人角色能参与投票吗?


  1. 同一个 term,candidate 首先投自己一票,因此不在投票给其他人。

raft 中,候选人可以投票,但是只能投给自己,如果 5 个节点,全部都是候选人,这次投票选举失败。


其他不合适节点成为候选人,也无法获取成为 leader。


  1. 需要多消耗 150–300ms 进行下一个 term 投票,下个 term 依然遇到这个情况,


假如多个候选人,每次选举都不成功,如何解决?


  1. 通过心跳,如果候选人遇到更高的 term 后续人为变为 follower。

这样此时多个候选人问题变成一个候选人




无论出于什么角色,如果发现更好的 term,会更新自己 term 和角色




最重要一个图


s5 和 S3 变得一模一样 都是 follower




继续测试


  • 5 个节点,crash 2 个节点,此时剩余节点都是候选人



  • term =11



日志

  • 不一致 重启 2 个节点





  • 不满足大多数,就是无限投票。


update 2020 年 8 月 14 日 13:46:13


  • s1 和 s2 是 2 个候选人。


  • s5 超时,成为 term 更高的





发布于: 2020 年 07 月 18 日阅读数: 116
用户头像

希望每一位来访的朋友都能有所收获! 2017.11.30 加入

如果有疑问 wang_cyi@163.com 联系

评论

发布
暂无评论
raft协议中, 候选人角色能参与投票吗