分布式协议与算法实战
韩健
腾讯资深工程师
23193 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
分布式协议与算法实战
15
15
1.0x
00:00/00:00
登录|注册

07 | Raft算法(一):如何选举领导者?

Raft算法的强领导者模型的限制和局限
大多数选票原则
先来先服务的投票原则
随机选举超时时间
领导者心跳消息
任期
日志必须是连续的
不是所有节点都能当选领导者
课堂思考
日志复制
领导者处理写请求
选举领导者
特点
Raft算法

该思维导图由 AI 生成,仅供参考

你好,我是韩健。
通过前两节课,我带你打卡了 Paxos 算法,今天我想和你聊聊最常用的共识算法,Raft 算法。
Raft 算法属于 Multi-Paxos 算法,它是在兰伯特 Multi-Paxos 思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多。
除此之外,Raft 算法是现在分布式系统开发首选的共识算法。绝大多数选用 Paxos 算法的系统(比如 Cubby、Spanner)都是在 Raft 算法发布前开发的,当时没得选;而全新的系统大多选择了 Raft 算法(比如 Etcd、Consul、CockroachDB)。
对你来说,掌握这个算法,可以得心应手地处理绝大部分场景的容错和一致性需求,比如分布式配置系统、分布式 NoSQL 存储等等,轻松突破系统的单机限制。
如果要用一句话概括 Raft 算法,我觉得是这样的:从本质上说,Raft 算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致。这句话比较抽象,我来做个比喻,领导者就是 Raft 算法中的霸道总裁,通过霸道的“一切以我为准”的方式,决定了日志中命令的值,也实现了各节点日志的一致。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Raft算法是一种常用的共识算法,相对于Paxos算法更加简化和易于理解。它通过领导者选举、日志复制和成员变更等核心机制,实现了分布式系统中的容错和一致性需求。文章首先介绍了Raft算法中的成员身份,包括领导者、跟随者和候选人三种状态,以及它们的角色和行为。然后详细讲解了选举领导者的过程,包括节点间通讯采用的远程过程调用(RPC)、任期的概念和选举规则。整体而言,本文通过简洁清晰的语言和图例,深入浅出地介绍了Raft算法的原理和实现细节,适合读者快速了解和掌握该算法。文章还强调了Raft算法中的选举规则和随机超时时间的重要性,以及其对选举失败情况的处理方式。此外,文章提出了一些课堂思考问题,引发读者对Raft算法设计的限制和局限性进行思考。整体而言,本文全面介绍了Raft算法的特点、领导者选举等内容,为读者提供了深入了解该算法的良好基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《分布式协议与算法实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(93)

  • 最新
  • 精选
  • 益军
    关于raft的领导者选举限制和局限,我的理解: 1.读写请求和数据转发压力落在领导者节点,导致领导者压力。 2.大规模跟随者的集群,领导者需要承担大量元数据维护和心跳通知的成本。 3.领导者单点问题,故障后直到新领导者选举出来期间集群不可用。 4.随着候选人规模增长,收集半数以上投票的成本更大。

    作者回复: 加一颗星:)

    2020-02-26
    2
    49
  • piboye
    为什么raft不采用paxos方式选主?

    作者回复: 加一颗星:),不直接采用Basic Paxos,是因为在Raft中不是所有的节点都能当选领导者,只有大多数节点中日志最完整的节点才能当选领导者。

    2020-05-02
    3
    34
  • starwolf
    老师有两个问题请教一下,第一就是投票要获得大多数的选票,但是投票发起者怎么知道现在的票数已经超过半数了?因为分布式环境的机器数目是随时变化的。第二个问题,您在课程中说过,raft算法会让日志最完整的当选,这个不一定吧,如果第二完整的节点先发起投票,并获得大多数选票,也是可以当选的吧。这两个问题请帮忙解答一下,谢谢

    作者回复: 加一颗星:),问题1:集群配置不是随时变化的,需要按照一定的算法,比如联合共识、单节点变更,来添加和移除节点,也就是集群当前的节点数是已知的。问题2:是的,日志较完整的节点能当选,只要完整度不比大多数节点低,就可以了,感谢反馈,已修正。

    2020-04-06
    11
    29
  • ξ!
    http://thesecretlivesofdata.com/raft/ raft算法动态演示,看完老师的再看这个清晰明了

    作者回复: 加一颗星:)

    2020-08-11
    2
    20
  • 每天晒白牙
    Raft这种"一切以我为主"的强领导模型和上一讲中的chubby有点类似,chubby是只能从主节点读取,相当于单机,性能和吞吐量有限 Raft的强领导模型是写要以主为主,也相当于单机了。性能和吞吐量也会受到限制

    作者回复: 加一颗星:)

    2020-02-26
    18
  • 蚂蚁内推+v
    老师请教一个问题,如果一个日志完整度最高的节点由于随机超时时间较长,没能帅先发起投票,没能当上领导者,那么这部分日志要怎么处理?

    作者回复: 加一颗星:),如果新领导者不包含这部分日志,这部分日志会覆盖,即“以领导者日志为准,实现各节点日志的一致”,需要我们注意的是,复制到大多数节点的日志项,是不会丢失和改变的,而只被成功复制到少数节点的日志项,可能会被覆盖,也可能最终会被提交。

    2020-05-25
    2
    12
  • 旅途
    老师 问个问题 如果 大多数跟随者节点 被相同任期编号 但是日志序号小的 先联络到了 这样的话 不是日志序号小节点 当选了吗

    作者回复: 加一颗星:),不是,因为日志完整度比它高的节点,不会投票给它,也就是文中提到的选举规则的第6条。

    2020-03-09
    11
  • 岁月如歌
    raft算法的局限: 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:感谢反馈,已修正。跟随者会比较日志完整性,来判断是否投票给候选人的,这个特性,能保证,只有日志较完整的节点(也就是包含所有已提交日志项的节点)才能当选领导者。

    2020-03-06
    9
  • Happy
    老师您好,如果加了随机的超时时间,但是为了选取日志完整性较高的节点,导致一轮下来还是没有选举成功,那么会进行第二轮选举吗?此时的第二轮选举任期编号会 +1 吗?

    作者回复: 加一颗星:),会的,因为一个节点对一个任期编号只有一张选票,投完就没了,如果不加一,也没法进行新一轮选举。

    2020-02-28
    2
    9
  • 欧阳
    请问任期一般多长呢?还是只要不故障,任期一直不变?任期索引是用32位整数表示么?如果达到最大int,怎么处理呢?

    作者回复: 加一颗星:),一般而言,在实际环境中,领导者任期长达数天(Chubby团队的观察值),具体取决于系统运行、网络状况等;在Hashcorp Raft中,任期索引是uint64,足够大了。

    2020-03-10
    3
    8
收起评论
显示
设置
留言
93
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部