Quorum 和唱票那回事

228d4bd8921231b3a94e550f10084f76.gif

作者 | 奇伢

来源 | 奇伢云存储

b09b2e2523da7cc59a9a3129208ac687.png

c2bef71ce1ac061103a8b83c41a8c731.png

关于 Quorum 的两个维度

c068b3a1f32ad855bc8364c8bd928ff5.png

前几回说了那么多框架,设计思想的文章。今天分享一个很小的点,etcd 的 quorum 是怎么实现的?

Quorum 机制本质就是一个关于多数派的事情,这个多数派应用的有两个方面:

  1. 选举过程:获得多数节点投票的节点才能获胜,成为 Leader ;

  2. 运行过程:被多数节点 commit 的日志位置,这个才是被集群可靠记录的位置。被集群 commit 的日志才能被应用 apply ;

那么这里有两个小思考问题:

  1. 既然是选举过程,那怎么选举结果唱票的

  2. 既然是运行过程,那集群的这些节点怎么确认集群的 commit 位置

838488e416ca2ee81caaedea6330cd0e.png

有选举自然有唱票

4040e13b03918e3003c64db7d97dd6d7.png

唱票是在选举流程中的一个步骤。还记得以前选班干部的时候,在黑板上写“正”字,谁得票多谁就获胜当选。

etcd 里面也有选举,也就是 Leader 的选举。Leader 获胜的依据是的票满足大多数,也就是满足 quorum 机制。

今天我们就来看看 etcd 的唱票是怎么做的?

很简单的思路,我们给每个参与选举的朋友计数,得票超过半数的,那么就胜出。

比如说 A,B,C,D,E 五个人竞选,那么得到 3 票的就可以胜出。

32031c30152193a890050bd104c51ad8.png

来看看 etcd 的唱票

93448448e0c377d03572eaaf03866f85.png

选举属于 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 {// 暂时没投票的missing++continue}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
}

唱票的实现很简单,就如下几个步骤:

  1. 遍历集群节点;

  2. 统计谁赞同了、谁拒绝了、谁还没投票;

  3. 唱票的结果有三种:成功,失败,待定;

  4. 赞同投票的超过半数( len(c)/2+1 ),则胜利;

这实现可太简单了,就是一个遍历投票结果,写“正”字,“正”字超过半数则胜出。

4de861a2ac6203c6aacea2e1be36d176.png

集群的节点怎么确认集群的 commit 位置?

4c461d6dcdf34eb47d5b0cf2b7804557.png

集群内被多数节点 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 位置取出来,是这样的:

8b4c7b7d935978f6d0a638ab1a54c25f.png


后来排个序是这样的,黑色的节点 commit 位置则是集群的 commit 位置

b0504c8ff0ffb1eeff368099dfcce7af.png



bedd6338a68bea56e78c5d7b2f4491e5.png

总结

18b912c4946ff2a44e420daa7868bf37.png

  1. Quorum 机制是分布式系统中很重要的理论部分,这是一个关于多数派的机制。etcd 关于多数派有两个方面:Leader 选举和 raft 日志运行;

  2. etcd 的唱票实现非常简单,就是一个计数“正”字的实现,用一个 map 记录集群的节点,投票计数超过多数则胜出;

  3. etcd 确认集群 commit 位置则是先把每个节点的 commit 位置放在数组,然后排个序,然后取中间位置,这个位置就是集群的 commit 位置

  4. 多数节点 commit 过的日志才是集群 commit 的位置,集群 commit 的日志才能 apply ,这个要记住喽;

  5. 集群 commit 位置将由 Leader 通过心跳或者日志复制的消息告诉其他节点;

68f5eec43e34369e2c5ba04145555ffb.gif

db8c5846fa264a5111e7739109f55d50.png

往期推荐

虚幻引擎5上的《黑客帝国》全新体验,爱了爱了

元宇宙真的是割韭菜吗?

Redis会遇到的坑,你踩过几个?

核弹级漏洞,把log4j扒给你看!

1c93cacd6cec0094206ced150eff0362.gif

点分享

590eebfb68e2fa53514733263142dde0.gif

点收藏

8fea6bf70f515ea8a791edff38230d84.gif

点点赞

6e42a7050775736ad8829927a868da3b.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 迷你桌面地图_求教贴,Java桌面小游戏的地图怎么做

展开全部小游戏地e5a48de588b63231313335323631343130323136353331333365656566图一般都是各种图片的拼接,然后保存到2维数组里面比如//数值常量public static final int EMPTY0;//空地什么也没有public static final int BRICK1;//土墙public static final int STONE2;//石头p…

快速界定故障:Socket Tracer网络监控实践

简介: Socket Tracer定位是传输层(Socket&TCP)的指标采集工具,通过补齐网络监控的这部分盲区,来达到快速界定网络问题的目标。 作者 | 四忌 来源 | 阿里技术公众号 一 背景 随着软件应用的集群化、容器化、微服务化,产品的…

剑指企业级云原生,阿里云 CNFS 如何破局容器持久化存储困境

简介: 云原生趋势下,应用容器化比例正在快速增长,Kubernetes 也已成为云原生时代新的基础设施。 据 Forrester 预测,到 2022 年, 全球企业及组织在生产环境运行容器化应用。观察今天的容器和 Kubernetes 的应用现状&am…

Log4j 第三次发布漏洞补丁,漏洞或将长存

整理 | 郑丽媛、禾木木出品 | CSDN这几天,Apache Log4j 2 绝对是众多 Java 程序员提到的高频词之一:由于 Apache Log4j 2 引发的严重安全漏洞,令一大批安全人员深夜修 Bug、打补丁。此次漏洞更是因为其触发简单、攻击难度低、影响人群广泛等特…

二分法求数组最大最小_js-求数组的最大值和最小值

取出数组中的最大值或者最小值是开发中常见的需求,但你能想出几种方法来实现这个需求呢?Math.maxJavaScript 提供了 Math.max 函数返回一组数中的最大值,用法是:Math.max([value1[,value2, ...]])值得注意的是:如果有任…

TailwindCSS v3.0 正式发布!一大波新特性来袭!

作者 | 一只图雀来源 | 程序员巴士今天给大家介绍一篇关于 Tailwind 最新发布的 v3.0 相关的内容。2021 年 12 月 10 日,TailwindCSS 的创始人 Adam Wathan 宣布 TailwindCSS v3.0 正式发布,带来了一系列性能上的改进、对开发工作流的改善以及大量的新特…

曦智科技发布最新光子计算处理器PACE

成功验证光子计算优越性,以光子技术突破集成电路产业边界 2021年12月15日,全球领先的光子计算芯片公司曦智科技(Lightelligence)发布了其最新高性能光子计算处理器——PACE(Photonic Arithmetic Computing Engine&…

python 下载图片到内存卡_python - 获取图像大小而不将图像加载到内存中

如果您不关心图像内容,PIL可能是一种过度杀伤力。我建议解析python magic模块的输出:>>> t magic.from_file(teste.png)>>> tPNG image data, 782 x 602, 8-bit/color RGBA, non-interlaced>>> re.search((\d) x (\d), t).g…

搭载第四代自研神龙架构 阿里云发布RDMA增强型实例等多款新品

12月21日消息,阿里云发布多款基于自研神龙架构的弹性计算新品,包括RDMA增强型实例、800G GPU超算实例、FPGA计算型实例、GPU图形计算型实例等,在性能方面大幅提升,同时增加了多种服务形态,将计算延伸至客户身边&#x…

最新光子计算处理器面世:单个光子芯片集成超万个光子器件,频率达1GHz

12月15日,光子计算芯片公司曦智科技(Lightelligence)发布了其最新高性能光子计算处理器:PACE(Photonic Arithmetic Computing Engine,光子计算引擎)。该处理器单个光子芯片中集成超过10,000个光…

Snowflake如日中天是否代表Hadoop已死?大数据体系到底是什么?

简介: 本文作者关涛是大数据系统领域的资深专家,在微软(互联网/Azure云事业群)和阿里巴巴(阿里云)经历了大数据发展20年过程中的后15年。本文试从系统架构的角度,就大数据架构热点,每…

金蝶携手工商银行完成首单数字人民币费用报销业务

2021年12月17日,金蝶业务系统成功完成首单使用数字人民币进行的公转私支付业务。据悉,这是中国工商银行股份有限公司(以下简称“工商银行”)第一笔使用“数字人民币银企直连”进行的公转私支付费用报销业务,也是金蝶成…

Java对象转换方案分析与mapstruct实践

简介: 随着系统模块分层不断细化,在Java日常开发中不可避免地涉及到各种对象的转换,如:DO、DTO、VO等等,编写映射转换代码是一个繁琐重复且还易错的工作,一个好的工具辅助,减轻了工作量、提升开…

致敬 hacker |盘点内存虚拟化探索之路

简介: 内存虚拟化相比裸机,仍然存在较大差异,是当下值得关注的问题! 云与虚拟化 云计算是通过 Internet 服务的方式提供动态可伸缩资源的计算模式,经过多年的发展已成为企业 IT 技术的重要支撑。虚拟化是云计算的核心…

minwindow java_java中setMinWindowLayout()是什么呀?

展开全部分析代码 ,可以看出SInfo 是JFrame的子类.setMinWindowLayout() 方法,就可能就是该类自定义的方法,因为JFrame并没e68a8462616964757a686964616f31333431373937有该方法.根据该方法名推测, 这个方法应该就是设置界面布局的方法,主要用于调整组件(按钮,输入框...等)的位…

走进新华三解决方案 360°业务能力中心,读懂新华三如何助力企业数字化转型

随着数字化转型步入“深水区”,云计算、5G、AI 等新一代技术落地应用各行各业。企业对“端到端”解决方案的需求愈发强烈,亟待统一规划、建设和交付的“端到端”解决方案。对此,作为业界领先的数字化解决方案领导者,新华三自 2019…

阿里云马涛:什么是操作系统的云原生?

简介: 云原生已经成为IT界最流行的一个定语,似乎不谈云原生就out了,但什么才是真正的云原生? 注:本文作者马涛,阿里云智能研究员、阿里巴巴集团内核团队创始人之一、阿里云基础软件部操作系统团队负责人。…

pip 安装_安装 pip 轻松管理 PyPI 软件包 | Linux 中国

在 Linux、Mac 或 Windows 上为旧版 Python 安装 pip。-- Vijay Singh KhatriPython 是一种功能强大、流行广泛的编程语言,在常规编程、数据科学等很多方面它都有丰富的软件包可供使用。但这些软件包通常都不会在 Python 安装时自动附带,而是需要由用户自…

技术解析:一文看懂 Anolis OS 国密生态 | 龙蜥专场

简介: Anolis OS国密是社区在Anolis OS上做的国密技术解决方案。 编者注:本文系两位演讲者整理,他们在2021年阿里云开发者大会的「开源操作系统社区和生态分论坛」上带了分享,演讲主题为《国密技术开发与实践》,为国内…

场景联创 施耐德电气“绿色智能制造创赢计划”第二季收官

中国上海,2021年12月21日——今日,由工业和信息化部国际经济技术合作中心(工信部国合中心)与施耐德电气主办的“绿色智能制造创赢计划”第二季总决赛在上海举办。经过半年多的加速营培训、场景探访与联合方案开发,最终…