Etcd选主源码分析

发布时间 2023-05-03 12:29:55作者: 王景迁

Etcd v3.4.0

Raft角色

Raft集群中节点分为3种状态:领导者Leader、追随者Follower、候选者Candidate。
正常情况下,集群中的节点只存在Leader与Follower这2种状态。

Leader:负责日志的同步管理,处理写请求,与Follower保持心跳。
Follower:响应Leader的日志同步请求和Candidate的投票请求,把客户端请求转发到Leader。
Candidate:Follower节点转为Candidate后发起选举,获得超半数投票后转为Leader。

选举的3个阶段

阶段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,把票投给自己。

raft/raft.go
Step函数

阶段4:Candidate转为Leader

一轮选举过后,一般会有一个Candidate收到超过半数节点的投票,转为Leader,定时发送心跳给其它节点,其它节点转为Follower并与Leader保持同步。

raft/raft.go
stepCandidate函数

VoteWon:支持者数量超过半数,如果是预选那么开始正选,如果是正选就成为Leader。
VoteLost:支持者数量不可能超过半数,不管是预选还是正选都切换成Follower。

raft/quorum/majority.go
VoteResult函数

参考资料

09 分布式一致性算法 Raft 和 Etcd 原理解析

etcd教程(十五)---leader选取源码分析