Raft 内部有一种心跳机制,如果存在 leader,那么它就会周期性地向所有 follower 发送心跳,来维持自己的地位。如果 follower 一段时间没有收到心跳,那么他就会认为系统中没有可用的 leader 了,然后开始进行选举。

开始一个选举过程后,follower 先增加自己的当前任期号,并转换到 candidate 状态。然后投票给自己,并且并行地向集群中的其他服务器节点发送投票请求(RequestVoteRPC

三种结果

  1. 某一 candidate 获得超过半数投票,赢得选举,开始向其他节点发送心跳
  2. 其他节点赢得了选举,收到新 Leader 的心跳后,如果新 leader 的任期号不小于自己当前的任期号,当前 candidate 自动回到 follower
  3. 一段时间后没有任何获胜者,每个 candidate 都在自己的随机选举超时时间后增加任期号开始新一轮投票

请求投票 RPC

image.png

对于没有成为 follower 的节点,对于同一个任期,会按照先来先得的原则投出自己的选票