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

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

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的值必然全局唯一不可变,得证。

 

 

相关帖子

欢迎来到这里!

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

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

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

  • 其他回帖
  • 88250

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

推荐标签 标签

  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    575 引用 • 3533 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 21 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 541 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 525 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1348 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1275 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 411 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 349 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 142 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 7 关注
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    412 引用 • 1246 回帖 • 587 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 549 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    36 引用 • 35 回帖 • 5 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 253 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    138 引用 • 203 回帖
  • Shell

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

    123 引用 • 74 回帖 • 1 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 220 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 689 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 78 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 407 回帖 • 491 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 8 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    692 引用 • 535 回帖 • 1 关注