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

06 | Paxos算法(二):Multi-Paxos不是一个算法,而是统称

课堂思考
内容小结
Chubby的Multi-Paxos实现
兰伯特关于Multi-Paxos的思考
Multi-Paxos
Paxos算法

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

你好,我是韩健。
经过上节课的学习,你应该知道,Basic Paxos 只能就单个值(Value)达成共识,一旦遇到为一系列的值实现共识的时候,它就不管用了。虽然兰伯特提到可以通过多次执行 Basic Paxos 实例(比如每接收到一个值时,就执行一次 Basic Paxos 算法)实现一系列值的共识。但是,很多同学读完论文后,应该还是两眼摸黑,虽然每个英文单词都能读懂,但还是不理解兰伯特提到的 Multi-Paxos,为什么 Multi-Paxos 这么难理解呢?
在我看来,兰伯特并没有把 Multi-Paxos 讲清楚,只是介绍了大概的思想,缺少算法过程的细节和编程所必须的细节(比如缺少选举领导者的细节)。这也就导致每个人实现的 Multi-Paxos 都不一样。不过从本质上看,大家都是在兰伯特提到的 Multi-Paxos 思想上补充细节,设计自己的 Multi-Paxos 算法,然后实现它(比如 Chubby 的 Multi-Paxos 实现、Raft 算法等)。
所以在这里,我补充一下:兰伯特提到的 Multi-Paxos 是一种思想,不是算法。而 Multi-Paxos 算法是一个统称,它是指基于 Multi-Paxos 思想,通过多个 Basic Paxos 实例实现一系列值的共识的算法(比如 Chubby 的 Multi-Paxos 实现、Raft 算法等)。 这一点尤其需要你注意。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Paxos算法是分布式系统中实现共识的重要算法,而Multi-Paxos思想则通过多个Basic Paxos实例实现一系列值的共识。Chubby系统的Multi-Paxos实现代表了这一思想在生产环境中的真正落地,通过引入领导者节点和优化Basic Paxos执行等方式解决了提案冲突和性能问题。Chubby的设计具有参考价值,能帮助理解Multi-Paxos思想和其他Multi-Paxos算法。文章深入浅出地介绍了Multi-Paxos思想及其在Chubby系统中的实现,对于理解分布式系统中的共识算法具有重要参考价值。Multi-Paxos的最大挑战在于如何证明其正确性,因此在实际使用时,建议优先考虑Raft算法,因为其正确性经过证明。Chubby系统的局限在于只能在主节点上执行读操作,这一设计限制了集群处理读请求的并发能力。文章内容深入浅出,对于理解分布式系统中的共识算法具有重要参考价值。

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

全部留言(69)

  • 最新
  • 精选
  • HuaMax
    置顶
    “当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”这个优化机制。 请问,什么样是稳定状态?为什么稳定状态可以省掉准备阶段?

    作者回复: 如何理解领导者处于稳定状态? 领导者节点上,序列中的命令是最新的,不再需要通过准备请求来发现之前被大多数节点通过的提案,领导者可以独立指定提案中的值。 我来具体说说,准备阶段的意义,是发现接受者节点上,已经通过的提案的值。如果在所有接受者节点上,都没有已经通过的提案了,这时,领导者就可以自己指定提案的值了,那么,准备阶段就没有意义了,也就是可以省掉了。

    2020-02-24
    7
    40
  • 每天晒白牙
    置顶
    只能在主节点进行读操作,效果相当于单机,对吞吐量和性能有所影响 写也是在主节点进行,性能也有问题

    作者回复: 加一颗星:)

    2020-02-24
    10
    23
  • Geek_MYMSwen
    Chubby的局限可能在于高读的系统中,如果读请求过大,会导致系统的不可用。另外在系统中如何能够将主节点更替的信息向用户传播也是需要考虑的问题。 还有有一种情况我没有想清楚,请各位指点: 一个分布式系统中有5个节点,3个在一个机房A(机器编号A1,A2,A3),2个在另一个机房B(机器编号B1,B2)。 1)如果节点A1的机架网络发生故障,导致A1与其他节点通信受阻,那么A1节点将会执行什么操作呢?通讯恢复以后A1节点如何进行数据同步呢?同样在A1无法通讯后出现集群有偶数节点,选举时会出现怎样的情况? 2)如果主节点为B1,A机房与B机房间通讯产生故障,A机房和B机房的节点将分别执行怎样的操作呢?

    作者回复: 加一颗星:) 1. A1节点,可以联系其他节点,联系领导者,获取最新的集群节点状态信息和领导者信息,拒绝写操作的执行。 2. 如果,同步数据,需要在代码实现设计实现,比如,可以请求领导者节点,把新通过的提案,都同步过来,更具体的实现,可以参考Raft的日志复制。 3. 偶数节点不是问题,只要有大多数节点在稳定运行,就可以了。 4. 节点B1,在leader leasing过后,要主动退位,并拒绝执行写操作,A机房的3个节点,将选举出新的领导者。

    2020-02-24
    6
    19
  • 小石头
    如果多个提议者同时提交提案,可能出现因为提案冲突,在准备阶段没有提议者接收到大多数准备响应,协商失败,需要重新协商。你想象一下,一个 5 节点的集群,如果 3 个节点作为提议者同时提案,就可能发生因为没有提议者接收大多数响应(比如 1 个提议者接收到 1 个准备响应,另外 2 个提议者分别接收到 2 个准备响应)而准备失败,需要重新协商。 这第一个问题理解不了,按上篇讲的,最大提议号的提议者不是会收到所有的准备响应么?

    作者回复: 加一颗星:),这里指的是提案编号相同、选票瓜分的情况。

    2020-03-22
    5
    9
  • zjm_tmac
    leader怎么确定acceptor的总数呢?集群是允许扩容的吗

    作者回复: 怎么确定acceptor总数,涉及代码实现和成员变更;扩容涉及到成员变更。 首先,使用什么数据结构来保存acceptor总数,这属于编程实现,不属于算法了,绝大多数算法都不会约定的这么细的。 其次,Multi-Paxos,只是一种思想,缺少算法细节和编程所必须的细节,比如,成员变更,在Multi-Paxos中,提了下,可以把服务器配置作为指令,通过状态机提交,等等。但是,如果学习了09讲后,你就会发现,真正实现起来,比这个要复杂很多,比如Raft设计了2种成员变更方法,一种难以实现,一种容易实现,但在16年时,爆出了一个算法bug,虽然很快就修复了,但也反映了成员变更比较复杂,不是三言两语能讲清楚的。 另外,其实,学习Multi-Paxos的最好的方式,是先理解Raft,再回过头来,学习Multi-Paxos。如果在学习Multi-Paxos中遇到不理解的,可以在学习完Raft后,再回头来研究学习。

    2020-02-25
    9
  • snakorse
    找到一篇微信后台团队对PhxPasox的讲解,感觉是对multi-paxos非常好的补充,推荐一下https://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483695&idx=1&sn=91ea422913fc62579e020e941d1d059e&chksm=ebfc62fbdc8bebed551c2a041bb37bcaab836c4b2ca8e575d418f1e24459459c1c16faf70d06

    作者回复: Paxos是共识算法,不是一致性协议,consensus不等于consistency。

    2020-03-21
    5
    6
  • eason2017
    集群,分布式的意义是提供更大的吞吐量,和并发,这样的操作无疑是掩耳盗铃

    作者回复: 有些场景需要的是强一致性、故障容错等,场景决定系统的形态。

    2020-04-01
    2
    5
  • 阿卡牛
    主节点只一个?那存在单点故障的问题

    作者回复: 有节点故障容错能力的,当主节点故障时,会选举出新的主节点,保证集群服务的可用。

    2020-03-24
    5
  • 只能在主节点读取,存在单机性能和容错问题。

    作者回复: 加一颗星:),性能瓶颈是痛点,共识算法具有容错能力,领导者模型的共识算法,在故障、选举期间,无法执行写操作。

    2020-02-28
    5
  • 约书亚
    本来想问个问题,看到思考题提到了。 从raft和zab的实现来看,一致性读操作的处理和写操作是类似的,不从本地读,而是也要发请求到所有节点,得到大多数节点的响应才行。我了解到的有的实现是领导者发送一个空操作给所有节点。 这样做的原因不光是考虑吞吐量的问题,而是读本地是满足不了强一致性的,因为自以为的leader未必是真的leader,此时可能另外的节点已经自己组成一个小团队,选出一个新leader,这个变量也可能都更新好几次了。只有和大多数节点交互一次才能知道自己当前还是不是leader。 有个问题,兰伯特提到的 “当领导者处于稳定状态时...”这个稳定状态是什么意思呢?在领导者是谁这个问题上,达成大多数节点的一致?

    作者回复: 领导者节点上,序列中的命令是最新的,不再需要通过准备请求来发现之前被大多数节点通过的提案,领导者可以独立指定提案中的值。 我来具体说说,准备阶段的意义,是发现接受者节点上,已经通过的提案的值。如果在所有接受者节点上,都没有已经通过的提案了,这时,领导者就可以自己指定提案的值了,那么,准备阶段就没有意义了,也就是可以省掉了。

    2020-02-24
    5
收起评论
显示
设置
留言
69
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部