说人话的 PAXOS 算法简介及证明

本贴最后更新于 3205 天前,其中的信息可能已经时移世改

PAXOS是很多分布式系统的基石,获得图灵奖的Lamport的成名作就是关于paxos的算法,这算法也是出了名的难理解,即使是Lamport后来写的Paxos made Simple对数学学得不太好的我来说也看得云里雾里。市面上介绍Paxos的书基本都是翻译下Paxos made Simple论文的形式,而这篇论文写的是如何正向推导出Paxos算法的过程,对吾等凡人来说过于弯绕,实际上,程序员直接看Paxos的代码实现,再反推一下,就很容易理解了。下面直入正题。

 

PAXOS解决的问题是  在分布式环境中确定某一个 “不可变变量X” 的值。请多读几遍。

 

Paxos协议里有proposer,acceptor,learner三种角色,每中角色的扮演者都可以有多个,proposer提出关于X的值的proposal,acceptor对proposal进行表决 是否接受这个议案,learner负责统计acceptor的表决,若过半数acceptor接收了某个议案,那么关于X的值就被确定了。

Paxos算法能保证在过半数acceptor及至少一个proposer,一个learner存活的情况下,系统能正常运行。

不同learner获知最终X值的时间可能不一致,即最终一致性。

根据CAP理论,paxos算法杜绝了脑裂现象,并在C和A之间保留了较好的均衡性。

 

下面开始描述PAXOS算法的具体运行过程:

 

每一个Proposer提出的建议都会被编号,且这个编号是全局严格全序的。

(至于不同proposer怎么获得这个严格全序的议案编码不在本文讨论范围,如果确实想知道…那看懂这篇文章后,后续对PAXOS算法的拓展会提到)

 

一)proposer:

Proposer p1在向acceptor提出关于X的第n号议案前,都会先向每一个acceptor 发送 promise请求——拒绝掉所有小于编号n的promise请求及accept请求(accept请求就是真正的提议案的请求)。

 

二)acceptor:

1、如果某个acceptor之前已经promise过其他proposer 且其议案编号 大于n,那么将会拒绝p1的promise请求;

2、如果某个acceptor当前promise拒绝的议案编号小于n,那么就会接受p1的promise请求,并将当前acceptor accept的最新的议案编号及议案内容(即X的值)告诉proposer

 

三)proposer:

1、如果proposer p1获得了过半acceptor的承诺,则首先整合所有acceptor返回的信息,将acceptor中返回的最大编号的议案的内容作为自己的议案的内容(如果所有acceptor都没有返回议案内容,那么就自己随意设定一个),然后向所有acceptor发出自己关于X的accept请求;

2、如果proposer没有获得过半数acceptor的回应,可以忽略这一次操作,申请一个新的议案编号,马上重新进行一遍整个操作

 

四)acceptor:

1、如果acceptor收到了proposer的accept请求时,还没有收到其他proposer更高编号的promise请求时,将会批准proposer的建议,并将自己决定告知learner;

2、如果acceptor收到了proposer的accept请求时,已经收到了其他proposer更高编号的promise请求时,将会拒绝本次accept

 

五)learner:

Learner收到了某个acceptor的accept信息后,会统计一共收到了多少个acceptor发过来的该proposal的accept信息,若该proposal的acceptor数量达到了quorum,那么就认定该proposal对应的值为 X的值。

 

 

一个分布式算法很明显需要包含以下特征:

没有确定前是未知的,一旦确定后,它是全局唯一不可变的

 

我们现在开始论证paxos算法能否在过半acceptor存活时,达到上述要求。

Poposer p1提出X的建议前会向所有的acceptor发出编号为n的promise请求,让acceptor不再批准编号小于n的promise和建议,

p1获得了 “过半数acceptor的集合S1” 的promise后,如果某个编号为m(m<n)且n-m的值最小的proposal被选定了的话(选定意味着 获得过半数acceptor的集合S2的赞同),那么p1一定能够获取到这个proposal关于X的值(因为S1与S2都是过半数集合,至少有一个acceptor的交集,这个交集保存着这个proposal的建议值)

 

我们在程序流程里可以看到,下一次proposal的建议值必须跟当前acceptors里accept的编号最大的proposal一致,因此当 m = n – 1时,n号建议的X的值必然与m相同,依此类推后续proposal关于X的建议都必然与m相同,因此X的值必然全局唯一不可变,得证。

 

 

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 88250

    目前一致性是大多数企业的禁锢,因为技术往往架构都要追求人性的完美

  • 其他回帖
  • wizardforcel

    本科操作系统课讲了,但是显然听不懂。那部分加分的 lab 也没做。

推荐标签 标签

  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 588 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 4 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    132 引用 • 795 回帖 • 1 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 161 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 714 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    223 引用 • 474 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 160 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 41 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 30 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖
  • V2Ray
    1 引用 • 15 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 485 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    196 引用 • 540 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 588 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    23140 引用 • 93219 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    107 引用 • 295 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 131 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    209 引用 • 358 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    51 引用 • 25 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    16 引用 • 130 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 122 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖