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

09 | Raft算法(三):如何解决成员变更的问题?

单节点变更
可能出现两个领导者
突破写性能瓶颈
stale
consistent
default
容忍少数节点故障
共识算法
不是一致性算法
解决方法
问题
性能优化
一致性模型
Raft算法特点
成员变更问题
Raft算法

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

你好,我是韩健。
在日常工作中,你可能会遇到服务器故障的情况,这时你就需要替换集群中的服务器。如果遇到需要改变数据副本数的情况,则需要增加或移除集群中的服务器。总的来说,在日常工作中,集群中的服务器数量是会发生变化的。
讲到这儿,也许你会问:“老韩,Raft 是共识算法,对集群成员进行变更时(比如增加 2 台服务器),会不会因为集群分裂,出现 2 个领导者呢?”
在我看来,的确会出现这个问题,因为 Raft 的领导者选举,建立在“大多数”的基础之上,那么当成员变更时,集群成员发生了变化,就可能同时存在新旧配置的 2 个“大多数”,出现 2 个领导者,破坏了 Raft 集群的领导者唯一性,影响了集群的运行。
而关于成员变更,不仅是 Raft 算法中比较难理解的一部分,非常重要,也是 Raft 算法中唯一被优化和改进的部分。比如,最初实现成员变更的是联合共识(Joint Consensus),但这个方法实现起来难,后来 Raft 的作者就提出了一种改进后的方法,单节点变更(single-server changes)。
为了帮你掌握这块内容,今天我除了带你了解成员变更问题的本质之外,还会讲一下如何通过单节点变更的方法,解决成员变更的问题。学完本讲内容之后,你不仅能理解成员变更的问题和单节点变更的原理,也能更好地理解 Raft 源码实现,掌握解决成员变更问题的方法。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了Raft算法中的成员变更问题以及解决方法。在集群中进行成员变更时,可能出现两个领导者的情况,违背了Raft集群的领导者唯一性原则,影响了集群的稳定运行。为了解决这个问题,文章提出了单节点变更的方法,通过一次变更一个节点的方式,完成成员变更,保证集群中始终只有一个领导者,并且集群能够稳定运行。此外,文章还提到了在分区错误、节点故障等情况下可能出现的问题,并给出了解决办法。文章还介绍了Raft算法的特点和应用场景,以及在实际工程中的应用案例。总的来说,本文通过深入讲解成员变更的问题和单节点变更的原理,帮助读者更好地理解Raft算法,并掌握解决成员变更问题的方法。文章内容丰富,涵盖了Raft算法的原理、应用和实际场景中的应用案例,对于想要深入了解共识算法的读者具有很高的参考价值。

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

全部留言(57)

  • 最新
  • 精选
  • 每天晒白牙
    可以参考Kafka的分区和ES的主分片副本分片这种机制,虽然写入只能通过leader写,但每个leader可以负责不同的片区,来提高写入的性能

    作者回复: 加一颗星:)

    2020-03-02
    5
    57
  • XHH
    1、leader可以合并请求 2、leader提交日志和日志复制RPC两个步骤可以并行和批量处理 3、leader可以并发和异步对所有follower 并发日志复制,同时可以利用pipeline的方式提高效率 4、每个节点启动多个raft实例,对请求进行hash或者range后,让每个raft实例负责部分请求

    作者回复: 加一颗星:)

    2020-03-02
    2
    33
  • 竹马彦四郎的好朋友影法師
    韩老师您好~ (A,B,C) 三个旧配置A是leader,然后加入D,然后网络分区为(A,B)和(C,D), 那么A依旧赢得大多数选票而是leader. C因为分区,所以也开始发起选举,赢得了C、D的选票,注意哦~ ,C也是旧配置哦~ 那么C不也就成为leader了么? 所以不就出现了2个leader了么? 也就是D作为新配置固然无法成为leader,但是C作为旧配置还是可以成为leader的呀~ 希望您能指点一下. 但是我说一下我的看法,我的看法是——您一开始在"成员变更的问题"中举的例子貌似有点问题——应该是C、D、E中的D或者E会成为新配置中的leader而不是C节点会成为新配置中的leader,因为C的(旧)配置中原本就没有D、E,它即便获取到D、E的选票也不能认为自己得票过半,这样就能解释的通了。

    作者回复: 加一颗星:),C如果属于旧配置,它无法得到D的投票,因为旧配置不包括D,所以C不会成为leader。

    2020-05-04
    2
    27
  • kylexy_0817
    韩老师,有个问题,其实在实际生产环境中,是不是应该尽量避免网络分区才是重点,例如把某个集群的机器,尽量放在同一个内网中。举个我想到的例子,ABC三个节点,A在网络1,BC在网络2,初始化时,A成为了领导者,后来在网络2的单节点D加入集群,此时正好出现网络分区,BCD重新重新选举,得到B是领导者,后面网络通讯恢复了,这样即使采用单节点变更的方式,不也同样会出现了脑裂了吗?不知道我的理解正不正确,求解答。

    作者回复: 加一颗星:),问题1:集群一般放在同一个机房中的,公网存在网络抖动、消息丢失等问题,网络分区,更准确的说,是指任意数量的消息丢失或者高延迟,这在同一个机房内,也是无法避免,比如进程崩溃了、机器高负载等。问题2:不会,旧领导者A会退位,在leader lease(比如Hashicorp raft的默认值是500ms)到期后,而且即使在leader lease期间,旧领导者也无法执行领导者的功能,因为他无法联系上大多数节点,所以,这时,准确来说,只有一个领导者,B,也就是,不存在脑裂问题的。

    2020-04-19
    18
  • 黄海峰
    老师,这种共识算法只是用于p2p的分布式系统吧,像hadoop/spark这些大数据分布式系统都是主从模式,部署就决定了谁是master,根本就不用这些共识算法了。。。相对比主从模式更可靠更可控啊,因为没有这些这么复杂的选举逻辑。。除了区块链,其他系统用p2p是不是有什么不可取代的必要性呢?

    作者回复: 加一颗星:),如果主节点是静态配置的,宕机了怎么办呢?选择哪个节点作为从节点呢?副本数据不一致,怎么处理呢?共识算法,实现的是强一致性和分区容错能力。场景决定了系统形态。

    2020-03-03
    2
    14
  • 朱东旭
    一致性算法与共识算法的区别是啥,raft以领导者的日志为准,不就是保证了数据的最终一致吗。

    作者回复: 在中文中,很多资料将Consensus翻译成了一致性,和Consistency同义,其实应该翻译成共识,共识算法是实现一系列值的共识的。可以这么理解,但基于Raft,能实现强一致性,也就是线性一致性。后续规划了一篇,会具体说说这些内容。

    2020-03-03
    2
    9
  • 约书亚
    一般而言,在实际工程中,Consul 的 consistent 就够用了,可以不用线性一致性, 这句话是不是笔误了?

    作者回复: 关于Raft的一些高级特性,比如客户端协议、uncommited log丢失、指令重复执行等,在加餐篇,规划了一讲,统一补充,所以这里关于线性一致性没有展开聊。 需要客户端协议的配合,才能实现“exactly once”,实现线性一致性,但很多时候,只要指令重复执行,对最终的结果没有影响,就够用了。更多细节,我会在加餐篇,具体说说。

    2020-03-02
    5
    9
  • static
    老师好,想请教一个困扰我很久的关于Raft算法的一个问题。 在分布式锁场景下(使用Raft算法),A客户端向leader申请获取锁(set lock),此时leader应用lock信息日志,并RPC复制日志信息给follower节点,此时follower节点还没应用到状态机,leader收到大部分follower成功信息,自己应用了状态机并返回客户端说set lock成功,但此时leader宕机了,其中一个follower变为leader,此时客户端B来获取锁,发现leader没有lock信息(因为follower将lock信息应用到状态机靠leader心跳传递,但刚刚leader宕机了没来得及传递),客户端B此时获取锁也成功了,这不就破坏了锁的同步性吗?Raft算法是如何保证这种场景下的强一致性(线性一致性)?

    作者回复: 加一颗星:),我后面会做个补充:)

    2020-03-21
    5
    8
  • Kvicii.Y
    NO_OP这个空日志项该怎么理解呢,为了防止出现多个领导者?怎么防止的呢

    作者回复: 加一颗星:),一次单节点变更完成后,再执行下一次单节点变更,是能保证只有一个领导者的正确性的,而引入NO_OP 日志项,是为了确保可能的在执行的单节点变更,已执行完成。

    2020-06-21
    2
    7
  • ξ!
    老师,在配置单节点加入的时候,是怎么发现当前集群的呢,难道是在配置的时候就将集群的节点信息写入了么,即便这样的话,当前节点是怎么发现当前集群的领导者呢,在新节点加入的时候他是怎么知道当前集群的领导者的呢,这个发现领导者的过程是新节点主动发起的rpc还是领导者的心跳发现的呢

    作者回复: 加一颗星:),1. 向领导者“申请”,由领导者完成节点添加。2. 如何发现领导者,与实现有关,一般来说,可以采用这么两种实现:a. 若非领导者节点接收到“添加节点”请求时,返回领导者信息给新节点,然后新节点重新发送请求;b. 若非领导者节点接收到“添加节点”请求时,将该请求转发给领导者。具体实现,可参考19、20讲的代码。

    2020-11-17
    6
收起评论
显示
设置
留言
57
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部