图解 Paxos 算法

news2025/7/7 17:42:28

👏作者简介:大家好,我是爱写博客的嗯哼,爱好Java的小菜鸟
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
📝个人博客:敬请期待
📕系列专栏:分布式

文章目录

  • 前言
  • 一、Basic Paxos
    • 1. 问题
    • 2. Paxos 涉及的概念
    • 3. 准备阶段
    • 4. 接受阶段
    • 5. 接受者存在已通过提案的情况
  • 二、Multi Paxos
    • 1. 领导者
    • 2. 优化 Basic Paxos 执行过程
    • 3. Chubby 的 Multi Paxos 实现
  • 三、参考资料
  • 结语

转自 LEO博客的图解 Paxos 算法

前言

Paxos 算法由 Leslie Lamport 在 1989 年提出的一个分布式共识算法,Paxos 算法较难理解,本文尝试以图形化方案解释 Paxos 算法。

本文在很大篇幅参考了韩健极客时间的课程《分布式协议与算法》,有兴趣了解韩老师其他课程的同学可以购买来学习下。

Lamport 提出的 Paxos 算法包括两个部分:

  • Basic Paxos 算法:多节点如何就某个值达成共识
  • Multi Paxos 思想:执行多个 Basic Paxos ,就一系列的值达成共识

一、Basic Paxos

1. 问题

假设一个集群包含三个节点 A, B, C,提供只读< key-value 存储服务。只读 key-value 的意思是指,当一个 key 被创建时,它的值就确定下来了,且后面不能修改。

客户端 1 和客户端 2 同时试图创建一个 X 键。客户端 1 创建值为 “leehao.me” X ,客户端 2 创建值为 “www.leehao.me” X 。在这种情况下,集群如何达成共识,实现各节点上 X 的值一致呢?

在这里插入图片描述

2. Paxos 涉及的概念

在 Paxos 算法中,存在提议者(Proposer),接受者(Acceptor),学习者(Learner)三种角色,它们的关系如下:

  • 提议者(Proposer):提议一个值,用于投票表决,可以将上图客户端 1 和客户端 2 看作提议者。实际上,提议者更多是集群内的节点,这里为了演示的方便,将客户端 1 和 2 看作提议者,不影响 Paxos 算法的实质
  • 接受者(Acceptor):对每个提议的值进行投票,并存储接受的值,例如,上图集群内的节点 A、B、C
  • 学习者(Learner):被告知投票的结果,接受达成共识的值,不参与投票的过程,存储接受数据

需要指出的是,一个节点,既可以是提议者,也可以是接受者。

在这里插入图片描述

在 Paxos 算法中,使用提案表示一个提议,提案包括提案编号和提议的值。接下来,我们使用 [n, v] 表示一个提案,其中, n 是提案编号, v 是提案的值。

在 Basic Paxos 中,集群中各个节点为了达成共识,需要进行 2 个阶段的协商,即准备(Prepare)阶段和接受(Accept)阶段。

3. 准备阶段

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

客户端作为提议者,向所有的接受者发送包含提案编号的准备请求。注意在准备阶段,请求中不需要指定提议的值,只需要包含提案编号即可。

在这里插入图片描述接下来,节点 A,B 接收到客户端 1 的准备请求(提案编号为 1),节点 C 接收到客户端 2 的准备请求(提案编号为 5)。

在这里插入图片描述
集群中各个节点在接收到第一个准备请求的处理:

  • 节点 A, B:由于之前没有通过任何提案,所以节点 A,B 将返回“尚无提案”的准备响应,并承诺以后不再响应提案编号小于等于 1 的准备请求,不会通过编号小于 1 的提案
  • 节点 C:由于之前没有通过任何提案,所以节点 C 将返回“尚无提案”的准备响应,并承诺以后不再响应提案编号小于等于 5 的准备请求,不会通过编号小于 5 的提案

接下来,当节点 A,B 接收到提案编号为 5 的准备请求,节点 C 接收到提案编号为 1 的准备请求:

在这里插入图片描述

  • 节点 A, B:由于提案编号 5 大于之前响应的准备请求的提案编号 1,且节点 A, B 都没有通过任何提案,故均返回“尚无提案”的响应,并承诺以后不再响应提案编号小于等于 5 的准备请求,不会通过编号小于 5 的提案
  • 节点 C:由于节点 C 接收到提案编号 1 小于节点 C 之前响应的准备请求的提案编号 5 ,所以丢弃该准备请求,不作响应

4. 接受阶段

Basic Paxos 算法第二阶段为接受阶段。当客户端 1,2 在收到大多数节点的准备响应之后会开始发送接受请求。
在这里插入图片描述

  • 客户端 1:客户端 1 接收到大多数的接受者(节点 A, B)的准备响应后,根据响应中的提案编号最大的提案的值,设置接受请求的值。由于节点 A, B 均返回“尚无提案”,即提案值为空,故客户端 1 把自己的提议值 “leehao.me” 作为提案的值,发送接受请求 [1, “leehao.me”]
  • 客户端 2:客户端 2 接收到大多数接受者的准备响应后,根据响应中的提案编号最大的提案的值,设置接受请求的值。由于节点 A, B, C 均返回“尚无提案”,即提案值为空,故客户端 2 把自己的提议值 “www.leehao.me” 作为提案的值,发送接受请求 [5, “www.leehao.me”]

当节点 A, B, C 接收到客户端 1, 2 的接受请求时,对接受请求进行处理:

在这里插入图片描述

  • 节点 A, B, C 接收到接受请求 [1, “leehao.me”] ,由于提案编号 1 小于三个节点承诺可以通过的最小提案编号 5,所以提案 [1, “leehao.me”] 被拒绝
  • 节点 A, B, C 接收到接受请求 [5, “www.leehao.me”],由于提案编号 5 不小于三个节点承诺可以通过的最小提案编号 5 ,所以通过提案 [5, “www.leehao.me”],即三个节点达成共识,接受 X 的值为 “www.leehao.me”

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

5. 接受者存在已通过提案的情况

上面例子中,准备阶段和接受阶段均不存在接受者已经通过提案的情况。这里继续使用上面的例子,不过假设节点 A, B 已通过提案 [5, “www.leehao.me”],节点 C 未通过任何提案。
增加一个新的提议者客户端 3,客户端 3 的提案为 [9,“leehao”]

接下来,客户端 3 执行准备阶段和接受阶段。

客户端 3 向节点 A, B, C 发送提案编号为 9 的准备请求:

在这里插入图片描述
节点 A, B 接收到客户端 3 的准备请求,由于节点 A, B 已通过提案 [5, “www.leehao.me”],故在准备响应中,包含此提案信息。

节点 C 接收到客户端 3 的准备请求,由于节点 C 未通过任何提案,故节点 C 将返回“尚无提案”的准备响应。

在这里插入图片描述

客户端 3 接收到节点 A, B, C 的准备响应后,向节点 A, B, C 发送接受请求。这里需要特点指出,客户端 3 会根据响应中的提案编号最大的提案的值,设置接受请求的值。由于在准备响应中,已包含提案 [5, “www.leehao.me”],故客户端 3 将接受请求的提案编号设置为 9,提案值设置为 “www.leehao.me” 即接受请求的提案为 [9, “www.leehao.me”]

在这里插入图片描述

节点 A, B, C 接收到客户端 3 的接受请求,由于提案编号 9 不小于三个节点承诺可以通过的最小提案编号,故均通过提案 [9, www.leehao.me]

在这里插入图片描述

概括来说,Basic Paxos 具有以下特点:

  • Basic Paxos 通过二阶段方式来达成共识,即准备阶段和接受阶段
  • Basic Paxos 除了达成共识功能,还实现了容错,在少于一半节点出现故障时,集群也能工作
  • 提案编号大小代表优先级。对于提案编号,接受者提供三个承诺:
    • 如果准备请求的提案编号,小于等于接受者已经响应的准备请求的提案编号,那么接受者承诺不响应这个准备请求
    • 如果接受请求中的提案编号,小于接受者已经响应的准备请求的提案编号,那么接受者承诺不通过这个提案
    • 如果按受者已通过提案,那些接受者承诺会在准备请求的响应中,包含已经通过的最大编号的提案信息

二、Multi Paxos

Basic Paxos 算法只能对单个值达成共识,对于多个值的情形,Basic Paxos 算法就不管用了。因此,Basic Paxos 算法几乎只是用来理论研究,并不直接应用在实际工作中。

Lamport 提出的 Multi Paxos 是一种思想,并不是算法。

Multi Paxos 算法则是一个统称,是指基于 Multi Paxos 思想,通过多个 Basic Paxos 实例实现一系列值的共识的算法(例如 Raft 算法等)。

如果直接通过多次执行 Basic Paxos 实例方式,来实现一系列值的共识,存在以下问题:

  • 如果集群中多个提议者同时在准备阶段提交提案,可能会出现没有提议者接收到大多数准备响应,导致需要重新提交准备请求。例如,在一个 5 个节点的集群中,有 3 个节点同时作为提议者同时提交提案,那就会出现没有一个提议者获取大多数的准备响应,而需要重新提交
  • 为了达成一个值的共识,需要进行 2 轮 RPC 通讯,分别是准备阶段和接受阶段,性能低下

为了解决以上问题,Multi Paxos 引入了领导者(Leader)和优化了 Basic Paxos 的执行过程。

1. 领导者

上面的问题一存在多个提议者同时提交准备请求的情况,如果引入了领导者,由领导者作为唯一的提议者,就可以解决问题一中的冲突的问题。

在这里插入图片描述

Lamport 没有说明如何选举领导者,需要在实现 Multi Paxos 算法的时候自行实现。这里我们略去如何选举领导者的算法,假设已经选举出领导者。

2. 优化 Basic Paxos 执行过程

准备阶段的意义,是发现接受者节点上已通过的提案的值。引入领导者后,只有领导者才可发送提议,因此,领导者的提案就已经是最新的了,不再需要通过准备阶段来发现之前被大多数节点通过的提案,领导者可以独立指定提议的值。

这样一来,准备阶段存在就没有意义了,领导者可以直接跳过准备阶段,直接进行接受阶段,减少了 RPC 通讯次数。

3. Chubby 的 Multi Paxos 实现

Google 分布式锁 Chubby 实现了 Multi Paxos 算法。Chubby 的 Multi Paxos 算法主要包括:

  • Chubby 引入主节点作为领导者,即主节点作为唯一提议者,不存在多个提议者同时提交提案的情况,也不存在提案冲突的情况。Chubby 通过执行 Basic Paxos 算法进行投票选举产生主节点
  • 在 Chubby 中,由于引入了主节点,因此,也去除了 Basic Paxos 的准备阶段
  • 在 Chubby 中,为实现强一致性,所有的读请求和写请求都由主节点来处理
  1. Chubby 所有的写请求由主节点来处理

当主节点接收到客户端的写请求,作为提议者,将数据发送给所有节点,在大多数服务器接受了这个写请求后,给客户端响应写成功。

在这里插入图片描述

  1. Chubby 所有的读请求由主节点来处理

当主节点接收到读请求,主节点只需要查询本地数据,然后返回给客户端。

在这里插入图片描述

另外,需要指出的是,Basic Paxos 是经过证明的算法。Multi Paxos 是一种思想但缺乏实现算法所需的编程细节,因此,Multi Paxos 的算法实现,是建立在一个未经证明的基础之上。实现 Multi Paxos 算法,最大的挑战是如何证明它是正确的。

三、参考资料

  1. https://time.geekbang.org/column/article/201700
  2. https://blog.the-pans.com/paxos-explained/
  3. https://zhuanlan.zhihu.com/p/31780743
  4. https://www.cnblogs.com/linbingdong/p/6253479.html
  5. https://www.ux.uis.no/~meling/papers/2013-paxostutorial-opodis.pdf
  6. https://medium.com/@nevverlander/paxos-made-simple-for-real-aa221be7d91b
  7. http://www.read.seas.harvard.edu/~kohler/class/08w-dsi/chandra07paxos.pdf
  8. https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf
  9. https://lamport.azurewebsites.net/pubs/paxos-simple.pdf

结语

每个人都有自己独特的才华和潜能,在这个广袤的世界上,你的存在是有意义的。无论你是谁,你的背景如何,你所处的环境怎样,只要你敢于跨出舒适区,付出努力,追求卓越,你就能够开创属于自己的辉煌。

我们下期见。

每一次努力都是一次进步,即使进展缓慢,也要坚持不懈。

往期文章推荐

  • Spring相关面试题
  • Mysql相关面试题
  • 趣聊WebSocket
  • 关于redis的读写一致问题
  • springsecurity加入第三方授权认证
  • Java连接mysql常遇时间问题

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

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

相关文章

Dubbo基础学习(笔记一)

目录 第一章、概念介绍1.1&#xff09;什么是RPC框架1.2&#xff09;什么是分布式系统1.3&#xff09;Dubbo概述1.3&#xff09;Dubbo基本架构 第二章、服务提供者2.1&#xff09;目录结构和依赖2.2&#xff09;model层2.3&#xff09;service层2.4&#xff09;resources配置文…

vector【2】模拟实现(超详解哦)

vector 引言&#xff08;实现概述&#xff09;接口实现详解默认成员函数构造函数析构函数赋值重载 迭代器容量size与capacityreserveresizeempty 元素访问数据修改inserterasepush_back与pop_backswap 模拟实现源码概览总结 引言&#xff08;实现概述&#xff09; 在前面&…

VMware虚拟安装Ubuntu,然后切换Ubuntu内核版本

无论你选择哪种方法&#xff0c;一旦进入 GRUB 引导菜单&#xff0c;你应该能够选择需要的内核版本并启动系统。 打开终端&#xff1a;你可以通过按下 Ctrl Alt T 快捷键来打开终端。 使用 sudo&#xff1a;切换内核需要管理员权限&#xff0c;因此你需要使用 sudo 命令。首…

QtCreator 配置 MSVC 编译工具

在官网下载的 Qt 都是配置 mingw&#xff0c;没法使用 webenginewidgets&#xff0c;只有使用 msvc 编译的 Qt&#xff0c;才带有 web 控件。原理都是下载 Visual Studio 安装&#xff0c;使用其中的 msvc 工具&#xff0c;如果只下载 msvc 而不必下载使用 VS 其它工具&#xf…

【日常积累】使用frp进行内网穿透

frp 是什么&#xff1f; frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 为什么使用 frp&#xff1f; 通过在具…

我记不住的grep和find命令

前言&#xff1a; Linux操作中总是会用到查找操作&#xff0c;无论是查找文件、目录&#xff0c;还是查找文件中的内容等。grep命令用于在某个文件文本中查找指定的字符串&#xff0c;类似于word中的ctrlF&#xff0c;而find命令用于在某个指定的目录中查找某个文件或某个目录。…

深入学习SpringCloud Alibaba微服务架构,揭秘Nacos、Sentinel、Seata等核心技术,助力构建高效系统!

课程链接&#xff1a; 链接: https://pan.baidu.com/s/1hRN0R8VFcwjyCTWCEsz-8Q?pwdj6ej 提取码: j6ej 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 课程介绍&#xff1a; &#x1f4da;【第01阶段】课程简介&#xff1a;全…

函数性能探测:更简单高效的 Serverless 规格选型方案

作者&#xff1a;拂衣、丛霄 2019 年 Berkeley 预测 Serverless 将取代 Serverful 计算成为云计算新范式。Serverless 为应用开发提供了一种全新系统架构。借助 2023 年由 OpenAI 所带来的 AIGC 风潮&#xff0c;以阿里云函数计算 FC、AWS Lambda 为代表的 Serverless 以其更高…

软件压力测试对软件产品起到什么作用?

一、软件压力测试是什么? 软件压力测试是一种通过模拟正常使用环境中可能出现的大量用户和大数据量的情况&#xff0c;来评估软件系统在压力下的稳定性和性能表现的测试方法。在软件开发过程中&#xff0c;经常会遇到一些性能瓶颈和稳定性问题&#xff0c;而软件压力测试的作…

AlexNet网络结构详解

AlexNet论文地址&#xff1a; https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf 1、简介 AlexNet是2012年ISLVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络&#xff0c;图像分类的正确率从70%提升到80%&…

《财讯》期刊简介及投稿要求

《财讯》杂志是经国家新闻出版总署批准&#xff0c;面向国内外公开发行的“全国综合性教育理论学术期刊 面向全国各级各类大、中专经济院校工作者&#xff1b;银行、经贸委、财政及行政管理人员&#xff0c;是作者科研、晋级等方面权威依据的优秀期刊。 主管单位&#xff1a;…

什么是冒烟测试?什么时候做冒烟测试?冒烟测试的用例哪儿来的?

什么是冒烟测试&#xff1f; 冒烟测试&#xff08;Smoke Testing&#xff09; 是软件测试中的一项基础测试&#xff0c;也称为构建验证测试&#xff08;Build Verification Testing&#xff09;&#xff0c;通常用于确认新版本的软件是否可以进行基本的功能测试或者是否能够正…

常见期权策略类型有哪些?

这几天在做一个期权策略类型的整理分类&#xff0c;怎么解释期权策略&#xff0c;期权策略是现代金融市场中运用非常广泛、变化非常丰富、结构非常精妙的金融衍生产品&#xff1b;同时也是一种更为复杂也更为灵活的投资工具&#xff0c;下文介绍常见期权策略类型有哪些&#xf…

图片转换成pdf格式?这几种转换格式方法了解一下

图片转换成pdf格式&#xff1f;将图片转换成PDF格式的好处有很多。首先&#xff0c;PDF格式具有通用性&#xff0c;可以在几乎任何设备上查看。其次&#xff0c;PDF格式可以更好地保护文件&#xff0c;防止被篡改或者复制。此外&#xff0c;PDF格式还可以更好地压缩文件大小&am…

BitLocker已加密 - 解决方案

BitLocker介绍 Bitlocker 是 Windows 磁盘加密功能&#xff0c;旨在通过为整个卷提供加密来保护数据。 BitLocker 解决了因设备丢失、被盗或不适当解除授权而遭受数据盗窃或泄露的威胁。 BitLocker虽然增强了数据安全性&#xff0c;但也增加了用户的使用困难度&#xff0c;因为…

Ansys Zemax | 手机镜头设计 - 第 1 部分:光学设计

本文是 3 篇系列文章的一部分&#xff0c;该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;从概念、设计到制造和结构变形的分析。本文是三部分系列的第一部分&#xff0c;将专注于OpticStudio中镜头模组的设计、分析和可制造性评估。&#xff08;联系我们获取文章附件…

【猿灰灰赠书活动 - 02期】- 【Java从入门到精通2023年7月最新(第7版)】

说明&#xff1a;博文为大家争取福利&#xff0c;与清华大学出版社合作进行送书活动 图书&#xff1a;《Java从入门到精通》 一、好书推荐 图书介绍 Java入门经典&#xff0c;95万Java程序员的入行选择。配备升级版Java开发资源库&#xff0c;在线大咖课在线答疑&#xff0c;学…

shell脚本之函数及数组

shell脚本之函数及数组 一函数1.1函数的作用1.2函数的基本格式1.3函数的注意事项1.4函数调用的方法1.5函数的返回值1.6函数的传参1.7在外部调用函数1.8函数变量的作用范围1.9函数的递归 二.数组2.1shell数组的定义2.2定义属组的方式2.3数组的数据类型2.4获取数组的数据列表2.5获…

回归预测 | MATLAB实现GRU门控循环单元多输入多输出

回归预测 | MATLAB实现GRU门控循环单元多输入多输出 目录 回归预测 | MATLAB实现GRU门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现GRU门控循环单元多输入多输出&#xff0c;数据为多输入多输出预测数据&#xff0c;输入10个…

2023电商销售额增幅全球第一!这个国家潜力正在爆发!

随着欧、美等跨境电商市场日趋饱和&#xff0c;拉美地区正逐渐成为全球电商投资的热点。这让该地区增长最强劲的电商市场——阿根廷——成为众多跨境卖家寻求增长与突破的新选择。 那么&#xff0c;阿根廷为什么是跨境卖家扩展电商业务的新机会&#xff1f;阿根廷电子商务市场…