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 协议中, 候选人角色能参与投票吗?
同一个 term,candidate 首先投自己一票,因此不在投票给其他人。
raft 中,候选人可以投票,但是只能投给自己,如果 5 个节点,全部都是候选人,这次投票选举失败。
其他不合适节点成为候选人,也无法获取成为 leader。
需要多消耗 150–300ms 进行下一个 term 投票,下个 term 依然遇到这个情况,
假如多个候选人,每次选举都不成功,如何解决?
通过心跳,如果候选人遇到更高的 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 更高的
版权声明: 本文为 InfoQ 作者【程序员老王】的原创文章。
原文链接:【http://xie.infoq.cn/article/0a8c579d8110b2025b536f79e】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论