raft协议这两个超时时间是比较重要的,看着有些疑惑,
- 集群刚启动的时候,心跳会超时,这时候follower是直接成为candidator么?还是还要在心跳超时的基础上等待一个竞选超时才变成 candidator?
- 成为candidator并且发送投票请求给follower,这个candidator这时候本身等待投票是有个超时的,这个超时也是竞选超时么?
- 心跳超时和竞选超时哪个大?心跳超时一般设置为多少?
- 集群已经正常运转leader刚挂掉的时候,我们是依靠心跳超时还是竞选超时来触发选举流程?
1.心跳超时后,Follower 等待自身竞选超时后成为 Candidate 身份并发起选举。raft 使用了一个叫随机选举超时(randomize election timeout)的方式,使每个 server 的超时时间不一样,这样就避免了多个 Candidate 同时发起选举的问题。
2.选举也有时限,规定时间内没有获取到足够多的票数,则当前 Leader 选举竞选失败;但这个时限不是 election timeout ,election timeout 是指心跳超时后发起竞选的时限。
3.心跳超时可以自己配置,看你自己的网络规模和拓扑;竞选超时是随机的,大概在几十到几百毫秒;通常情况下,心跳超时比竞选超时长得多,心跳是秒级,竞选是毫秒级。
4.前面已经回答了,Follower 检测到心跳超时后,等待自身竞选超时后发起选举,也就是两个时限都超了。
补充:
- kindol:
感谢大佬解答,第3点心跳超时会比竞选超时长,那如果一段时间内集群持续没有操作,不会有append这种指令,由于心跳超时比竞选超时长,竞选超时没来得及刷新,这时候集群不就很容易发生竞选超时了吗?这种竞选超时是否反而是一种无用功?
回复 7月31日
- kindol:
另外关于第一点,心跳超时后follower还会等待竞选超时,这里是说心跳超时后,再开始竞选超时的计数,还是心跳超时、竞选超时是follower启动后就同时开始计数的?
回复 7月31日
- Lyde_Su:
@kindol 竞选超时并不是一段不停运行的代码,它只是一个参数,在心跳超时后系统启动一个计时器与竞选超时参数比较,超过这个参数就发起选举。
回复 7月31日
- Lyde_Su:
@kindol 心跳超时好理解,两次心跳之间间隔的时间,超过时限就叫超时;竞选超时是心跳超时后才起算的。