raft协议为什么有election和heartbeat timeout的区分?

转: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. 回答基于论文:

raft paper​raft.github.io

2. 节点状态的变化图(出自论文):

raft协议为什么有election和heartbeat timeout的区分?

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对象,即对象角度上的合并。

给TA打赏
共{{data.count}}人
人已打赏
分布式

Bipartisan Paxos 两党Paxos

2021-6-2 15:26:31

分布式

etcd 配置优化

2021-6-9 22:11:34

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索