分布式协议与算法——Paxos算法

news2024/11/24 3:13:37

目录

    • Paxos算法
      • Basic Paxos算法
        • 三种角色
        • 如何达成共识(协商过程)
        • 小结:
      • Multi-Paxos算法
        • 关于 Multi-Paxos 的思考
        • 领导者
        • 优化Basic Paxos
        • Chubby 的 Multi-Paxos 实现
        • 小结
      • 参考

Paxos算法

Paxos论文 Paxos Made Simple 、author:Leslie Lamport(兰伯特)

Paxos算法是一种共识算法,一些常用的共识算法都是基于它改进的,如Fast Paxos算法、Cheep Paxos算法、Raft算法等。Paxos算法包含2个部分:

  1. Basic Paxos算法,描述的是多节点之间如何就某个值(提案 value)达成共识。
  2. Multi-Paxos算法,描述的是执行多个Basic Paxos实例,就一系列值达成共识。

Basic Paxos算法

实现一个分布式集群,这个集群由多个组成。现有多个客户端(客户端1、客户端2)访问这个集群,试图创建同一个只读变量(如X),客户端1试图创建值为3的X,客户端2试图创建值为7的X。那如何达成共识,实现各节点上X值的一致呢?使用Paxos算法

Paxos算法中有一些独有而且比较重要的概念:提案、准备请求、接受请求、角色等。其中角色是对Basix Paxos中最核心三个功能的抽象。

三种角色

在Basic Paxos中,有提议者(Proposer)、接受者(Acceptor)、学习者(Learner)三种角色。

  • 提议者:提议一个值,用于投票表决。在绝大多数场景下,集群中收到客户端的请求的节点是提议者(而不是客户端作为提议者),这样做的好处是对业务代码没有入侵性(不需要在业务代码中实现算法逻辑)。
  • 接受者:对每个提议的值进行投票、并存储接受的值。一般来说,集群中所有节点都在扮演接受者的角色,参与共识协商,并接受和存储数据。
  • 学习者:被告知投票的结果,接受达成共识的值,存储保存,不参与投票的过程。一般来说,学习者是数据备份的节点,被动地接受数据,容灾备份。

一个节点可以身兼多种角色。例如一个3节点的集群,1个节点收到了客户端的请求,那么该节点将作为提议者发起二阶段提交,然后这个节点和另外两个节点一起作为接受者进行共识协商。

这三种角色,本质上代表的是三种功能:

  • 提议者代表的是接入和协调功能,收到客户端请求后,发起二阶段提交,进行共识协商。
  • 接受者代表投票协商和存储数据,对提议的值进行投票,并接受达成共识的值,存储保存。
  • 学习者代表存储数据,不参与共识协商,只接受达成共识的值,存储保存。

如何达成共识(协商过程)

在Basic Paxos中,使用提案代表一个提议。在提案中,除了提案编号,还包含了提议值。如[n,v]表示一个提案,其中n为提案编号,v为提议值。

假设客户端1的提案编号为1,客户端2的提案编号为5;节点A、B先收到来自客户端1的准备请求,节点C先收到来自客户端2的准备请求。

提议者 一般由收到客户端请求的节点担任,这里为了便于理解,将客户端作为了提议者。你可以这样理解:每个客户端对应一个节点,其所对应的节点即担任提议者又担任接受者。所以下述的客户端1、2可以看成节点A、C。

准备(Prepare)阶段

第一个阶段是准备阶段。首先客户端1、2作为提议者,分别向所有接受者发送包含提案编号的准备请求。
image-20230807000539518

在准备请求的时候不需要指定提议的值,只需要携带提案编号。

随后,节点A、B收到提案编号为1的准备请求,节点C收到提案编号为5的准备请求,进行以下处理。

  • 由于之前没有通过任何提案,所以节点 A、B 将返回一个 “尚无提案”的响应。也就是说节点 A 和 B 在告诉提议者,我之前没有通过任何提案呢,并承诺以后不再响应提案编号小于等于 1 的准备请求,不会通过编号小于 1 的提案。
  • 节点 C 也是如此,它将返回一个 “尚无提案”的响应,并承诺以后不再响应提案编号小于等于 5 的准备请求,不会通过编号小于 5 的提案。
    image-20230807000600904

随后,当节点A、B收到提案编号为5的准备请求,节点C收到提案编号为1的准备请求的时候,进行以下处理。

  • 当节点 A、B 收到提案编号为 5 的准备请求的时候,因为提案编号 5 大于它们之前响应的准备请求的提案编号 1,而且两个节点都没有通过任何提案,所以它将返回一个 “尚无提案”的响应,并承诺以后不再响应提案编号小于等于 5 的准备请求,不会通过编号小于 5 的提案。
  • 当节点 C 收到提案编号为 1 的准备请求的时候,由于提案编号 1 小于它之前响应的准备请求的提案编号 5,所以丢弃该准备请求,不做响应。
    image-20230807000621641

🌟🌟🌟

如果节点收到准备请求中的提案编号,大于之前响应的准备请求的提案编号,并且已经通过了之前的提案,那么接受者会在请求的响应中包含已经通过的最大编号的提案信息(也就是说接受者会将其通过的最大编号的提案信息发送给提议者),而不是“尚无提案”的响应。

接受(Accept)阶段

第二个阶段也就是接受阶段,首先客户端 1、2 在收到大多数节点的准备响应之后,会分别发送接受请求:

当客户端 1 收到**大多数的接受者(节点 A、B)**的准备响应后,根据响应中提案编号最大的提案的值,设置接受请求中的值。因为该值在来自节点 A、B 的准备响应中都为空(也就是“尚无提案”),所以就把自己的提议值 3 作为提案的值,发送接受请求[1, 3]。

当客户端 2 收到大多数的接受者的准备响应后(节点 A、B 和节点 C),根据响应中提案编号最大的提案的值,来设置接受请求中的值。因为该值在来自节点 A、B、C 的准备响应中都为空(也就是图 5 和图 6 中的“尚无提案”),所以就把自己的提议值 7 作为提案的值,发送接受请求[5, 7]。
image-20230807000634385

当节点 A、B、C 收到接受请求[1, 3]的时候,由于提案的提案编号 1 小于三个节点承诺能通过的提案的最小提案编号 5,所以提案[1, 3]将被拒绝。

当节点 A、B、C 收到接受请求[5, 7]的时候,由于提案的提案编号 5 不小于三个节点承诺能通过的提案的最小提案编号 5,所以就通过提案[5, 7],也就是接受了值 7,三个节点就 X 值为 7 达成了共识。
image-20230807000704484

🌟🌟🌟

如果节点的准备响应中包含了提案信息而不是“尚无提案”,那么提议者会将响应的提案编号最大的提案所对应的值,作为接受请求中的值,而不是将自己的提议值作为提案值。这样就保证了大多数节点就某个值达成共识后,这个值就不会改变了,哪怕有新的提案这个值也不会改变了。

如果集群中有学习者,当接受者通过一个提案时,就通知给所有学习者。当学习者发现大多数的接受者都通过了提案,那么它也通过该提案,接受该提案的值。

除了共识之外,Basic Paxos还实现了容错,这个容错能力,源自**“大多数”**的约定(大多数接受者准备响应)。可以理解为:当少于一半的节点出现故障的时候,共识协商仍能正常工作。

🤔🤔🤔

如果节点 A、B 已经通过了提案[5, 7],节点 C 未通过任何提案,那么当客户端 3 提案编号为 9 时,通过 Basic Paxos 执行“SET X = 6”,最终三个节点上 X 值是多少呢?

准备阶段:

当节点A、B收到提案编号为9的准备请求的时候,因为提案编号9大于之前响应的准备请求的提案编号5,并且这两个节点已经通过了之前的提案[5,7],接受者A、B会在准备请求的响应中,包含已经通过的最大编号的提案信息[5,7],并承诺以后不再响应提案编号小于9,不会通过编号小于9的提案;由于节点C之前没有通过任何提案,所以节点C将返回一个“尚无提案”的响应,并承诺以后不再响应议案编号小于等于9的准备请求,不会通过编号小于9的提案。

接受阶段:

当客户端3收到大多数的接受者的准备请求后(节点A、B和C),根据响应中提案编号最大的提案的值,来设置请求的值,即来自A、B节点的准备响应的提案[5,7]。因此就把A、B响应值7作为提案的值,发送接受请求[9,7]。当节点A、B、C收到接受请求[9,7]后,由于提案的提案编号不小于三个节点承诺的能通过的提案的最小提案编号9,所以就通过提案[9,7]。三个节点就达成了共识。最后的值为7。

大多是值就某个节点达成共识了,值就不变了。哪怕有新的提案,这个值也能保证不再变了。

小结:

  1. Basic Paxos 是通过二阶段提交的方式来达成共识的。二阶段提交是达成共识的常用方式。
  2. 除了共识,Basic Paxos 还实现了容错,在少于一半的节点出现故障时,集群也能工作。它不像分布式事务算法那样,必须要所有节点都同意后才提交操作,因为“所有节点都同意”这个原则,在出现节点故障的时候会导致整个集群不可用。
  3. 本质上而言,提案编号的大小代表着优先级,你可以这么理解,根据提案编号的大小,接受者保证三个承诺,具体来说:
    • 如果准备请求的提案编号,小于等于接受者已经响应的准备请求的提案编号,那么接受者将承诺不响应这个准备请求;
    • 如果接受请求中的提案的提案编号,小于接受者已经响应的准备请求的提案编号,那么接受者将承诺不通过这个提案;
    • 如果接受者之前有通过提案,那么接受者将承诺,会在准备请求的响应中,包含已经通过的最大编号的提案信息。

Multi-Paxos算法

Basic Paxos 只能就单个值(Value)达成共识,一旦遇到为一系列的值实现共识的时候,它就不管用了。可以通过多次执行 Basic Paxos 实例(比如每接收到一个值时,就执行一次 Basic Paxos 算法)实现一系列值的共识。

Multi-Paxos 是一种思想,不是算法。而 Multi-Paxos 算法是一个统称,它是指基于 Multi-Paxos 思想,通过多个 Basic Paxos 实例实现一系列值的共识的算法(比如 Chubby 的 Multi-Paxos 实现、Raft 算法等)。

关于 Multi-Paxos 的思考

Basic Paxos 是通过二阶段提交来达成共识的。在第一阶段,也就是准备阶段,接收到大多数准备响应的提议者,才能发起接受请求进入第二阶段(也就是接受阶段)
image-20230805155046671

如果我们直接通过多次执行 Basic Paxos 实例,来实现一系列值的共识,就会存在这样几个问题:

  • 如果多个提议者同时提交提案,可能出现因为提案编号冲突,在准备阶段没有提议者接收到大多数准备响应,协商失败,需要重新协商。
  • 2 轮 RPC 通讯(准备阶段和接受阶段)往返消息多、耗性能、延迟大。

可以通过引入领导者优化 Basic Paxos 执行来解决上面的两个问题。

领导者

领导者节点作为唯一提议者,这样就不存在多个提议者同时提交提案的情况,也就不存在提案冲突的情况了。
image-20230805155410820

在论文中,并没有说如何选举领导者,需要我们在实现 Multi-Paxos 算法的时候自己实现如在 Chubby 中,领导者节是通过执行 Basic Paxos 算法,进行投票选举产生的。

优化Basic Paxos

可以采用**“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”**这个优化机制,优化 Basic Paxos 执行。也就是说,领导者节点上,序列中的命令是最新的,不再需要通过准备请求来发现之前被大多数节点通过的提案,领导者可以独立指定提案中的值。这时,领导者在提交命令时,可以省掉准备阶段,直接进入到接受阶段:
image-20230805155543344

和重复执行 Basic Paxos 相比,Multi-Paxos 引入领导者节点之后,因为只有领导者节点一个提议者,只有它说了算,所以就不存在提案冲突。另外,当主节点处于稳定状态时,就省掉准备阶段,直接进入接受阶段,所以在很大程度上减少了往返的消息数,提升了性能,降低了延迟。

💡💡💡

感觉Multi-Paxos 的实现需要执行多轮的 Basic Paxos,但Multi-Paxos 对每一轮 Basic Paxos进行了上述优化。

Chubby 的 Multi-Paxos 实现

  • 通过引入主节点,实现了论文中提到的领导者(Leader)节点的特性。也就是说,主节点作为唯一提议者,这样就不存在多个提议者同时提交提案的情况,也就不存在提案冲突的情况了。主节点是通过执行 Basic Paxos 算法,进行投票选举产生的,并且在运行过程中,主节点会通过不断续租的方式来延长租期(Lease)。
  • Chubby 中实现了论文提到的,“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”这个优化机制。
  • 在 Chubby 中,实现了成员变更(Group membership),以此保证节点变更的时候集群的平稳运行。
  • 在 Chubby 中,为了实现了强一致性,读操作也只能在主节点上执行。 也就是说,只要数据写入成功,之后所有的客户端读到的数据都是一致的。(所有的读请求和写请求都由主节点来处理)

💡💡💡

读写请求都在主节点上了,主节点的压力就很大了呀!!!

小结

  1. 兰伯特提到的 Multi-Paxos 是一种思想,不是算法,而且还缺少算法过程的细节和编程所必须的细节,比如如何选举领导者等,这也就导致了每个人实现的 Multi-Paxos 都不一样。而 Multi-Paxos 算法是一个统称,它是指基于 Multi-Paxos 思想,通过多个 Basic Paxos 实例实现一系列数据的共识的算法(比如 Chubby 的 Multi-Paxos 实现、Raft 算法等)。
  2. Chubby 实现了主节点(也就是兰伯特提到的领导者),也实现了兰伯特提到的 “当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段” 这个优化机制,省掉 Basic Paxos 的准备阶段,提升了数据的提交效率,但是所有写请求都在主节点处理,限制了集群处理写请求的并发能力,约等于单机。
  3. 在 Chubby 的 Multi-Paxos 实现中,也约定了“大多数原则”,也就是说,只要大多数节点正常运行时,集群就能正常工作,所以 Chubby 能容错(n - 1)/2 个节点的故障。
  4. 本质上而言,“当领导者处于稳定状态时,省掉准备阶段,直接进入接受阶段”这个优化机制,是通过减少非必须的协商步骤来提升性能的。这种方法非常常用,也很有效。比如,Google 设计的 QUIC 协议,是通过减少 TCP、TLS 的协商步骤,优化 HTTPS 性能。

参考

  • 分布式协议与算法实战 学习笔记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/849996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中电金信发布源启·数字构建平台 全面跃升应用研发全生命周期数字生产力

6月28日,中电金信发布源启数字构建平台。源启数字构建平台是企业级研发全生命周期支持管理平台、工程平台、工具链平台。 面向金融等重点行业超大规模、超复杂度的数字化应用,源启数字构建平台通过灵活、强大的平台赋能,端到端支持应用研发全…

[Vulnhub] matrix-breakout-2-morpheus

目录 <1> 信息收集 <2> getshell <3> Privilege Escalation&#xff08;提权&#xff09; <1> 信息收集 nmap -sP 192.168.236.0/24 扫描一下靶机ip 靶机ip: 192.168.236.154 nmap -A -p 1-65535 192.168.236.154 扫描一下靶机开放哪些服务 开放…

SpringMVC与三层架构

目录 一、SpringMVC1.1 概述1.2 SpringMVC核心组件1.3 SpringMVC工作原理1.4 统一异常处理 二、三层架构三、MVC与三层架构3.1 三层架构与MVC的关系3.2 SSM与三层架构的对应关系 一、SpringMVC 1.1 概述 MVC 是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c…

单元测试用例分组 demo

文章目录 目标1、使用 Category 进行用例分组&#xff08;1&#xff09;设置用例组&#xff08;2&#xff09;编写测试类&#xff0c;case设置对应的用例组&#xff08;3&#xff09;编写执行类&#xff08;4&#xff09;查看运行结果&#xff08;5&#xff09;联系项目 2、参数…

一文搞懂IS-IS报文通用格式

报文格式 IS-IS报文是直接封装在数据链路层的帧结构中的。PDU可以分为两个部分&#xff0c;报文头和变长字段部分。其中头部又可分为通用头部和专用头部。对于所有PDU来说&#xff0c;通用报头都是相同的&#xff0c;但专用报头根据PDU类型不同而有所差别。 IS-IS的PDU有4种类…

Crond计划任务与用户权限提升

目录 一、Crond计划任务 二、用户权限提升 一、Crond计划任务 1&#xff09;一次性任务&#xff1a; at实现&#xff0c;atd服务 查看atd服务的状态&#xff1a;systemctl status atd 书写at任务之前要查看系统时间&#xff1a;date或者hwclock 案例&#xff1a; at ti…

git教程(第一次使用)

一、gitee和github区别 二、git使用 下载地址 windows&#xff1a;https://gitforwindows.org/ mac&#xff1a;http://sourceforge.net/projects/git-osx-installer/ 1.git初次运行前的配置 &#xff08;1&#xff09;配置用户信息 git config --global user.name "…

C#调用百度翻译API自动将中文转化为英文,按行转换

我们可以使用百度翻译API获取到翻译结果 翻译API地址&#xff1a; http://api.fanyi.baidu.com/api/trans/vip/translate 一、新建窗体应用程序TranslatorDemo&#xff0c;将默认的Form1重命名为FormTranslator。 窗体FormTranslator设计器如图&#xff1a; 窗体设计器源代码…

最强“双非”!所有专业爆冷!最低273分上岸!

一、学校及专业介绍 深圳大学&#xff08;Shenzhen University&#xff09;&#xff0c;简称“深大”&#xff0c;位于广东省深圳市。入选广东省高水平大学重点建设高校&#xff0c;粤港澳高校联盟成员单位。深圳大学于1983年经中华人民共和国国务院批准创办。北京大学援建中文…

笛卡尔积文本的python处理

一 背景 大致背景是这样的&#xff0c;笔者在做数据处理时&#xff0c;遇到一个棘手的事情&#xff0c;主要遇到如下字符串拼接变动的场景&#xff0c;场景主要为&#xff0c;需要考虑如下两张表的组合&#xff1a; 表1-原始文本样式 序号文本样式1A变量B2A变量C3A变量CD4E变…

Promise详细版

promise基础原理到难点分析 常见的Promise的方法解读 扩展async和await深入分析 逐步分析Promise底层逻辑代码 一、Promise基础 1.什么是promise 为了解决回调地狱&#xff1a; //2.设置点击事件btn.onclick function() {//3.创建ajax实例化对象let xhr new XMLHttpRe…

RocketMQ Learning(一)

目录 一、RocketMQ 0、RocketMQ的产品发展 1、RocketMQ安装 1.1、windows下的安装 注意事项 1.2、Linux下的安装 1.3、源码的安装 1.4、控制台 2、消息发送方式 2.1、发送同步消息 2.2、发送异步消息 2.3、单向发送 3、消息消费方式 3.1、负载均衡模式&#xff0…

生活小妙招之UE custom Decal

因为这几年大部分时间都在搞美术&#xff0c;所以博客相关的可能会鸽的比较多&#xff0c;阿巴阿巴 https://twitter.com/Tuatara_Games/status/1674034744084905986 之前正好看到一个贴花相关的小技巧&#xff0c;正好做一个记录&#xff0c;也在这个的基础上做一些小的拓展…

子集——力扣78

文章目录 题目描述法一 迭代法实现子集枚举题目描述 法一 迭代法实现子集枚举 class Solution {public:vector<int> t;vector<vector<

【C++基础】友元总结一些坑

友元类 友元类&#xff08;Friend Class&#xff09;是一种在C中用于实现类之间访问权限的特殊机制。通过友元类&#xff0c;一个类可以允许另一个类访问其私有成员&#xff0c;甚至可以使另一个类成为其友元&#xff0c;使其能够访问所有成员&#xff0c;包括私有成员。这种机…

[HDLBits] Exams/m2014 q4f

Implement the following circuit: module top_module (input in1,input in2,output out);assign out (!in2)&in1; endmodule

gma 2 教程(二)数据操作:5. 多维科学数据

多维科学数据定义 如下图所示&#xff0c;gma将多维栅格定义为N&#xff08;>1&#xff09;个普通栅格数据集&#xff08;DataSet&#xff09;1组&#xff08;记录多维数据信息的&#xff09;元数据组成的多数据集&#xff08;MultiDataSets&#xff09;。   注&#xff1…

Leetcode.2146 价格范围内最高排名的 K 样物品

题目链接 Leetcode.2146 价格范围内最高排名的 K 样物品 rating : 1837 题目描述 给你一个下标从 0 0 0 开始的二维整数数组 g r i d grid grid &#xff0c;它的大小为 m x n &#xff0c;表示一个商店中物品的分布图。数组中的整数含义为&#xff1a; 0 表示无法穿越的一…

伪原创小发猫怎么样【php源码】

大家好&#xff0c;小编为大家解答初学者自学python哪本书好的问题。很多人还不知道自学python需要什么基础&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广…

TCP三次握手、四次握手过程,以及原因分析

TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手&#xff1a;为了对每次发送的数据量进行跟踪与协商&#xff0c;确保数据段的发送和接收同步&#xff0c;根据所接收到的数据量而确认数据发送、接收完毕后何时撤消联系&#xff0c;并建立虚连接。 四次挥手&…