云原生 Etcd 系列之Quorum 和唱票那回事
关于 Quorum 的两个维度
前几回说了那么多框架,设计思想的文章。今天分享一个很小的点,etcd 的 quorum 是怎么实现的?
Quorum 机制本质就是一个关于多数派的事情,这个多数派应用的有两个方面:
选举过程:获得多数节点投票的节点才能获胜,成为 Leader ; 运行过程:被多数节点 commit 的日志位置,这个才是被集群可靠记录的位置。被集群 commit 的日志才能被应用 apply ;
那么这里有两个小思考问题:
既然是选举过程,那怎么选举结果唱票的?
既然是运行过程,那集群的这些节点怎么确认集群的 commit 位置?
有选举自然有唱票
唱票是在选举流程中的一个步骤。还记得以前选班干部的时候,在黑板上写“正”字,谁得票多谁就获胜当选。
etc云原d 里面也有选举,也就是 Leader 的选举。Leader 获胜的依据是的票满足大多数,也就是满足 quorum 机制。
今天我们就来看看 etcd 的唱票是怎么做的?
很简单的思路,我们给每个参与选举的朋友计数,得票超过半数的,那么就胜出。
比如说 A,B,C,D,E 五个人竞选,那么得到 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{} ,不占空间,一举两得。
// etcd/raft/quorum/majority.go func (c MajorityConfig) VoteResult(votes map[uint64]bool) VoteResult { // 搞个长度为&nbsEtp;2 的数组 ny := [2]int{} // 遍历集群节点 for id := range c { v, ok := votes[id]  cd; if !ok { // 暂时没投票的 missing++ continue &nb 系sp; } if v { // 投票赞同的 ny[1]++ &列之nbsp; } else { // 投票拒绝的 ny[0]++ } } &nQubsp; q := len(c)/2 + 1 if ny[1] >= q { // 选举成功:得票数超过半数,,比如 votes => [yes, yes, yes] return VoteWoorn } if ny[1]+missing >= q { // 未知情况:不确定成功,也不确定失败 return VotePending } &nbsump; // 选举失败 return VoteLost }
唱票的实现很简单,就如下几个步骤:
遍历集群节点; 统计谁赞同了、谁拒绝了、谁还没投票; 唱票的结果有三种:成功,失败,待定; 赞同投票的超过半数( len(c)/2+1 ),则胜利;
这实现可太简单了,就是一个遍历投票结果,写“正”字,“正”字超过半数则胜出。
集群的节点怎么确认集群的 commit 位置?
集群内被多数节点 commit 的位置才是集群的 commit 点。也就是说这个也需要满足 quorum 。这个就有意思了。
关键步骤:排序,然后取中间的位置。
取的这个中间的位置就是满足 quorum 和 的 commit 。
// etcd/raft/quorum/majority.go func (c MajorityConfig) CommittedIndex(l AckedIndexer) Index { // 遍历集群节点:取出每个节点的 commit for id := range c { 唱票 if idx, ok := l.AckedIndex(id); ok { srt[i] = uint64(idx) i--  那回; } } // 排个序 insertionSort(srt) // 取中间,这个位置就是大多数 commit 的位置,属集群共识 pos := n - (n/2 + 1) &nb云原sp; 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 通过心跳或者日志复制的消息告诉其他节点;
- ·标签: 日产汽车 刘新宇 日产中国 东风日产
- ·网银互联郑永:SD-WAN技术为企业上云创造更大价值
- ·标签: 楠菲微电子 交换芯片 PHY芯片 网卡芯片
- ·科学家开发独特的机器人手 可以在不松开手的情况下旋转物体
- ·标签: 影石创新 Insta360 2025业绩快报 运动相机
- ·阿里云CTO周靖人成为阿里合伙人
- ·浙大团队破解AI生成难题:让机器学会"深思熟虑"而非"冲动决策"
- ·云计算开发:Python练习实例-查找字符串
- ·多集群下的 Tekton 流水线
- ·Realbotix 与 Grupo Kuo 达成合作 将 AI 机器人引入西班牙和葡萄牙
- ·英国担心Facebook收购Giphy交易 要求两家5天内提交整改建议
- ·标签: 曦智科技 光计算芯片 光电混合算力 oMAC
- ·标签: 神火股份 电解铝 电池铝箔 超薄铝箔
- ·阿里云推出新一代动作生成模型 Wan2.2-Animate,全面开源!
- ·标签: 默克 罗杰仁 生命科学 医药健康
- ·阿里云域名价格调整 2月1日起net英文域名续费上调至89元
- ·https://www.londontheatredirect.com/search/百度快排【tg:seogoogle987】,I2e
- ·https://blvdseafood.com/?s=百度快排【tg:seogoogle987】m99
- ·https://www.tarleton.edu/news/search/百度快排【tg:seogoogle987】,J8j
- ·https://www.tahiti-infos.com/search/百度快排【tg:seogoogle987】,k5h
- ·https://www.uckfieldtc.gov.uk/?s=百度快排【tg:seogoogle987】,dVN
- ·https://www.libros.unam.mx/catalogsearch/result/?cat=37&dir=asc&format=20&lit=20&manufacturer=3230&mode=list&order=year_edition&q=百度快排【tg:seogoogle987】,oXZ
- ·https://wydden.com/?ID=r8w9WMSKWkOcmiaFWaUv0dzMdqZWfKtF&s=百度快排【tg:seogoogle987】,eRN
- ·https://www.skicheck.at/en/?action=CHECK&s=百度快排【tg:seogoogle987】,t9h
- ·https://www.valuecolleges.com/?action=QUERY&s=百度快排【tg:seogoogle987】,Ujj
- ·https://hsmoa.com/search?query=百度快排【tg:seogoogle987】1fi
- ·Meta 推出 Gaia2 评估平台:提升智能体在真实场景中的适应能力
- ·标签: 思格新能源 AI+光储一体化 许映童 港股IPO
- ·标签: 普诺威 IC封装基板 MEMS 歌尔微
- ·英特尔新CEO上任发言:在所竞争的每一个业务领域都成为引领者
- ·火山引擎、阿里云、腾讯云联合发布“超低延时”直播技术标准
- ·云计算核心技术Docker教程:Swarm模式管理和维护一群 Docker 引擎
- ·AI高仿你的笔迹只需1个词,Deepfake文字版来了,网友:以假乱真
- ·Soul语音模型SoulX-Podcast震撼发布:90分钟无中断播客生成,AI语音革命再升级
- ·标签: 阿里 HappyOyster ATH创新事业部 HappyHorse
- ·标签: 小鹏汽车 自动驾驶L4 人形机器人 飞行汽车
