原创:微信公众号 码农参上,欢迎分享,转载请保留出处。

哈喽大家好啊,我是Hydra。

分布式系统共识算法Paxos相信大家都不陌生,它被称为最难理解的算法不是没有道理的,首先,它的发表之路就充满了坎坷。

1990年,莱斯利·兰伯特大佬写了一篇论文,举了一个城邦选举的例子来介绍Paxos算法,然而大佬的幽默感并未得到审稿人的认可,论文未发表成功…

1998年,兰伯特重新发表论文《The Part-Time Parliament》描述算法,然而众多学者并不买账,直呼看不懂…

2001年,兰伯特对算法的描述进行简化,再次发表 《Paxos Made Simple》,这次Paxos成为了世界公认最优秀的分布式系统共识算法…

其实说白了,Paxos算法要解决的问题是一个分布式系统如何就某个值决议达成一致。比如说,一组进程现在正在提议某个数据的值,需要通过消息传递的方式使这个值达成一致,也就是最终仅能有一个值被选定。

但毕竟是大佬写出来的东西,且不说逻辑推理部分,就算单拎出来论文中对两个核心阶段的描述来说,我等凡人理解起来也还是有些困难。

不信?那就让英语六级的我先来简单地翻译一下。

阶段1

a、提案者选择一个提案号n,发送一个提案号为nprepare请求给大多数接受者。

b、如果一个接受者收到的编号为nprepare请求,并且编号比它已经响应过的任何prepare请求的编号都大,那它就回应这个请求,承诺不再接受任何编号小于n的提案,并回复它已经接受的编号最大的提案(如果存在的话)。

阶段2

a、如果提案者收到大多数接受者关于它编号为nprepare请求的回应,它就给这些接受者发送一个编号为n,值为vaccept请求,v是收到的回应中编号最大的提案值。如果之前不存在任何一个提案的回复时,那么v可以是任意值,也就是可以由自己指定。

b、接受者收到编号为naccept请求时,只要它还没有响应编号比n更高的prepare请求,那么它将接受该提案。

是不是还看不懂?那就对了,下面我们通过一个简单的例子来描述这个过程。

记得小时候,有不少广播电台可以通过电话点歌,打电话给话务员告诉她你要点的歌,接下来就会播放。当然了,这个过程不是免费的,肯定有不少小伙伴在月末父母交话费的时候,惨遭过社会的毒打。

既然是电台热线,那么肯定不只有一个话务员了,我们假定这个电台同时存在3个话务员,并且她们之间是相互没有交流的,那么当短时间内打进来很多电话时,要怎么决定放哪首歌呢?

首先,话务员之间遵从少数服从多数,那么为了获得更多话务员的支持,你可以不断给更多的话务员打电话。

其次,前面我们说过,这个过程是收费的,假定存在一条潜规则,电台会更偏向于接受出价高的人的点歌请求,那么也就好办了,你可以使了劲地加钱。

在这种环境下,听众想要点歌成功的话,就得靠上面两个办法。

这时,第一个听众打进来电话了,在第一个阶段听众只能进行报价,还不能提出自己想要听什么歌,这个报价就可以理解为算法中的编号n

因为听众1是第一个打进热线电话的,在他之前还不存在任何报价,所以这里话务员们会无条件地先接受第一个听众的报价并记录下来,然后返回给听众1一个回复信息。

在回复的信息中,话务员不但需要告诉听众他的报价目前最高,已经被认可了,还要说明之前没有接受过其他任何听众的点歌请求。

这时候听众1一看,自己已经获得了超过半数以上的话务员的认可了,那么进入阶段2,告诉话务员自己想要听什么歌曲。当然,在这个过程中,还得顺带着告诉话务员自己在上一阶段中的报价是多少。

于是,听众1再次打进热线,先单独向话务员2发起了选歌提议。

在收到听众1的点歌请求后,话务员2看到听众1在请求中携带的之前报价是1块,满足大于等于自己记录的最大报价这一条件,于是果断接受听众1的点歌请求。

在接受点歌请求后,话务员2要记录的东西又要增加了,她不但要记住已接受的请求的报价金额,还要记住已接受请求的点播歌曲。然后给听众1一个回复,表示我已经接受了你的点歌请求。

当然了,在听众1努力点歌的时候,其他听众也不会闲着对不对?

听众2虽然打进电话晚了点,但是直接发动钞能力,把自己的报价提升到了两块,来和话务员们进行通话。

由于两块钱的报价高于本地记录的最高报价,所以话务员1和话务员2都会认可这个报价,所以她们会先把本地的最高报价值更新为两块。

但是接下来,由于本地记录的信息有所不同,所以她们将会给出不同的答复。

如果这时候,再来一个听众3打进电话,并且尝试以两块或以下的价格进行报价给前两个话务员的话,那么他的报价不会得到话务员的认可。

这是因为我们前面说过了,话务员们都遵循拜金主义这一潜规则,所以她们不会接受比已记录的最高报价还要低的报价。

在拒绝了听众3之后,我们再回到前面的两位听众这边。

接下来,我们根据听众1和2谁先打进电话,把时间线划分为两个平行宇宙。

平行宇宙1

在平行宇宙1这条时间线里,我们假设听众1先打进电话。

这时,仍然只有话务员2接受了听众1的点歌请求,于是听众1继续向其他话务员拨打电话,告诉她们自己要听的歌。

在话务员3这里,她记录的最高报价还是听众1之前的1块,所以没有意外,话务员3会接受听众1的点歌请求,并更新本地的记录信息。

但是话务员1这就不一样了,她所认可的报价已经涨到了2,所以旧的1块钱报价已经不能在她这里点歌了,因此话务员1会拒绝听众1的点歌请求。

尽管请求没有得到话务员1的接受,但是前面我们说了,话务员之间要遵循少数服从多数的原则,听众1的点歌请求已经被半数以上话务员接受,那么听众1确认自己点的这首《东风破》已被选定。

平行宇宙2

让我们回到平行宇宙的分叉点,先回顾一下前情,这时听众2已经向话务员1和话务员2发出过报价,并从话务员2那里得知她已经以1块钱的报价接受了《东风破》这首歌的提案。

那么在这条时间线中,我们让听众2先打给1、2号话务员。

听众2这时心里会想,我们杰迷们都是有素质的人,尽管我之前想听的是《简单爱》,但听一下《东风破》貌似也挺不错,那么我干脆支持听众1的选择吧。

于是,报价已被认可的他再次拿起电话打给两位话务员,发起点歌请求。

话务员1和话务员2再次比较听众2这次携带的之前报价,均大于等于本地记录的最高报价,所以接受他的点歌请求。在更新本地记录的信息后,回复信息给听众2。

于是,听众2的点歌请求也获得了半数以上话务员的承认,那么听众2确认自己点的歌被选定。

看到这里,是不是似乎感觉世界线产生了收束,难道之后的每一种结果都是《东风破》将被选定?

其实,Paxos算法中最精彩的部分在于它更像是一场博弈,棋局中的每一步,都可能影响最终的结果。

平行宇宙β

让我们把分叉点上的时间,再往前多回溯一点,回到下面这个时间点的状态,这时话务员2刚接受了听众1的点歌请求,而听众2还没有开始打热线电话。

这次,我们站在上帝视角,让听众2改变一下选择,既然话务员2已经被别人收买了,那么干脆避其锋芒,直接向话务员1、3报价。

可想而知,听众2的报价会被两位话务员都认可。

在收到了半数以上话务员的报价认可后,听众2先向话务员1发起点歌请求。

话务员1比对一下报价,嗯,没有问题,更新本地的记录,接受他的点歌请求。

讲道理,现在的形势对听众2真的是一片大好,只要再打个电话给话务员3,就能够成功点歌了。

但是这个节骨眼上,听众2的室友喊他了,说:听歌多没意思,咱们一起来打一局刀塔吧。

听众2一想,没毛病,那我先不点歌了。

而这时,听众1回过神来了,他在之前报价阶段可是获得过半数以上的认可的,于是他带着之前被认可的报价打电话进来点歌。

可是在两位话务员那里,记录的最高报价已经升到了两块了,于是听众1的点歌请求会被拒绝。

到这,我们梳理一下,听众1的点歌请求得到了1个接受、2个拒绝,也就是说他的提议没有被过半数以上的话务员接受。

无奈,听众1只能回到第一阶段,从报价开始再重头走一遍流程。并且这次,他把报价提升到了3块。

三位话务员收到新的报价请求后,都会表示认可,并且返回自己本地记录的信息。

听众1这一次收到的三条报价认可中,有两条携带了之前被接受的点歌信息。那么新问题来了,他应该选哪一首歌曲作为自己接下来要点播的歌曲呢?

在这里,听众要遵循的规则其实和话务员一致,他需要在这些返回的报价及歌曲信息中,选择最高报价的歌曲,作为自己的接下来选歌的依据,因此他最终会选择《简单爱》。

最终,在没有其他听众中途打进电话干扰的情况下,三位话务员都会接受听众1的点歌请求。

最终,听众1的点歌请求收到超过半数话务员的接受,于是他确认《简单爱》这首歌会被选中。

最后

前面提到过,Paxos算法中的选举过程就像是一场博弈,场上局势瞬息万变。

回顾一下上面3条不同的时间线,打进电话顺序的不同、选择的话务员不同,都可能导致最终产生不同的结果。

而Paxos算法本身,并不关注最终选择的是哪一个结果,它关注的是无论如何,在最后一定要能够达成一个共识。

当然了,也有可能遇到下面这种无法解决的情况…

在这种情况下,可能会有两个听众交替报价成功,却提议歌曲失败,形成一个活锁的局面。如果这样下去,有可能一整天下来,一首歌曲都没有被最终选取成功。

所以在某些情况下,需要选取一个主提案者,只有主提案者才能和过半的接受者进行通信提出提案。

说白了,也就是我们常说的话事人。

那么,我们最后再做一个总结,其实在我看来,Paxos算法的关键,就在于后者要认同前者,来避免无休止的争端。

本文也只是对决议部分的两阶段通过示例进行了说明,并忽略了算法中另一个角色学习者的内容,如果有兴趣的话,大家不妨去看看论文原文。

毕竟兰伯特大佬都说了:

论文原文:

http://lamport.azurewebsites.net/pubs/paxos-simple.pdf

作者简介,码农参上,一个热爱分享的公众号,有趣、深入、直接,与你聊聊技术。欢迎添加好友,进一步交流。

Paxos分布式系统共识算法?我愿称其为点歌算法…的更多相关文章

  1. <算法图解>读书笔记:第1章 算法简介

    阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...

  2. [直观学习排序算法] 视觉直观感受若干常用排序算法 以及 iOS 资料

    http://www.zhfish.net/?s=点击范围 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则 ...

  3. 算法与AI的暗黑面:3星|《算法的陷阱:超级平台、算法垄断与场景欺骗》

    算法的陷阱:超级平台.算法垄断与场景欺骗 全书讲算法与AI的暗黑面:价格歧视.导致算法军备竞赛.导致商家降价冲动降低.平台作恶(向劣质商家收费导致品质下降.与开发商一起分析用户隐私)等. 作者从商业. ...

  4. Java数据结构和算法(三):常用排序算法与经典题型

    常用的八种排序算法 1.直接插入排序 我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中.将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列.对第四个 ...

  5. C语言二级选择题考点汇总-数据结构与算法-【考点一】 什么是算法

      1.算法及其基本特征 算法是指对方案的准确描述,是解决问题的执行步骤. 算法不等于数学上的计算方法,也不等于程序.程序是算法的载体. 算法的基本特征如下: (1)可行性:步骤可实现,执行结果可达到 ...

  6. 图论算法(三) 最短路SPFA算法

    我可能要退役了…… 退役之前,写一篇和我一样悲惨的算法:SPFA 最短路算法(二)SPFA算法 Part 1:SPFA算法是什么 其实呢,SPFA算法只是在天朝大陆OIers的称呼,它的正统名字叫做: ...

  7. 开源一个比雪花算法更好用的ID生成算法(雪花漂移)

    比雪花算法更好用的ID生成算法(单机或分布式唯一ID) 转载及版权声明 本人从未在博客园之外的网站,发表过本算法长文,其它网站所现文章,均属他人拷贝之作. 所有拷贝之作,均须保留项目开源链接,否则禁止 ...

  8. EM算法(2):GMM训练算法

    目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法运用 EM算法(4):EM算法证明 EM算法(2):GMM训练算法 1. 简介 GMM模型全称为Ga ...

  9. 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】

    最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...

随机推荐

  1. Apache DolphinScheduler 1.2.1 发布说明

    Apache DolphinScheduler 于2020年2月24日正式发布 1.2.1 版,发布内容如下: 新特性: [#1497] 通过 API 创建的工作流在前端展示时自动调整布局. [#74 ...

  2. 介绍下Java内存区域(运行时数据区)

    介绍下Java内存区域(运行时数据区) Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域.JDK 1.8 和之前的版本略有不同. 下图是 JDK 1.8 对JV ...

  3. 获取进程产生了多少次pagefault

    怎么获取某个进程产生了多少次pagefault? 这个在ps 命令中可以看到,比如查看java的pagefault情况. ps -o maj_flt -o min_flt -p `ps -e|grep ...

  4. Linux 禁止root远程登录解决办法

    linux中root用户是超级管理员,可以针对root用户暴力破解密码,这样很不安全,工作中我们一般禁止root用户直接远程登陆,开设一个或多个普通用户,只允许登陆普通用户,如果有需要用root用户, ...

  5. 2019 CSP-S Ⅱ 游记

    day0(试机) 第零天,重新打了一遍头文件和读优,熟悉了一下就匆匆走了. day1 T1一看到先把二分打了,然后发现long long要爆,好慌 主要是基础知识不够扎实,不知道unsigned lo ...

  6. NOI 2019 省选模拟赛 T1【JZOJ6082】 染色问题(color) (多项式,数论优化)

    题面 一根长为 n 的无色纸条,每个位置依次编号为 1,2,3,-,n ,m 次操作,第 i 次操作把纸条的一段区间 [l,r] (l <= r , l,r ∈ {1,2,3,-,n})涂成颜色 ...

  7. Linux应急响应学习

    Linux应急响应-系统日志排查-溯源 溯源 找到攻击者.系统日志分析攻击者的ip  攻击者可能留下了一些代码 样本 网上的信息很大程度上是不可信的. 方法: 蜜罐  高交互的蜜罐 溯源: ip 日志 ...

  8. 01 - 快速体验 Spring Security 5.7.2 | 权限管理基础

    在前面SpringBoot 2.7.2 的系列文章中,已经创建了几个 computer 相关的接口,这些接口直接通过 Spring Doc 或 POSTMAN 就可以访问.例如: GET http:/ ...

  9. Databend 源码阅读系列(二):Query server 启动,Session 管理及请求处理

    query 启动入口 Databend-query server 的启动入口在 databend/src/binaries/query/main.rs 下,在初始化配置之后,它会创建一个 Global ...

  10. OpenDrop 这样的应用程序以及与当今流行的替代品的比较

    由安全移动网络实验室 OpenDrop 创建的用 Python 编写的开放 Apple AirDrop 实现是一个命令行工具,允许直接通过 Wi-Fi 在设备之间共享文件.它的独特之处在于它与 App ...