专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

深入浅出一文搞懂分布式一致性算法新贵Raft协议

  前言
  在分布式的世界里,要说最核心最复杂的功能,一致性地实现无出其右,之前的paxos算法堪称经典,被认为是同类算法中效果最好的,基本上成为分布式一致性的代名词,但是paxos算法也是出了名的难理解,而且相当不好实现。本人也花了很多时间、看了很多材料也没有真正理解。所以基于paxos的思想进行的一致性算法的简化和实现就成为了现实的需求,在此背景下,本文的主角Raft就出现了。
  Raft算法的头号目标就是容易理解(UnderStandable),这从论文中就可以看出来。当然,Raft增强了可理解性,在性能、可靠性、可用性方面是不输于Paxos的。建议大家拜读下作者的论文Raft论文,下面将详细说明raft的思想以及实现的过程正文
  raft为了实现容易理解的目标,在paxos的基础上进行的状态简化以及问题拆分,将之前复杂的逻辑拆成若干个子问题,基本上可以总结成下面几个方面:leaderelection:选取主节点logreplication:日志备份,数据同步safety:为了实现上述两点而产生的一些约束条件和保障条件leaderelectionrole
  首先先说明下Raft算法中节点的角色,分为以下三种:leader:由所有节点选举,在candidate中产生,负责整个集群的状态以及元数据管理,当发现更大的term时,转化为followercandidate:由follower在集群选举时转化而成,选举时得到多数选票,则转化为leader,若发现主节点或者更大的term则转化为followerfollower:集群初始化时所有节点的角色都是follower,若未发现leader心跳,则发起leader选举,并将角色转化为candidate;leader以及candidate在某些条件下也会转化成follower
  给出状态机,协助大家理解:
  role
  上面在讲解role的时候好几次说到了一个名词term,这是raft算法中的一个核心概念,很多的机制都需要依赖term。term通俗来讲就是任期,即一个leader正常工作的时间段,如果因为某些原因当前的leader不再是leader时,则该term结束,重新进行选举,开始新的任期,是不是和现实生活中的选举很像?
  另外term在raft算法中也起到了逻辑时钟的作用,在raft的实现中起到了重要的作用,此处用一句话先来概括:即term大的优先级高,leader必须是拥有更大的term。用白话理解:就是当前总统和前总统的关系,总统只能有一个就是当期总统,前总统在当前总统面前就变成选民了。在Raft中,term是个整数型的值,term变化即将term的值加1leaderelectionprocess
  下面就来说说leader选举的详细过程,从上面的状态机可以看出,集群初始化时,大家都是follower,当未发现leader心跳并超时后,则follower变成candidate,并发起leaderelection。每个candidate的动作如下:给自己投一票向其他节点发起RequestVoteRPC来进行拉票等待其他节点的响应
  在此过程中会出现三种情况:该candidate收到了多数(majority)的选票当选了leader,并发送leader心跳告知其他节点,其他节点全部变成follower,集群选主成功该candidate收到了其他节点发来的leader心跳,说明主节点已经选举成功,该candidate变成follower,集群选主成功一段时间内(electiontimeout),该candidate未收到超过半数的选票,也未收到leader心跳,则说明该轮选主失败,重复进行leaderelection,直到选主成功
  上述情况的产生需要满足下面几个约束:在每个任期中每个人只能投出一票:注意是每个任期,任期变了(准确的说法是任期增加了)就可以重新投票投票的规则:candidate肯定投给自己,follower是先到先得当选leader的条件是得到多数(N21)选票:此处的多数选票是为了避免脑裂而出现多leader的情况而进行的约束,保证了整个集群中leader的唯一性leader的消息是最新的(其实就是term最大,index也是最大的,后面的logreplication模块进行详细分析)
  上面的前两种情况比较容易理解,我们重点来说说第三中情况,用一个比较形象的例子来说明选举过程:
  有五个小伙伴要选取一个组长,选举过程如下:
  注:F,C,L分别对应的是follower,candidate和leader角色,在本例中就是组员,候选人和组长;名字是用来区分节点的标识;而括号中的数字则代表着term的值
  初始状态大家都是组员,等待组长联系自己等待一段时间后(leaderheartbeattimeout),昌坦,继东和呈祥发现没有组长或者组长掉线了,这三个人就变成了候选人,然后发起了组长选举的流程选举开始后,三个候选人都将自己的任期加1变成了2,然后投了自己一票,而组员晓通选了昌坦,组员溪泽选了呈祥,三个候选人的票数比是2:1:2,未能达到法定的半数以上的多数票,未能选出组长漫长的等待后(electiontimeout),昌坦发现自己没有获得多数选票,也没有收到其他候选人当选组长的消息(leaderheartbeat),意识到了此次选举失败,然后将自己的任期加1变成3,再次发起选举,组员晓通和溪泽发现该任期中未投票,先到先得,直接投给了昌坦,而候选人继东和呈祥发现昌坦的任期比自己大,则放弃候选人的角色变成了组员并投票给昌坦(此处从候选人变成组员也可能是收到了昌坦当选组长的消息后转变的,因为组长的当选并不需要全票,只要达到多数选票即可)昌坦全票当选组长,并向其他组员通报了自己成为组长的消息,后续所有的组内管理以及消息同步都通过组长昌坦向其他组员传达
  整个leaderelection流程就是这样,是不是很好理解,基本上符合现实生活中的理解。但是上述的流程可能有一个问题,分为以下两种情况:如果在第三阶段三个候选人同时发现选举未成功,同时发起二次选举,而恰好昌坦和晓通的关系很好,呈祥和溪泽的关系很好(关系好可以理解为网络近,优先到达,优先获得投票),则可能出现多次2:1:2,无法达到多数(majority)的情况如果当前的组员不是5个人,而是4个人或者6个人,而候选人是2个,则会出现2:2或者3:3的情况,无法达到多数(majority)的情况
  上述的两种情况会影响到leaderelection的成功率和效率,在设计中应该被规避,面对这两种情况,Raft给出了自己的解决方案:节点数尽量是奇数个,尽量保证majority的产生每个candidate的electiontimeout时间在某一个时间段内随机,如150ms300ms,这样能最大程度上避免同时再次发起选举的概率,某个candidate可以率先发现electiontimeout然后增加term并重新发起选举,大概率能获得多数选票而当选,另外每一次选举每个candidate都会刷新electiontimeout,来保证majority的产生leaderelection
  当系统有了leader后,系统就进入对外工作期了。客户端的一切请求来发送到leader,leader来调度这些并发请求的顺序,并且保证leader与followers状态的一致性。raft中的做法是,将这些请求以及执行顺序告知followers。leader和followers以相同的顺序来执行这些请求,保证状态一致。
  下图就是请求写入处理的相关流程:
  客户端向leader提交写入请求leader接收到客户端请求后封装RPC并行将修改发送到followerfollower在接收到leader发送的RPC后,回复leader已经收到该请求在leader接收到多数(majority,含leader)follower的回复后,回复客户端接收成功,将变更状态设置为commited,然后将变更写入到状态机,此时写入实际上已经生效,无法回滚leader与follower通信,协助follower完成变更的提交,当变更提交完毕后,follower会将变更写入到状态机,此时变更才真正的影响到节点,此时的状态可以理解为applied。此过程中,可能会出现各种问题,比如说网络连接超时,命令执行不成功等问题,leader会持续和follower进行通信,保证follower最终完成所有的操作,与leader达成最终一致性。这种最终一致性是对内的,对外部的client的透明的,外部的client只会看到leader上状态的强一致性。这种强一致性和最终一致性的配合使用,不仅降低了一致性实现的各种成本,还保证了系统的健壮性,能保证在各种异常情况下的恢复与状态同步。
  上述流程中,有点类似于两阶段提交(2PC),这种提交方式的好处就是能简化分布式事务的复杂性,在不直接使用分布式锁的前提下,能最大程度保证分布式事务的实现。但是这里和标准的2PC还是有差别的,差别就是这里leader只需要多数(majority)的follower答复即可,那么在这种情况下,raft是怎么保证一致性以及数据的完整性,尤其在集群主节点发生故障的时候呢?此处先留下这个问题,后续在safety模块进行解答
  最后看下log长什么样子吧:
  log由三部分组成:序号:代表着命令的执行顺序,leader将命令按顺序发给follower,follower按顺序执行命令,保证数据的一致性term值:将命令按term进行划分,每个命令都属于一个term操作命令:真正执行和影响节点状态的命令
  log为了配合raft实现leader选举以及状态同步,需要具备某些特性,满足相关的约束:回到上文的问题,leader选举的时候要保证leader上的log是最新的,那最新的概念是什么?这里解答下:log最新的概念就是term是最大的且index也是最大的,如图中的leader,term是4,index是7,都是最大的从初始状态为空开始,leader将客户端请求(command)封装到一个个logentry,将这些logentries复制(replicate)到所有follower节点,然后大家按相同顺序应用(apply)logentry中的command,则状态肯定是一致的。log是appendonly的file,对于已经committed的命令,log只会新增,不会修改和删除,这也带来了另外一个特性,就是如果两个不同节点在同一位置的日志相同,那么在此位置之前的所有的值都相同只有leader的发送的logentry被多数(majority)的节点(包含leader)接收并响应,才会被标识为committedsafety
  上面大部分说的都是正常情况下raft是怎么工作和运行的,但是一个分布式不仅需要在正常情况下能稳定高效的运行,也需要在任何情况下,系统都不能出现不可逆的错误,也不能向客户端返回错误的内容。raft也是如此,上面两个章节已经说明了为了达到safety目标raft所采取的一些策略和约束,下面就来以几个典型场景来说明下raft是怎样容错的。followercrash
  followercrash处理起来相对简单,只要重新上线加入集群后,发现了已经存在的leader,直接加入集群并且接收来自leader的消息,然后在leader的指导下完成数据和状态的同步,在此过程中,leader与follower通信使用的是AppendEntriesRPC,借用官方的结构图:
  另外,每个节点上的日志都是通过状态机(StateMachine)进行管理的,节点上applied的command会提交到状态机进行保存,用于后续节点(leaderfollower)之间进行数据和状态同步,下面是状态机中状态相关的结构图:
  从上图可以看出对于每个follower,leader保持2个属性,一个就是nextIndex即leader要发给该follower的下一个entry的index,另一个就是matchIndex即follower发给leader的确认index。
  实现过程如下:
  leader当选成功后,会进行部分属性的初始化:nextIndexleader的log的最大index1matchIndex0
  然后开始准备AppendEntriesRPC请求的参数:prevLogIndexnextIndex1prevLogTerm从log中得到prevLogIndex对应的term
  初始化entries数组:初始化以及成功当选的第一次心跳的时候是空后续的值是从本地log中取prevLogIndex1到最后的所有logentry
  最后是leaderCommit赋值:leaderCommitleader上的commitindexentry
  至此,所有参数准备完毕,发送RPC请求到所有的follower,follower再接收到这样的请求之后,处理如下:重置HeartbeatTimeout检查传过来的请求term和当前follower的term,如果当前term大于master的term,则返回false检查prevLogIndex和prevLogTerm和当前follower的对应index的log是否一致。检查的方法就是follower在prevLogIndex这里是不是有entry,如果有的话,term的值和prevLogTerm是否一致。这里可能就是不一致的,因为初始prevLogIndex和prevLogTerm是leader上log的lastLog,因为网络等原因,可能还未同步到这个index,如果不一致的话返回false,同时将该follower上log的lastIndex传送给leaderleader接收到上述false之后,会记录该follower的上述lastIndexnextIndexfollower传回来的index1matchIndexfollower传回来的index然后leader会从新按照上述规则,发送新的prevLogIndex、prevLogTerm、和entries数组nextIndexfollower传回来的index1matchIndexfollower传回来的indexprevLogIndexfollower传回来的indexprevLogTerm从log中得到上述prevLogIndex对应的termentry〔〕从本地log中取prevLogIndex1到最后的所有logentryleaderCommitleader上的commitindexfollower检查prevLogIndex和prevLogTerm和对应index的log是否一致(目前一致了)然后follower就开始将entries中的数据全部覆盖到本地对应的index上,如果没有则算是添加如果有则算是更新,也就是说和leader的保持一致最后follower将最后复制的index发给leader,同时返回ok,leader会像上述一样来更新follower的macthIndexleadercrash
  leadercrash相对来说比较复杂,需要针对几个固定场景进行具体分析,详细参考这篇文章:Leader节点的一致性保障leader与follower同步数据
  在集群出现异常重新选取leader后都需要面临数据同步的问题,下面这张图列举了集中场景:
  上面列举了6钟follower可能存在的状态,前两种follower的数据比leader少,中间两种follower数据比leader多,最后两种leader和follower数据有多有少。这里需要注意一下:
  图中的虚线框代表着uncommitted的logentry;
  另外,此时leader的term是8(如果这7个节点是一个集群的话),后续分析中这一点很重要。
  具体分析下上述几种场景中follower状态产生的原因:第一种情况比较常见,follower和leader在同一term,就少一个index,这是client刚将数据写入到leader,leader正常将该数据同步到follower即可第二种情况是follower在term4就crash或者网络中断了,在term6重新恢复,此时leader只要通过AppendEntriesRPC正常同步即可。第三种情况产生的原因是该follower在term6的时候是leader,在写入第三个值的时候,还没来得及同步给follower,自己就crash或者网络中断了,所以最后一个logentry处于uncommitted的状态第四种情况产生的原因是该follower在term7的时候是leader,刚当选leader并通知其他follower后就网络中断了,自己处于一个局域网中,在client端写入两个值后,无法同步给follower,所以最后两个logentry处于uncommitted的状态第五种情况产生的原因是该follower在term4的时候是leader,刚当选leader并通知其他follower后,写入了两个值同步给follower并commit后就网络中断了,自己处于一个局域网中,在client端继续写入两个值后,无法同步给follower,所以最后两个logentry处于uncommitted的状态第六种情况产生的原因是该follower在term2的时候是leader,刚当选leader并通知其他follower后就网络中断了,自己处于一个局域网中,在client端写入三个值后,无法同步给follower,所以term2的三个logentry处于uncommitted的状态;此时网络突然恢复,进入了term3,在该term中,该follower参加leader选举又被选为leader,刚当选leader并通知其他follower后就网络中断了,自己处于一个局域网中,在client端写入三个值后,无法同步给follower,所以term3的三个logentry处于uncommitted的状态
  上面的几种情况虽然不太具备现实意义,但是还是对于我们理解整个raft的各种机制有很大的帮助,建议大家好好梳理下,肯定会有收获的。
  针对上面的所有情况,处理方式就就是,leader选举时所有的uncommitted的logentry都会回滚(所以图中所有的uncommitted的logentry其实在term8leader选举后就不存在了,此处画出来仅仅是为了方便大家理解整个数据和状态的演变过程),然后当出现了leader与follower不一致的情况,leader强制follower复制自己的log,复制的过程参加followercrash这一章节raft算法如何保证leader的数据永远是最新的且不会丢数据
  这个问题其实是由上面的几个majority以及几个约束共同来完成的:majoritycommitmajority:一条消息只有变成committed状态才被认为已经提交成功,而committed状态的前提是该消息已经同步到了majority的节点votemajority:某个candidate当选leader的条件就是该candidate获得到了majori节点的选票约束leader当选的条件是log是最新的
  综上,commitmajority代表着最新数据的持有;而votemajority代表着最后的leader会从这里面产生(candidate肯定会投自己的票,所以也在votemajority之中),而这两个majority肯定会有1到(N21)个节点是重复的,也就是这些节点既有最新的数据,也有机会成为leader,再看那个约束条件,这个约束条件将votemajority中不具有最新数据的那些节点排除,那么最后的leader节点一定会在两个majority重复的节点中产生,而这些节点持有最新的数据,保证了leader的数据永远是最新的且不会丢数据。
  raft与其他协议(ViewstampedReplication、mongodb)不同,raft始终保证leader包含最新的已提交的日志,因此leader不会从followercatchup日志,这也大大简化了系统的复杂度。总结
  raft将一致性问题分解成两个相对独立的问题,leaderelection,logreplication。流程是先选举出leader,然后leader负责复制、提交log(log中包含command),为了在任何异常情况下系统不出错,即满足safety属性,对leaderelection,logreplication两个子问题有诸多约束,在满足功能和性能的基础上,尽量简化模型以及状态,提高了整个算法的易理解性和易实现性,堪称经典且实用的算法。
  想想Paxos算法是LeslieLamport在1990年就公开发表在了自己的网站上,想想我们是什么时候才听说的?什么时候才有一个可用的实现?而Raft算法是2013年发表的,现在可以看到有许多不同语言开源的实现库了。而且很多raftlike算法在raft的基础上进行了定制化扩展,用以满足各种系统需求(如elasticsearch7中的集群协调子系统中定制化raft的实现),这就是易理解性和易实现性的重要性。

闭口粉刺痘痘红黑痘印!痘肌药膏的正确用法!恭喜你抓住一枚热爱护肤的小仙女最爱倒腾些瓶瓶罐罐已经成功从黄黑皮转变为黄一白如果你也爱护肤,喜欢素面朝天的自由感请关注我争取每天分享护肤知识!图源网络现在铺天盖地的药膏太多了,好多脖子和腋下的小肉粒是什么?可以用手直接揪掉吗?别忽视了冬日生活打卡季随着生活不断提高,对于皮肤管理更加重视,尤其对女性来讲,为了能够使皮肤更加的光泽细腻,会通过昂贵的护肤品来保养,更是成为各大美容机构的常客。平时在照镜子的时候会发现腋身高不足158cm的女生,尽量少穿这3个长度的大衣,否则显矮又显胖要想通过穿搭去提升你的魅力并改善你的身材bug,我们在挑选服装的时候要注意它的版型,长度,尤其是在冬天,像这些长大衣,长款羽绒服对于咱们的身材要求会更高,如果你没有选择合适的款式就空调买定频,还是买变频?维修工这样说,听完我不纠结了空调几乎是每一家都喜欢的一个电器,因为现在的夏天的温度越来越高,所以空调就显得格外的重要,在空调房里面待着特别舒服。我们家装修完已经半年了,最近准备住进去,但是因为家里面的空调还没卧龙电驱八方股份大洋电机,你看好谁有人的地方就有江湖,有江湖的地方就有电,有电的地方就要用电机。我们可能不怎么关注电机,但它已经渗透到我们生活的各个方面,哪怕一个小小的升降桌,都要用到电机。说起电机,最近还真买了一借力网上空中丝绸之路,瑞贝卡等许昌假发新品快步走向全球消费者大河财立方记者吴春波一位美国顾客在当地跨境电商平台下单购买假发,多长时间可以收到货物?河南省两会前夕,假发大王瑞贝卡国际电商部总经理张会婷告诉大河报大河财立方记者,通过空中丝路走空新能源车企销量大盘点北汽蓝谷全年完成率仅50。2近日,北汽蓝谷公布了子公司北京新能源汽车股份有限公司2022年销量,全年销售50,179辆车。在2022年初,北汽集团张夕勇曾经表示北汽新能源今年的销量目标为10万辆,其中含极狐4人性的逻辑人性到底是啥生存与繁衍这两点无善无恶就和狮子吃掉麋鹿一样狮子没有错他只是在你眼中看起来是残忍而已和你每天吃其他动物尸体一样难道你错了吗爱美炫富是人性吸引对方来与之交配母爱是人性都是武契奇称欧洲有冒牌泽连斯基,乌军消耗让西方弹药储备紧张据塞尔维亚广播电视援引塞尔维亚总统武契奇的话报道,自行宣布独立的科索沃共和国总理库尔蒂试图冒充新的泽连斯基,而把塞尔维亚伪装成俄罗斯,但都是白费功夫。在查看该国北部铁路建设情况时,除蓝环章鱼外,你还需要注意这些常在饭桌上出现的毒物!2023年1月16号晚,一名网友在线求助科普博主博物博物,火锅店看到的,可以下锅吗?在线等,挺急的!谁知就是这突发奇想的询问救了该网友一命!这造型奇特的章鱼竟是世界毒性排行第三的剧为你揭秘8大时尚保健真相误区一芦荟美容现代社会污染太多,天然食品及其美容护肤品由于未受污染,所以对人休健康有利。最典型的就是芦荟,既是健康食品,又是美容住品。芦荟对人体确实有不少神奇美妙的作用,但是,芦荟
斯诺克巨星争议言论持续发酵!奥沙利文爆发公开回击别想激怒我20222023斯诺克英锦赛伴随着马克艾伦的夺冠暂时告一段落,但是英锦赛期间一位斯诺克名将制造的舆论声音却还没有想要停止的迹象。有关注的球迷应该都比较清楚,英锦赛期间世界第一的奥沙模特卡拉德莱文涅(CaraDelevingne)拍摄的时尚杂志CaraDelevingne拍摄英国版时尚芭莎如果您不太了解CaraDelevigne的背景和成长经历,她对HarpersBazaar英国作家BrookeTheis的采访将为Car等你老了不要急着扮嫩,学她们这样打扮,从容优雅地老去女人上了年纪后,对她最好的褒奖不是多么漂亮,而是多么气质。毕竟中老年人拼的是气质,从来不是长相,从骨子里散发出来的优雅气质自信光彩知性美与书卷气,才是中老年人最具价值的财富。所以等46岁曾黎状态真绝了,穿二分超短裤拍大片优雅又风情,轻松美出圈曾黎作为史上最美中戏校花,她的五官不仅精致,还很大气,结合优雅从容的熟女气质,虽然年轻时不占优势,会略显成熟,但随着年纪的增长,她却比同龄人更耐老,46岁还美得跟36岁似的,穿灰咖人在旅途人生是场单程旅行。倏忽间,那个当初豪情万丈满怀激情走向讲台的女孩,已到知天命的时光。回首走过的路程及过往种种,我心怀感激,生命中遇到的人和事,都是让我成长的笔笔财富。感谢有缘相遇的秋冬最鲜的滋味,都在这一盘!鲜到跳脚嫩到爆表票选一个给肉都不换的食材,你们选啥?我嘛,首先想到的是豆腐,像汪曾祺说的如果没有豆腐,中国人民的生活将会缺一大块。纸包豆腐豆腐素净百搭,耐得住煎炸炖煮炒烩,给它什么味就出什么味。做2022感恩节高级发圈文案一感恩节高级文案1感恩有你!今生是你,余生是你。2有幸与你相爱,余生为你而来。3感恩每个瞬间,恰好有你的陪伴。4感恩的心,藏在每一份期待里。5感恩每一份信任,致谢每一次选择。6感谢学习志现在不搏,更待何时?没有人能阻挡你的进步,除非你自己!做好自己,不畏将来,不惧过往!岁月不曾饶过我,我又何曾饶过岁月?这段时间,我更加深刻地感受着我的群中之子的成长茁壮蓬勃不可阻挡红色短款上衣搭配黑色短裙,显瘦显高,更显时尚红色短款上衣搭配黑色短裙,显瘦显高,更显时尚。都说红蓝自古就产生cp,但红黑搭配其实更时尚。红色是高度饱和的,非常明亮,热情,艳丽。而黑色则是一种非常低调的颜色,饱和度非常低。当它从一汽夏利被迫改革到埃安岚图融资百亿,国有车企混改新模式走红11月17日晚,岚图汽车宣布完成A轮融资近50亿元,融资后市场估值近300亿元。本轮融资后,东风集团持股78。88,A轮投资者持股12。37,岚图员工持股平台持股8。75。下一步,(经济)河北井陉特色产业助力乡村振兴入冬以来,在河北省石家庄市井陉县南王庄乡割髭岭村,当地农户忙着制作传统手工红薯粉条和粉条深加工产品,供应市场。近年来,井陉县在推进乡村振兴工作中,围绕一村一品发展思路,推动乡村产业
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网