贵阳做网站,云南网站建,深圳设计网站开发,企业如何建设网站作者 | 奇伢来源 | 奇伢云存储关于 Quorum 的两个维度前几回说了那么多框架#xff0c;设计思想的文章。今天分享一个很小的点#xff0c;etcd 的 quorum 是怎么实现的#xff1f;Quorum 机制本质就是一个关于多数派的事情#xff0c;这个多数派应用的有两个方面#xff1… 作者 | 奇伢来源 | 奇伢云存储关于 Quorum 的两个维度前几回说了那么多框架设计思想的文章。今天分享一个很小的点etcd 的 quorum 是怎么实现的Quorum 机制本质就是一个关于多数派的事情这个多数派应用的有两个方面选举过程获得多数节点投票的节点才能获胜成为 Leader 运行过程被多数节点 commit 的日志位置这个才是被集群可靠记录的位置。被集群 commit 的日志才能被应用 apply 那么这里有两个小思考问题既然是选举过程那怎么选举结果唱票的既然是运行过程那集群的这些节点怎么确认集群的 commit 位置有选举自然有唱票唱票是在选举流程中的一个步骤。还记得以前选班干部的时候在黑板上写“正”字谁得票多谁就获胜当选。etcd 里面也有选举也就是 Leader 的选举。Leader 获胜的依据是的票满足大多数也就是满足 quorum 机制。今天我们就来看看 etcd 的唱票是怎么做的很简单的思路我们给每个参与选举的朋友计数得票超过半数的那么就胜出。比如说 ABCDE 五个人竞选那么得到 3 票的就可以胜出。来看看 etcd 的唱票选举属于 quorum 机制代码位于 etcd/raft/quorum/ 下。quorum 的核心实现在 MajorityConfig 的结构体其实就是个 map 的封装type MajorityConfig map[uint64]struct{}这个 map 的 key 是节点的 id这里面包含了集群的节点map 的 value 不重要所用用的是 struct{} 类型。思考个小问题那既然 value 不 care 那为什么不用 slice 结构其实就是为了查找的需求map 的查找是常数级别value 又用的 struct{} 不占空间一举两得。唱票和集群 commit 的实现就是它的方法我们先看下唱票的实现// etcd/raft/quorum/majority.go
func (c MajorityConfig) VoteResult(votes map[uint64]bool) VoteResult {// 搞个长度为 2 的数组ny : [2]int{}// 遍历集群节点for id : range c {v, ok : votes[id]if !ok {// 暂时没投票的missingcontinue}if v {// 投票赞同的ny[1]} else {// 投票拒绝的ny[0]}}q : len(c)/2 1if ny[1] q {// 选举成功得票数超过半数比如 votes [yes, yes, yes]return VoteWon}if ny[1]missing q {// 未知情况不确定成功也不确定失败return VotePending}// 选举失败return VoteLost
}唱票的实现很简单就如下几个步骤遍历集群节点统计谁赞同了、谁拒绝了、谁还没投票唱票的结果有三种成功失败待定赞同投票的超过半数 len(c)/21 则胜利这实现可太简单了就是一个遍历投票结果写“正”字“正”字超过半数则胜出。集群的节点怎么确认集群的 commit 位置集群内被多数节点 commit 的位置才是集群的 commit 点。也就是说这个也需要满足 quorum 。这个就有意思了。关键步骤排序然后取中间的位置。取的这个中间的位置就是满足 quorum 的 commit 。// etcd/raft/quorum/majority.go
func (c MajorityConfig) CommittedIndex(l AckedIndexer) Index {// 遍历集群节点取出每个节点的 commitfor id : range c {if idx, ok : l.AckedIndex(id); ok {srt[i] uint64(idx)i--}}// 排个序insertionSort(srt)// 取中间这个位置就是大多数 commit 的位置属集群共识pos : n - (n/2 1)return Index(srt[pos])
}这个实现就很有意思了捞出每个节点当前的 commit 位置组成一个数组然后给这个数组排个序取中间的位置。这个位置就是集群的 commit 位置也就是 apply 的位置。先把集群每个节点的 commit 位置取出来是这样的后来排个序是这样的黑色的节点 commit 位置则是集群的 commit 位置总结Quorum 机制是分布式系统中很重要的理论部分这是一个关于多数派的机制。etcd 关于多数派有两个方面Leader 选举和 raft 日志运行etcd 的唱票实现非常简单就是一个计数“正”字的实现用一个 map 记录集群的节点投票计数超过多数则胜出etcd 确认集群 commit 位置则是先把每个节点的 commit 位置放在数组然后排个序然后取中间位置这个位置就是集群的 commit 位置多数节点 commit 过的日志才是集群 commit 的位置集群 commit 的日志才能 apply 这个要记住喽集群 commit 位置将由 Leader 通过心跳或者日志复制的消息告诉其他节点往期推荐虚幻引擎5上的《黑客帝国》全新体验爱了爱了元宇宙真的是割韭菜吗Redis会遇到的坑你踩过几个核弹级漏洞把log4j扒给你看点分享点收藏点点赞点在看