大道之美 ——raft一致性算法初探
Posted 航指数
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大道之美 ——raft一致性算法初探相关的知识,希望对你有一定的参考价值。
大数据技术和应用作为伴随着互联网发展壮大的产物,在短短不到20年的时间里,已经逐渐从最初的概念设想和草根实践演变成国家级、现象级的技术方向,与云计算、移动互联网并驾齐驱,在各行各业掀起了一股技术革新、思维转变的旋风,并逐步与原有业务相互融合促进,进而迸发出前所未有的璀璨光芒。一大批的大数据应用如雨后春笋一般蓬勃发展,众多的大数据工具组件层出不穷,大数据之“术”随处可见。在沉醉于这些激动人心的魔术同时,我们也需要平静下来体会一下大数据那厚积薄发的“道”,感悟大数据的核心理念和关键实现,以道驭术,事半功倍。
本期为大家带来的大(数据)“道”为raft一致性算法,这是一种相对易于理解和实现的分布式系统协同算法,其设计思路和实现原理不失为并行计算经典之作,很值得供广大致力于大数据系统设计及应用开发同仁的借鉴。
并行计算能够逐渐替代传统的大机,其成功的秘诀很大程度就在于充分发挥各节点的存储计算能力,协同完成复杂的计算加工任务。因此,在分布式系统中,众多节点之间需要频繁的通信来沟通协调,如何保障各节点、网络在复杂的环境下,始终保持通信机制的可靠无误就变得至关重要。俗话说,一个和尚挑水吃、两个和尚抬水吃、三个和尚就没水吃,当集群规模变大,各节点、网络由于复杂的运转情况,在单机环境下简单的一致性操作都会变得异常复杂。在Raft诞生之前,Paxos算法曾长期统治着一致性算法领域,但其复杂的理论实践使得众多草根设计开发人员望而生畏;Raft的初衷就是用一套贴近于人类社会自然现象的思维理论,来解决大规模集群下的一致性协调问题。
基本概念与思路
既然参照自然规律,我们可以从身边来思考,如何在广大人民群众中快速统一思想?抛开洗脑和蒙骗,最简单而自然的答案莫过于——选举。通过广大群众投票选举出合适的领导,由领导发号施令,所有民众都自觉遵循,是快速形成合力的不二法则。Raft的核心思想也是在集群中通过选举机制,确立集群的领导者,尤其代表集群整体对外接受需求,并在内部督促执行。集群所有节点按其特性可分为三类,即:leader(领导)、follower(群众)、candidate(候选者),其中前两者可以认为是稳定状态,长期存在;竞选者是一个中间过渡状态,只有当领导人换届时才会出现,一旦领导人确立,就会自动消失。
状态转换过程
了解了Raft的基本思想和角色分类,让我们来看看Raft算法的基本过程,如下图所示:
1.集群初始化时所有节点都是群众,群龙无首,就如同原始社会,没有领导;
2.各个节点自己检测,发现一定时间内没人给自己发指令,就开始把自己转变成候选者,并向其他节点发起拉票动作,希望自己能成为领导;
3.机会总是留给有准备的人,总有幸运儿获得了大多数(超过一半节点)的支持,立刻从候选者正式变成领导,此后将行使领导者的权利来管理集群;
4.当遇到有更新的领导者消息传来,或者领导者因为自身原因失去了领导地位,就又变成群众从头再来;
5.候选者接收到领导者传来的消息,知道自己竞选失败,就自觉的变成群众;
6.如果候选者在选举期内没有得到明确的回复,就再次发起新一轮选举。
整个过程看起来非常简单,但具体实现起来,仍然需要设定很多细节和约束条件:
1.首先是领导存在任期。原则上如果一个领导永远不犯错,那么它的任期将是终生制,但即使终身,也是有期限的,过了100年还是得换下任。Raft中引入term(任期)概念,每个leader的诞生、以及每轮选举的进行,都将导致任期增加。一个任期内,只会有一个领导,也可以一个领导都没有(竞选无结果时)。
2.少数服从多数的原则。没有十全十美的领导,也没有完全统一的集群。只要满足多数通过,领导就可以当选,也只有获得多数支持,领导才能继续任职。
3.主从关系的确定。所有命令,都只能从领导向群众传递,群众无权指挥领导,他们只能被动执行领导的命令。当然,群众的眼睛也是雪亮的,一旦有领导犯了错误,群众有权拒绝执行领导的决定。简单的说,群众只能回答yes or no,所有的命令都由领导下达。
4.领导和群众之间需要密切保持联系,这些联系是以心跳的方式实现的。这些心跳基本功能就是领导向群众传达两个意图:I am ok,are you ok?群众接到心跳,且判定为正常,就继续老老实实做群众,并及时响应领导;反之,则在超过特定时间后自发进入候选者状态,启动其竞选之旅。
关键活动
利用Raft来实现集群一致性管理的过程中,重要的活动可以归结为:竞选、日志复制和安全保障三个方面。竞选是前置条件,只有确立了统一的领导,才能在领导的英明决策下协同工作。日志复制可以认为是具体的执行层面,即有了领导之后的具体工作。而安全保障则可以看成是确保选举和工作的重要规章制度,Raft算法的编制者们很多的奇思妙想和推演论证,都是为了确保算法的安全稳定。
1、领导者选举
集群的领导者竞选,非常文明而安静。候选者陆续根据自己的判断而向大家发起拉票要求(requestVote RPC),它的请求中会简单的表明身份,指出自己所在的任期(在其前任基础上+1),然后开始安静的等待。其他节点接收到拉票请求后,非常自觉的把候选者任期与自己所处的任期比较,如果发现比自己的更大,则予以认可,并按照先到先得的公正原则,把自己宝贵的一票投给最先拉拢自己的当期候选者。
当某个候选者获得过半投票后,就将被选作当期的领导,并立即发布获胜感言(心跳)给所有节点,宣誓其领导地位并结束此轮选举。如果一定时间内没有任何候选者获得过半投票,那么意味着多个候选者同时参选把票额摊薄了,这时各个候选者将以自身不同的随机时长为周期启动新一轮投票,而随机性也确保很难发生再次同时发起竞选请求的情况,能够有效的确保不会再次发生无功而返的竞选。
2、日志复制
日志复制是领导和群众关系建立后的日常工作。所有的外部需求都由领导负责接收,领导先在自己的小本本里记下此需求,然后通过发文(AppendEntries RPC)向各群众传递。每条新需求都会有一个对应的索引编号,结合领导的任期,为每条复制需求建立起一个二维的坐标。群众将每条接收到的消息坐标与自己之前记录下的最后消息坐标进行比较,对更新的消息进行接收,对老的消息进行拒绝。日志复制是Raft算法中非常严谨而又关键的一环,任期和日志索引的双重定位使得如果两个节点如果接收到相同的二维坐标,那此消息内容完全一致,且此消息之前的内容也完全一致。
日志复制是单向的,所有群众的日志必须与领导者日志一致,如果发生冲突,将会逐步找到最大的相同坐标,然后保留在此之前的重合部分,并用领导的后继日志完全替换群众的后继日志。
3、安全性
针对安全性方面的考虑,作为上述竞选和复制环节的补充,Raft算法提供了一系列的限制与理论推导来确保过程的严谨与完备。在考虑失效和例外环节,重点是针对领导者出问题的情况进行讨论,这也完全符合社会实践的规律,毕竟权力越大,责任越大。
除了上述三个重点环节外,Raft的设计与实现过程中,还充分考虑了各类节点失效、各类超时参数设置、以及集群动态调整等一系列具体问题,而且结合与Paxos的对标,从便于理解、正确性以及性能等方面给出了详尽的数据。受制于篇幅限制,这里就不再一一列举,感兴趣的同学可以自行阅读附录中的相关材料。
应用前景
正如Raft算法的初衷里所提到的,能理解、便于使用的算法才是好的算法。而raft以其贴合自然的思维与精巧细致的技术实现,很好的满足了广大开发者对分布式系统一致性保障的通用需求,使得其自2013年正式问世以来,快速普及并应用到众多的开源项目与实践中,先后开发出二十多种主流语言的算法实现,比较著名的是Coreos开发的etcd组件,广泛用于云计算领域的服务发现框架中,例如当前非常热门的由Google开源的Kubernetes,而且已经形成了庞大的用户群体,不断地对算法进行优化提升,应用前景一片光明。其中所涉及的设计思路与精巧实现,也堪称并行计算领域的典范,对大数据平台以及云计算技术实现都有很大的启发和引领作用,值得我们深入理解与掌握。
大道至简,越是简单的明白的道理,越容易得到广大用户的理解与认可,Raft这个典型的以社会自然规律来管理统治大规模集群的成功实践,充分体现了计算机理论与其他科学、人文、以及社会实践的相辅相成。我们有理由相信,随着多元化思维理论的相互融合与创新,将不断涌现出类似Raft这样“小而美”的精巧理论,能够不断催生出AlphaGo那样的惊世之作,而可爱的攻城狮们也应该埋头码字的同时多抬头看天,在追逐技术的同时体悟大道本源,日积月累,坚守本心,方能不至于随波逐流,才能在新技术风起云涌的浪潮之中保持正确的方向。
本文由 航指数 原创编辑,
如有 转载 需求,
请到微信后台联系我们,
如有咨询及合作,
请发邮件至:zhishu@travelsky.com
▼ “阅读原文”查看更多精品文章
以上是关于大道之美 ——raft一致性算法初探的主要内容,如果未能解决你的问题,请参考以下文章