MsgBeat和MsgHeartbeat消息
Leader推动心跳计时器(heartbeatElapsed),而Follower推动选举计时器(electionElapsed),选举计时器的流程前面已经提到,这里主要介绍心跳计时器。当上层模块调用Tick()时,Leader会推动心跳计时器,在tickHeartbeat函数中有详细介绍。有两种情况会是Leader向集群中其他的节点发送心跳消息分别是心跳计时器超时和在ReadOnly模式下Leader接收到客户端请求的只读消息,这里我们主要介绍心跳计时器超时的情况。
MsgBeat和MsgHeartbeat消息的主要区别是MsgBeat是本地消息,而发给集群中其他节点的心跳消息是使用MsgHeartbeat消息
Leader调用tickHeartbeat推动心跳计时器
当心跳计时器超时时会向其他节点发送心跳,如果raft的配置checkQuorum为true,则也会发送MsgCheckQuorum消息。tickHeartbeat的主要流程:
1.递增心跳计时器和选举计时器
2.如果选举计时器大于等于选举超时时间
重置选举计时器,Leader节点不会主动发起选举
检测当前节点是否与集群中的大多数节点连通,如果超过半数以上的节点连通则发送MsgCheckQuorum确认
如果有节点正在转移,则禁止节点转移
3.如果选举计时器没有超时
如果当前节点不是Leader,则直接返回
心跳计时器超时,则发送MsgBeat消息,继续维持向其余节点发送心跳消息,并重置心跳计时器
func (r *raft) tickHeartbeat() {
r.heartbeatElapsed++ //递增心跳计时器
r.electionElapsed++ //递增选举计时器
if r.electionElapsed >= r.electionTimeout { //当选举计时器大于等于选举超时时间
r.electionElapsed = 0 //重置选举计时器,Leader节点不会主动发起选举
if r.c