在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。
Quorum 相关介绍参考:https://blog.csdn.net/wxb880114/article/details/81604245
Quorum 在 etcd 中主要作用有两个,一是计算已被多数节点接收(Match) 的 Index。二是在进行 Leader 选举时,计算选举结果。
主要文件
/raft/quorum/majority.go 多数算法的实现。
/raft/quorum/joint.go 包含两个 majority 的结构体。第二暂时保留,当需要用的时候才会填充。 但 majority 的操作,会在 joint 重新实现,主要是变成操作两个 majority。
/raft/quorum/quorum.go 定义 quorum 的一些参数和数据结构。
源码实现
majority 数据结构
type MajorityConfig map[uint64]struct{} //MajorityConfig的定义其实就是节点集合。
计算已被多数节点接收(Match) 的 Index
func (c MajorityConfig) CommittedIndex(l AckedIndexer) Index {
n := len(c)
if n == 0 {
return math.MaxUint64
}
// stk 会在编译时生成,如果节点数不超过7,优先使用这个,效率会更高。