分布式协议与算法实战
韩健
腾讯资深工程师
立即订阅
4631 人已学习
课程目录
已更新 19 讲 / 共 22 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 想成为分布式高手?那就先把协议和算法烂熟于心吧
免费
理论篇 (4讲)
01 | 拜占庭将军问题:有叛徒的情况下,如何才能达成共识?
02 | CAP理论:分布式系统的PH试纸,用它来测酸碱度
03 | ACID理论:CAP的酸,追求一致性
04 | BASE理论:CAP的碱,追求可用性
协议和算法篇 (11讲)
05 | Paxos算法(一):如何在多个节点间确定某变量的值?
06 | Paxos算法(二):Multi-Paxos不是一个算法,而是统称
07 | Raft算法(一):如何选举领导者?
08 | Raft算法(二):如何复制日志?
09 | Raft算法(三):如何解决成员变更的问题?
10 | 一致哈希算法:如何分群,突破集群的“领导者”限制?
11 | Gossip协议:流言蜚语,原来也可以实现一致性
12 | Quorum NWR算法:想要灵活地自定义一致性,没问题!
13 | PBFT算法:有人作恶,如何达成共识?
14 | PoW算法:有办法黑比特币吗?
15 | ZAB协议:如何实现操作的顺序性?
实战篇 (3讲)
16 | InfluxDB企业版一致性实现剖析:他山之石,可以攻玉
17 | Hashicorp Raft(一):如何跨过理论和代码之间的鸿沟?
18 | Hashicorp Raft(二):如何以“集群节点”为中心使用API?
分布式协议与算法实战
登录|注册

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

韩健 2020-03-02
你好,我是韩健。
在日常工作中,你可能会遇到服务器故障的情况,这时你就需要替换集群中的服务器。如果遇到需要改变数据副本数的情况,则需要增加或移除集群中的服务器。总的来说,在日常工作中,集群中的服务器数量是会发生变化的。
讲到这儿,也许你会问:“老韩,Raft 是共识算法,对集群成员进行变更时(比如增加 2 台服务器),会不会因为集群分裂,出现 2 个领导者呢?”
在我看来,的确会出现这个问题,因为 Raft 的领导者选举,建立在“大多数”的基础之上,那么当成员变更时,集群成员发生了变化,就可能同时存在新旧配置的 2 个“大多数”,出现 2 个领导者,破坏了 Raft 集群的领导者唯一性,影响了集群的运行。
而关于成员变更,不仅是 Raft 算法中比较难理解的一部分,非常重要,也是 Raft 算法中唯一被优化和改进的部分。比如,最初实现成员变更的是联合共识(Joint Consensus),但这个方法实现起来难,后来 Raft 的作者就提出了一种改进后的方法,单节点变更(single-server changes)。
为了帮你掌握这块内容,今天我除了带你了解成员变更问题的本质之外,还会讲一下如何通过单节点变更的方法,解决成员变更的问题。学完本讲内容之后,你不仅能理解成员变更的问题和单节点变更的原理,也能更好地理解 Raft 源码实现,掌握解决成员变更问题的方法。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《分布式协议与算法实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(26)

  • 每天晒白牙
    可以参考Kafka的分区和ES的主分片副本分片这种机制,虽然写入只能通过leader写,但每个leader可以负责不同的片区,来提高写入的性能
    2020-03-02
    2
    10
  • 约书亚
    一般而言,在实际工程中,Consul 的 consistent 就够用了,可以不用线性一致性,

    这句话是不是笔误了?

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

    2020-03-02
    2
    3
  • XHH
    1、leader可以合并请求
    2、leader提交日志和日志复制RPC两个步骤可以并行和批量处理
    3、leader可以并发和异步对所有follower 并发日志复制,同时可以利用pipeline的方式提高效率
    4、每个节点启动多个raft实例,对请求进行hash或者range后,让每个raft实例负责部分请求
    2020-03-02
    3
  • 朱东旭
    一致性算法与共识算法的区别是啥,raft以领导者的日志为准,不就是保证了数据的最终一致吗。

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

    2020-03-03
    2
  • 黄海峰
    老师,这种共识算法只是用于p2p的分布式系统吧,像hadoop/spark这些大数据分布式系统都是主从模式,部署就决定了谁是master,根本就不用这些共识算法了。。。相对比主从模式更可靠更可控啊,因为没有这些这么复杂的选举逻辑。。除了区块链,其他系统用p2p是不是有什么不可取代的必要性呢?
    2020-03-03
    2
  • 密码123456
    我在想,为啥新旧大多数,只会有一个大多数。我觉得重叠的是领导者节点。比如a,b,c节点加入d个节点,领导者节点是a。然后a和cb发生分区故障。c,b会发生选举其中一个是领导者,然后a发现自己不满足大多数,变成追随者,节点增加失败,这样理解对不对?
    2020-03-21
  • 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
  • 刘学
    韩老师你好,我想到的可以解决因为强领导者导致的写性能瓶颈的办法是多分片,这样多个raft流程并发执行,不同的分片的master落在不同的机器上就可以很好的解决这个问题。在加入新节点后的第一步时,主节点向新加入的节点同步数据,那就意味着主节点需要支持向非本组成员的节点同步数据的功能对么?
    2020-03-11
  • 旅途
    老师 麻烦解答下 如果旧配置的大多数和新的大多数数量相等 并且有重叠的 这时候为什么不会产生两个领导者呢 是因为只能选重叠的做领导者吗?如果新的大多数数量大于旧配置 ,领导者就会在新的大多数中产生吗?
    2020-03-09
  • 岁月如歌
    我想说的是,在正常情况下,不管旧的集群配置是怎么组成的,旧配置的“大多数”和新配置的“大多数”都会有一个节点是重叠的。
    -----------------------------------------------------------
    对于老师上述说法 和 配图有点不理解 为何会发生这样的情况? 以及非正常情况下出现两个主节点呢 需要怎么处理?
    2020-03-09
  • 岁月如歌
    提升写性能需要单机限制,修改为多主节点形式,分片负载均衡。如redis集群方式 jedis-cluster 使用一致性hash分片负载 提升读写能力。
    2020-03-09
  • Infinite_gao
    谢谢老师的回复,新加入的节点,先同步日志,日志复制rpc。
    我的理解是:
    1. 新节点的在加入前就写好了配置文件(里面包含现在系统的leader+follower, 不确定这时有没有new的信息)。
    2.新节点加入启动时,连接leader(这一步的请求是什么类型?通信的细节是什么?)
    3.连接成功建立后,leader开始想新节点同步日志,用的日志复制rpc(这一步的疑问是,在日志同步的过程中,新节点开始被标记成正常节点吗?能参与投票选取吗?还有就是新的配置信息是在最后同步过去的吗?)。
    2020-03-08
  • Infinite_gao
    老师讲的深入浅出,可是有个疑问,为什么配置从老的阶段到中间阶段再到新阶段的这个过程没有进行阐述呢,配置的自动转换过程对于理解细节非常重要。C(old)->C(old,new)->C(new)。
    还有就是新加入的节点开始是通过什么类型的消息与原leader通信的,通信的信息细节是什么,是选举请求吗?

    作者回复: 上面那个配置变更,是联合共识,在实际中使用的少,文中介绍的是常用的,也是Raft作者后来设计补充的一个方法,单节点变更。
    新加入的节点,先同步日志,日志复制rpc。

    2020-03-07
    1
  • Infinite_gao
    老师好,我有以下细节问题不清楚,还希望您能帮忙解惑。
    1. 新节点加入时,如何与leader节点取得通信,也是先作为候选者发送选取请求(term=0),然后会收到leader节点的回复,从而知道了leader节点的信息?
    2. 配置信息是什么时候leader节点进行跟新的,是发现了第一步中有新的候选节点想它发送了选举请求后,在响应候选节点leader节点信息的同时,leader节点更新了配置信息?
       还是新加入的节点在加入前自身就配置好了新的配置信息(3->4),然后在与leader节点连接上后,是leader节点pull过来,还是新加入的节点push过去。
    2020-03-06
  • panda
    一般服务器集群收到的客户端的请求都是均等的吧,客户端也并不知道集群中哪个是领导,如果是follower收到客户端的请求,该如何处理?
    2020-03-06
  • 姜川
    有个疑问
    集群开始(A,B,C),然后加入D,这个时候如果出现分区故障,C和A,B断开了,
    这时加入D,会不会导致
    旧配置中(A,B,C)中只有A和B了,然后C和新加入的D组成了新配置(C,D)
    新配置中(C,D)中只有C,D,然后根据随机时间的方式进行选举,是不是依旧会出现两个领导者呀
    2020-03-04
    1
  • NICK
    当由于网络原因出现分区的时候,例如【A,B,C,D,E】集群,A是领导者,由于网络原因分成两个区【A,B,C】和【D,E】,一段时间后网络恢复,这样是否会出现两个领导者?如果是那该如何处理呢?如果不是,那选举或同步的步骤是怎样的呢?一直不明吧这个地方,望老师可以指点一下,谢谢

    作者回复: 是否会同时出现2个领导者的关键在于,是否同时存在2个大多数。比如5节点集群,不管如何分区,都不会同时选举出2个领导者的,因为,不存在2个大多数(也就是6个节点),但可能会出现,老领导者的lease还没超时,新领导者已经选举出来了的情况。

    2020-03-03
    3
  • EidLeung
    老师,有个地方没懂:
    “consistent:客户端访问领导者节点执行读操作,领导者在和大多数节点确认自己仍是领导者之后返回本地数据给客户端,否则返回错误给客户端。在这种情况下,客户端读到的都是最新数据。”和“一般而言,在实际工程中,Consul 的 consistent 就够用了,可以不用线性一致性,只要能保证写操作完成后,每次读都能读到最新值就可以了。”这两句话有点矛盾,没懂。
    第一句说读数据时需要向节点确认自己是领导者,应该是客户端读的时候领导者再向其他节点确认自己还是领导者,确认完成后再返回客户端数据。
    第二句说,写的时候确认是领导者(写完成),读的时候就是最新的值。
    这样第二句话在“写后出现网络分区导致已经选取了新的领导者,新的领导者又写入了数据,而旧的领导者还没退位的情况,此时读的数据应该不是最新的”(这个应该是default模型啊:写的时候保证写入,读的时候直接读)。

    作者回复: 第一句话,说的是如何保证每次都能读取到最新值。第二句话,说的是,在很多场景中,我们不需要线性一致性,能保证写操作完成后,每次读都能读到最新值就可以了,比如,指令重复执行,对最终的结果没有影响。因为线性一致性实现复杂,需要客户端协议的配合,才能实现“exactly once”,实现线性一致性。
    关于Raft的一些高级特性,比如客户端协议、uncommited log丢失、指令重复执行等,在加餐篇,规划了一讲,所以这里关于线性一致性没有展开聊。更多细节,我会在加餐篇,具体说说。

    2020-03-03
    1
  • 郭哲聪
    如果我要看具体的 raft 实现,您更推荐哪个开源代码库?

    作者回复: 如果熟悉Golang的话,推荐Hashicorp Raft,也可以直接研究Logcabin。

    2020-03-03
  • Dovelol
    老师好,想问一下consistent模式下,领导者在和大多数节点确认自己仍是领导者之后返回本地数据给客户端,如果发生分区,那么会不会有2个领导者都收到自己分区的大多数节点确认,那么返回数据给客户端呢?怎么避免这种情况的。

    作者回复: 不会同时存在2个大多数的,也就是不会同时有2个领导者。

    2020-03-03
收起评论
26
返回
顶部