ETCD 源码学习--Raft 协议选举过程(六)

在 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.选举处理函数


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值