ETCD 源码学习--Raft 中 Leader 如何维护节点状态(八)

本文深入探讨ETCD源码,聚焦在Raft协议中,Leader如何使用Progress和ProgressTracker维护节点状态。重点介绍了progress数据结构的MaybeUpdate和RecentActive属性,以及tracker数据结构的TallyVotes和Committed函数。这些机制确保了MatchIndex的更新和节点投票的管理,从而保证Raft集群的一致性。
摘要由CSDN通过智能技术生成

在 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值