07 | Raft算法(一):如何选举领导者?
07 | Raft算法(一):如何选举领导者?
讲述:于航
时长13:39大小10.94M
有哪些成员身份?
选举领导者的过程
选举过程四连问
节点间如何通讯?
什么是任期?
选举有哪些规则
如何理解随机超时时间
内容小结
课堂思考
赞 36
提建议
精选留言(87)
- Jialin2020-02-28Raft 算法本质:通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致 服务节点状态: • 领导者(Leader):处理写请求、管理日志复制、与跟随者间维持心跳服务 • 跟随者(Follower):接受和处理来自领导者的消息,当领导者节点故障时,推荐自己进行选举 • 候选人(Candidate):向其他跟随者节点发送请求投票 RPC 消息,通知投票,若获得大多数节点的投票,则成功竞选为领导者。 服务节点状态变更: • 跟随者 -> 候选人 -> 领导者 • 领导者 -> 跟随者 • 候选人 -> 跟随者 Raft 算法通过任期、领导者心跳消息、随机选举超时时间、先来先服务的投票原则、大多数选票原则等,保证了一个任期只有一位领导,也极大地减少了选举失败的情况。具体的选举细节如下: • 节点间通讯方式:RPC 通讯,分为请求投票 RPC 和日志复制 RPC。投票 RPC 由候选人发起,通知其他阶段进行投票选举; 日志复制 RPC 由领导者发起,用于日志复制和维持心跳服务。 • 领导者任期:与现实生活中领导者任期不同的是,这里的任期是指任期编号,而非任期时间。跟随者在等待领导者心跳信息超时后,推举自己为候选人时,会增加自己的任期号;如果一个服务器节点,发现自己的任期编号比其他节点小,那么它会更新自己的编号到较大的编号值。 • 在 Raft 算法中约定,如果一个候选人或者领导者,发现自己的任期编号比其他节点小,那么它会立即恢复成跟随者状态 • 如果一个节点接收到一个包含较小的任期编号值的请求,那么它会直接拒绝这个请求 • 选举规则: • 领导者周期性地向所有跟随者发送心跳信息,维持自己的领导者状态 • 跟随者在随机超时时间内没有收到领导者的心跳信息,则发起领导者选举,节点状态变更为候选人,进入选举阶段 • 选举阶段,候选人收到超过半数以上的投票,节点状态变更为领导者,选举结束 • 选举阶段,一个服务节点最多会对一个任期编号投出一张选票,按照“先来先服务”原则进行投票;若任期编号同,则按照“日志完整性”原则进行投票。(日志完整性是服务节点的最后一条日志项对应的任期编号值和索引号。一般情况下,任期编号值更大,索引号更大)。 • 随机超时时间: • 跟随者等待领导者心跳信息超时的时间间隔,是随机的 • 当没有候选人赢得过半票数,选举无效了,这时需要等待一个随机时间间隔,也就是说,等待选举超时的时间间隔,是随机的展开共 2 条评论58
- 益军2020-02-26关于raft的领导者选举限制和局限,我的理解: 1.读写请求和数据转发压力落在领导者节点,导致领导者压力。 2.大规模跟随者的集群,领导者需要承担大量元数据维护和心跳通知的成本。 3.领导者单点问题,故障后直到新领导者选举出来期间集群不可用。 4.随着候选人规模增长,收集半数以上投票的成本更大。
作者回复: 加一颗星:)
共 2 条评论41 - piboye2020-05-02为什么raft不采用paxos方式选主?
作者回复: 加一颗星:),不直接采用Basic Paxos,是因为在Raft中不是所有的节点都能当选领导者,只有大多数节点中日志最完整的节点才能当选领导者。
共 3 条评论30 - starwolf2020-04-06老师有两个问题请教一下,第一就是投票要获得大多数的选票,但是投票发起者怎么知道现在的票数已经超过半数了?因为分布式环境的机器数目是随时变化的。第二个问题,您在课程中说过,raft算法会让日志最完整的当选,这个不一定吧,如果第二完整的节点先发起投票,并获得大多数选票,也是可以当选的吧。这两个问题请帮忙解答一下,谢谢
作者回复: 加一颗星:),问题1:集群配置不是随时变化的,需要按照一定的算法,比如联合共识、单节点变更,来添加和移除节点,也就是集群当前的节点数是已知的。问题2:是的,日志较完整的节点能当选,只要完整度不比大多数节点低,就可以了,感谢反馈,已修正。
共 8 条评论27 - Jialin2020-02-29https://zhuanlan.zhihu.com/p/27207160 这篇文档值得看看18
- 每天晒白牙2020-02-26Raft这种"一切以我为主"的强领导模型和上一讲中的chubby有点类似,chubby是只能从主节点读取,相当于单机,性能和吞吐量有限 Raft的强领导模型是写要以主为主,也相当于单机了。性能和吞吐量也会受到限制
作者回复: 加一颗星:)
17 - ξ!2020-08-11http://thesecretlivesofdata.com/raft/ raft算法动态演示,看完老师的再看这个清晰明了
作者回复: 加一颗星:)
共 2 条评论16 - 蚂蚁内推+v2020-05-25老师请教一个问题,如果一个日志完整度最高的节点由于随机超时时间较长,没能帅先发起投票,没能当上领导者,那么这部分日志要怎么处理?
作者回复: 加一颗星:),如果新领导者不包含这部分日志,这部分日志会覆盖,即“以领导者日志为准,实现各节点日志的一致”,需要我们注意的是,复制到大多数节点的日志项,是不会丢失和改变的,而只被成功复制到少数节点的日志项,可能会被覆盖,也可能最终会被提交。
共 2 条评论11 - 旅途2020-03-09老师 问个问题 如果 大多数跟随者节点 被相同任期编号 但是日志序号小的 先联络到了 这样的话 不是日志序号小节点 当选了吗
作者回复: 加一颗星:),不是,因为日志完整度比它高的节点,不会投票给它,也就是文中提到的选举规则的第6条。
10 - 欧阳2020-03-10请问任期一般多长呢?还是只要不故障,任期一直不变?任期索引是用32位整数表示么?如果达到最大int,怎么处理呢?
作者回复: 加一颗星:),一般而言,在实际环境中,领导者任期长达数天(Chubby团队的观察值),具体取决于系统运行、网络状况等;在Hashcorp Raft中,任期索引是uint64,足够大了。
共 3 条评论8 - 岁月如歌2020-03-06raft算法的局限: 1、强领导模型对于写功能基本退化单机性能,量大任然会出现性能瓶颈,适得其反。 2、选举期间会集群将出现短暂不可用现象,影响时长与选举时间相关。 有几个细节需要跟韩老师请教: 1、raft集群如何感知其他节点呢?候选节点如何判断获得的票数已经过半,从而晋升为领导者? 2、节点是如何存储任期编号?集群如果关闭重启是否任期编号归零? 3、 {1.当任期编号相同时,日志完整性高的跟随者(也就是最后一条日志项对应的任期编号值更大,索引号更大),拒绝投票给日志完整性低的候选人。比如节点 B、C 的任期编号都是 3,节点 B 的最后一条日志项对应的任期编号为 3,而节点 C 为 2,那么当节点 C 请求节点 B 投票给自己时,节点 B 将拒绝投票。} ------------------------------------------------------------- 文中该陈述应该标注为 选举有哪些规则 第6点。且表达意思与配图有所冲突: B节点(任期编号3)、C节点(任期编号4),C节点任期编号更大,为何B节点拒绝C节点投票请求? 请老师解析一下。展开
作者回复: 加一颗星:),问题1:每个节点都存储有集群配置,也就集群成员的地址信息,所以,一个节点就能通过rpc消息和其它节点交互,另外,知道了当前集群的成员数,也就能判断“接收多少票数时,票数过半了”。问题2:任期编号,要持久化存储,并以原子变量的形式实现,集群重启,需要恢复到之前的值。问题3:感谢反馈,已修正。跟随者会比较日志完整性,来判断是否投票给候选人的,这个特性,能保证,只有日志较完整的节点(也就是包含所有已提交日志项的节点)才能当选领导者。
8 - Geek_niu2020-03-02候选者在向别的节点发布请求投票的RPC时,他是通过广播洪泛,还是gossip那样的方式
作者回复: 加一颗星:),可以理解为广播,广播给其他所有节点。
8 - Happy2020-02-28老师您好,如果加了随机的超时时间,但是为了选取日志完整性较高的节点,导致一轮下来还是没有选举成功,那么会进行第二轮选举吗?此时的第二轮选举任期编号会 +1 吗?
作者回复: 加一颗星:),会的,因为一个节点对一个任期编号只有一张选票,投完就没了,如果不加一,也没法进行新一轮选举。
共 2 条评论8 - QQ怪2020-04-20leader挂了会导致集群不可用,读写都在leader上会有性能瓶颈,类似单机
作者回复: 加一颗星:),领导者挂了,会选举出新的领导者,Raft具有节点故障容错能力。
共 4 条评论6 - longyi2020-04-20如果一个节点孤立了,这个节点可能不断的发起选举,但是又成不了leader,所以它的term会越变越大。当它回到集群的时候,它拥有一个很大的term,会对集群其他节点造成什么影响吗?
作者回复: 加一颗星:),不会,比如,其它节点接收到来自它的请求投票RPC消息后,会更新自己的term到这个值(它的值),然后会比较日志完整性,决定是否投票给它。
共 4 条评论5 - 侧耳倾听2020-04-14随机时间的问题上,我理解的是每个跟随者随机一个超时时间,所以时间范围上从小到大的随机数,这个随机时间间隔不会太大,要不然时间小的跟随者要发起多次选举,时间的作用是为了避免同一节点多个选举的情况出现,那么,如果一个跟随者想要选举自己成为领导者,必须要得到超过半数追随者的投票,实际等待下一个超时时间间隔的意思是要一直等到跟随者失联数目超过半数,这之间可能需要经过数个间隔
作者回复: 加一颗星:),主要目标是减少选票被瓜分的情况。
5 - 小宇宙2020-07-12leader为中心主要有三个问题:1)性能问题,如果leader为慢节点会导致长尾。2)日志的同步必须是有序提交 3)切换leader时会有一段时间的不可用
作者回复: 加一颗星:)
3 - 波波2020-03-08老师你好,如果一个跟随者因为网络原因未收到领导者心跳,这时这个节点变成候选节点,此时这个节点发起的投票,其他正常的节点会回应投票结果么?
作者回复: 加一颗星:),会的,按照文中提到的选举规则,进行投票。
共 8 条评论4 - 黄海峰2020-02-26写请求无法扩容
作者回复: 加一颗星:)
共 3 条评论3 - 林万伟2020-07-31老师,请问A、B、C三个节点,B为leader,三个节点term都为1,然后发生网络分区,A一个子网,B、C一个子网。A因为一直选举,导致term很大。这时候会有两种情况: 1.分区期间,日志没有变化,A、B、C三个节点的日志完整性都一样,这时候A节点网络恢复。此时Leader会是谁? 2.分区期间,日志发生变化,必然是B、C子网的日志完整性更高。此时A节点网络恢复,这个时候Leader会是谁呢?展开
作者回复: 加一颗星:),问题1:可能是A,取决于投票情况;需要我们注意的是,当其他节点接收到A的投票请求后,会将自己的term更新到这个较大的值。问题2:可能是B或C,不可能是A,因为A不是“大多数”节点中日志最完整的节点。
3