Etcd选主源码分析
Etcd v3.4.0
Raft角色
Raft集群中节点分为3种状态:领导者Leader、追随者Follower、候选者Candidate。
正常情况下,集群中的节点只存在Leader与Follower这2种状态。
Leader:负责日志的同步管理,处理写请求,与Follower保持心跳。
Follower:响应Leader的日志同步请求和Candidate的投票请求,把客户端请求转发到Leader。
Candidate:Follower节点转为Candidate后发起选举,获得超半数投票后转为Leader。
选举的4个阶段
阶段1:所有节点都是Follower
Raft集群在启动时,所有节点都是Follower,初始任期Term为0。每个节点启动选举定时器,超时时间不一致,避免所有Follower同时转为Candidate并同时发起选举。
raft/raft.go
newRaft函数
阶段2:Follower转为Candidate并发起投票
Follower启动后在一个选举定时器周期内未收到Leader心跳和Candidate投票请求,转为Candidate且Term自增,并向集群中其他节点发送投票请求并且重置选举定时器。
raft/raft.go
tickElection函数
Step函数
campaign函数
阶段3:Follower投票
在未投票情况下,Follower收到投票请求后处理方式:
请求节点的Term大于自己的Term,把票投给它;
请求节点的Term小于自己的Term,把票投给自己;
如果Candidate在上个term中已提交数据不完整,拒绝投票,防止遗漏数据的节点成为Leader。
raft/raft.go
Step函数
阶段4:Candidate转为Leader
一轮选举过后,一般会有一个Candidate收到超过半数节点的投票,转为Leader,定时发送心跳给其它节点,其它节点转为Follower并与Leader保持同步。
raft/raft.go
stepCandidate函数
VoteWon:支持者数量超过半数,如果是预选那么开始正选,如果是正选就成为Leader。
VoteLost:支持者数量不可能超过半数,不管是预选还是正选都切换成Follower。
raft/quorum/majority.go
VoteResult函数
参考资料