转:https://www.zhihu.com/question/263684969/answer/1572960482
根据论文的说法,election timeout是Follower转换成Candidate状态的超时
Followers (§5.2):
• Respond to RPCs from candidates and leaders
• If election timeout elapses without receiving AppendEntries
RPC from current leader or granting vote to candidate:
convert to candidate
原文中并没有heartbeat timeout这个词。follower状态下的election timeout是用来监听append entry(包括了心跳包),判断leader是否存活用的;candidate状态下的election timeout是用来控制投票时长,如果超时,进行重新投票。
1. 回答基于论文:
2. 节点状态的变化图(出自论文):

3. 说一点题外话。raft的选主有两个重要机制(参见上图):
- 多数派 + 任期(term):保证了旧的任期不会被多数节点承认,用于保证正确性
- timeout:触发重新选主,用于保证可用性
简而言之,如果没有timeout机制,那么
- 论文中的所有断言依旧正确
- 但是若leader宕机, 则整个集群将无法对外提供服务
综之,timeout是整个集群高可用的关键。
4. 说一下两个timeout的意义(参见上图):
- headerbeat timeout:在状态follower下触发,并使状态转变为candidate,对应图片中的starts election
- election timeout:在状态candidate下触发,并使状态转变为candidate,对应图片中的new election
5. 回到问题。
- 根据上面的讨论,两个timeout的触发状态是不一样的,作用也是不一样的,所以在某种意义上两者可以独立的讨论,不用刻意区分,也不用刻意合并。
- 指出题主的一个表述错误:如果follower在election timeout超时了。election timeout是在candidate状态下的概念,所以应该改为如果candidate在election timeout超时了。
- 在工程实现上,可以从两个角度将两者合并:
(a) 在follower和candidate状态下,两个timeout的时间设置成一样,即时间角度上的合并。
(b) 在follower和candidate状态下,复用同一个timeout对象,即对象角度上的合并。