在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。
主要文件
/raft/tracker/progress.go 在 Leader 节点中,每个节点即是一个 progress 实例。
/raft/tracker/tracker.go tracker 用于维护所有节点状态、记录投票和选举结算、计算并更新 MatchIndex(被多数节点接收的Index) 等。
源码
progress数据结构
type Progress struct {
Match, Next uint64 //Match 表示 Follower 已经跟 Leader 同步的最大 index。Next 下次复制的索引位置
State StateType //当前节点状态主要有三种分别是复制、探测、快照复制
PendingSnapshot uint64 //正在发送快照
RecentActive bool //节点是否活跃(有任何节点响应都会设置为 true)
ProbeSent bool //正在探测(探测的意思是 Leader 不知道 Follower 下一个复制的 Next 位置,需要通过回退 Next 来找到 Follower 真实的 Next 位置)
Inflights *Inflights //记录已发送,但未得到节点响应的消息。
IsLearner bool
}
//节点映射集合, 节点ID=>Progress
type ProgressMap map[uint64]*Progress
1.在 Leader 接受到 Follower 的心跳或者消息响应时,会调用 MaybeUpdate 尝试更新 Match/Next。
2.在 Leader 接受到 Follower 的心跳或者消息响应时,会设置为 R