在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习
选举触发方式
1.Follower 节点选举计数器超时,触发 MsgHup 消息, Follower 节点接收此消息时,会发起一轮选举。
2.当 Leader 节点选举计数器超时,触发 MsgCheckQuorum 消息,且当前节点经过检查之后,发现当前节点不能维持 Leader 状态,Leader 会切换为 Follower 等待选举超时。
3. 当 Leader 节点正常停止时,会触发 MsgTransferLeader 消息,并且当前 Leader 会根据一定规则选择一个合适的 Follower 作为下一个 Leader。Leader 节点收到 MsgTransferLeader 后会立即发送 MsgTimeoutNow 消息给下一任 Leader 节点,节点收到消息之后会立即发起一轮新选举。
选举过程
1.选举触发
// raft/raft.go
func (r *raft) Step(m pb.Message) error {
...
switch m.Type {
case pb.MsgHup:
...
if r.state != StateLeader {
if r.preVote { //开启了preVote模式
r.campaign(campaignPreElection) //选举
} else {
r.campaign(campaignElection) //选举
}
} else {
r.logger.Debugf("%x ignoring MsgHup because already leader", r.id)
}
....
}
...
return nil
}
2.选举处理函数