本文以图文并茂的方式重新演绎 Paxos 开山之作 《The Part-Time Parliament》[1],并尝试解释原论文中语焉不详的地方。

背景

在 Paxos 小岛上,施行着一种 Parliament(议会) 政治。小岛上执行的所有 decree(法令) 都需要先由 Parliament 在 Chamber 内表决通过。legislator(议员) 将 Parliament 通过的 decree 记录在他随身携带的 ledger(账本) 上。比如某 legislator 在其 ledger 记录了第 155 号 decree 如下:

为了防止岛上的 decree 出现冲突,导致不必要的纠纷, 任何两个 legislator 记录的相同编号的 decree 要么是一样的,要么其中某个 legislator 不存在该编号的 decree。

legislator 倾向于通过别人发起的 decree 请求, 只要其他 legislator 发起的 decree 请求与自己 ledger 记录不冲突,则为它投票。

为了保证 decree 的顺利产生, 除了在 ledger 正面记录表决通过的 decree, legislator 还需要记录一些中间过程: 需要长期持有的信息记录在 ledger 背面, 这部分信息可以被划掉;需要临时持有的信息记录在草稿纸上, legislator 仅在 Chamber 内保留记录信息的草稿纸。

legislator 都是兼职的(part-time), 因此他们可以选择随时离开或加入 Chamber 参与投票。

由于 Chamber 内人员众多,比较嘈杂,legislator 之间通过只能通过信使(messager)进行交流。信使同样也是兼职的,他们和 legislator 一样,可以随时选择进入或离开 Chamber(即使他正在参与某次消息的传递。这将导致这条消息永远消失,或者这条消息会在不可预见的未来重新参与传递)。

Chamber 内 legislator 进进出出有个比较严重的问题: 两次参会的人如果没有交集, 他们可能会投票产生互相冲突的提案,这将导致 legislator 记录的相同编号 decree 产生冲突,不能满足一开始对 decree 的约束。(任何两个 legislator 记录的相同编号的 decree 要么是一样的,要么其中某个 legislator 不存在该编号的 decree)

为了解决这个问题,Paxos 小岛上的人对 与会人数(Quorum) 进行了约束:当与会人数占 legislator 总人数的一半以上时,才能发起提案流程,否则,法案无法通过。根据鸽巢原理,两次投票至少有一个 legislator 都有参与,他将会拒绝冲突的提案内容形成 decree。

当与会的所有 legislator 都投票表示赞成(意味着与历史 decree 无冲突), 提议的已通过成为 decree, 周知到所有与会人员,记录在 ledger 证明正式生效。

The Single-Decree Synod

上一部分介绍了 paxos 小岛上的 Parliament 将 decree 从提出到通过的整体流程。在 Parliament 中可以通过很多 decree, 本节为了探索 decree 达成共识的具体细节,先从达成单个 decree 的 Synod 会议聊起。Synod 和 Parliament 的差异如下:

在 Synod 会议中,每个 Priest 可以参与多轮 投票(Ballot)。每位 priest 每轮 ballot 仅能投一次票。 ballot B 包含一下四种信息:

  • B_dec: 本轮 ballot 提议待通过的 decree;
  • B_qrm: 与会的 priest 的集合;
  • B_vot: 已参与投票的 priest 的集合;
  • B_bal: 本轮 ballot 的编号, 全序。(注意与 decree 编号区分)

根据第一部分的铺垫,我们知道当且仅当 B_vot 是 B_qrm 的子集,即所有与会的 priest 都已参与投票,这次 ballot 才是成功的(本轮 ballot 提议的 decree 通过)。

为了保证 Synod 会议最终最多产生唯一 decree(无冲突), 我们需要保证以下三点条件:

  • B1: 为了标识 ballot,每一轮 ballot 需要有唯一的编号。
  • B2: 任意两轮 bollot 至少保证有一个 priest 同时参与。(第一部分已经解释过这么做的原因)
  • B3 : 如果某些 priest 在之前的 ballot 已经参与过投票,则本轮 ballot 投票的 decree 等于他们参与的最近一次 ballot 的 decree。

比如,在 Fig. 1 [1] 中, 展示了五轮 ballot(ballot 编号分别为 2, 5, 14, 27, 29)。 Synod 共有五位 priest: A, B, ΓΔE。 每轮 ballot 罗列出来的 priest 就是本轮与会的 Quorum。用矩形框框出的 priest 代表本轮已参与投票的 priest。依次解释每轮 ballot 的内容如下:

  • 2: 最早的 ballot,可以投票任何 decree。 本轮提议 decree α, Δ 已为它投票。
  • 5: 参与本轮 ballot 的 A, B, ΓE 都没有参与更早的投票,因此他们都可以为本轮提议 decree β 投票。本轮仅 Γ 参与了投票。
  • 14: 本轮 ballot 中, Δ 已经为 decree α 投过票(ballot 2 中),因此本轮 decree 只能为 α。本轮 B, E 已经投票。
  • 27: 本轮 ballot 中, Δ 已经为 decree α 投过票(ballot 2 中, 注意 Δ 未参与 ballot 14 的投票), Γ 已经为 decree β 投过票(ballot 5 中)。因此本轮 decree 必须与 ballot 5(max(2, 5)) 相同,即 decree β。本轮与会的 A, ΓΔ 都已参与投票,本轮 ballot 成功通过了 decree β。
  • 29: 参与本轮 ballot 的 priest 中,B 参与的最新一次投票为 ballot 14, ΓΔ 参与的最新一次投票为 ballot 27, 因此本轮 ballot 的 decree 必须和 ballot 27(max(14, 27) ) 一致,即 decree β。本轮仅 B 完成了投票。

某轮 ballot B 一旦投票成功,参与后续 ballot 的 priest 至少有一位曾参与 B 的投票(B2),根据 B3, 后续 ballot 投票的 decree 必须保持和 ballot B 一致。因此, 后续通过的所有 decree 都必须和第一次通过的 decree 内容保持一致。

为了满足 B1 的需求,将 Bollot 编号设为 <priest id, ballot id> 格式, 其中 priest id 表示发起该 Ballot 的 priest 的编号。同一个 priest 不会发起编号相同的 Ballot, 因此能满足 Ballot 编号不冲突的要求。

在第一部分已经讨论,为了满足 B2,只需要保证每次参与投票的 priest 人数占总人数的一半以上,根据鸽巢原理,任意两轮 bollot 至少保证有一个 priest 同时参与。

要满足 B3 的要求相对麻烦一些。保证 B3 的关键在于 Ballot 编号小于当前正在处理的 Ballot 的集合不再变动(否则无法拿到最新的“本轮 ballot 投票的 decree 等于他们参与的最近一次 ballot 的 decree”。)。

为了保证“ Ballot 编号小于当前正在处理的 Ballot 的集合不再变动”, 借鉴两阶段提交策略,将请求拆分为两部分:第一部分向 B_qrm 的 priest 申请处理当前 Ballot(编号为 B_bal),并且要求他们保证不再处理 “Ballot 编号小于当前正在处理的 Ballot”;第二部分才向 B_qrm 实际发起本轮 Ballot 的数据请求。

实现细节见下图:

The Multi-Decree Parliament

The Multi-Decree Parliament 算法实际上是对每个带有编号的 decree 执行 The Single-Decree Synod 算法,最终实现一系列 decree 都能达成一致。

参考文献

[0] 本文所有绘图均使用 draw.io 绘制

[1] The Part-Time Parliament

图解论文《The Part-Time Parliament》的更多相关文章

  1. PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)

    100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...

  2. 从分布式一致性到共识机制(一)Paxos算法

    从分布式系统的CAP理论出发,关注分布式一致性,以及区块链的共识问题及解决. 区块链首先是一个大规模分布式系统,共识问题本质就是分布式系统的一致性问题,但是又有很大的不同.工程开发中,认为系统中存在故 ...

  3. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  4. Paxos

    Paxos算法原理与推导   Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不 ...

  5. Raft 为什么是更易理解的分布式一致性算法

    一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...

  6. PayPal 高级工程总监:读完这 100 篇文献,就能成大数据高手

    原文地址 开源(Open Source)对大数据影响,有二:一方面,在大数据技术变革之路上,开源在众人之力和众人之智推动下,摧枯拉朽,吐故纳新,扮演着非常重要的推动作用:另一方面,开源也给大数据技术构 ...

  7. 【转】Raft 为什么是更易理解的分布式一致性算法

    编者按:这是看过的Raft算法博客中比较通俗的一篇了,讲解问题的角度比较新奇,图文并茂,值得一看.原文链接:Raft 为什么是更易理解的分布式一致性算法 一致性问题可以算是分布式领域的一个圣殿级问题了 ...

  8. Raft 为什么是更易理解的分布式一致性算法(转)

    一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...

  9. 【转载】分布式系列文章——Paxos算法原理与推导

    转载:http://linbingdong.com/2017/04/17/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0 ...

  10. 【转载】Raft 为什么是更易理解的分布式一致性算法

    一致性问题可以算是分布式领域的一个圣殿级问题了,关于它的研究可以回溯到几十年前. 拜占庭将军问题 Leslie Lamport 在三十多年前发表的论文<拜占庭将军问题>(参考[1]). 拜 ...

随机推荐

  1. K8S kubesphere安装mysql

    原先我们使用Docker按照mysql时候的命令 docker run -p 3306:3306 --name mysql-01 \ -v /mydata/mysql/log:/var/log/mys ...

  2. 关于Linux mint更换中文字体后全局楷体修改办法

    问题描述 linux mint 更新中文字体后,全局都变成了楷体,浏览器里面,终端里(英文字体可以在终端设置里面修改),这里指的是中文字体,而英文字体可以在 linux mint 设置 - 选择字体 ...

  3. CSS伪类使用详解

    基本描述 CSS伪类是很常用的功能,主要应用于选择器的关键字,用来改变被选择元素的特殊状态下的样式. 伪类类似于普通CSS类的用法,是对CSS选择器的一种扩展,增强选择器的功能. 目前可用的伪类有大概 ...

  4. Springboot 整合 SpringCache 使用 Redis 作为缓存

    一直以来对缓存都是一知半解,从没有正经的接触并使用一次,今天腾出时间研究一下缓存技术,开发环境为OpenJDK17与SpringBoot2.7.5 SpringCache基础概念 接口介绍 首先看看S ...

  5. 线上服务异常的定位、处理与优化的探索 - 第三章 Java虚拟机

    Java虚拟机   之所以引入关于JVM的篇章,是发现多数项目发生的线上问题很大的几率源自JVM调优配置不当引起.对JVM的内存模型.GC垃圾回收机制.调优方式有一个系统化的了解后,可以快速处理或避免 ...

  6. Java手写一个批量获取数据工具类

    1. 背景 偶尔会在公司的项目里看到这样的代码 List<Info> infoList = new ArrayList<Info>(); if (infoidList.size ...

  7. 【Java难点攻克】「NIO和内存映射性能提升系列」彻底透析NIO底层的内存映射机制原理与Direct Memory的关系

    NIO与内存映射文件 Java类库中的NIO包相对于IO包来说有一个新功能就是 [内存映射文件],在业务层面的日常开发过程中并不是经常会使用,但是一旦在处理大文件时是比较理想的提高效率的手段,之前已经 ...

  8. PAM8403 3.3V音频功放调试笔记

    做I2S输出用了PT8211(实际上买到的丝印是GH8211), 双声道, LSB格式, 工作正常但是输出功率非常低, 喇叭声音要贴近了才能勉强听到, 所以打算做一个PT8211带功放的I2S模块. ...

  9. JS如何返回异步调用的结果?

    这个问题作者认为是所有从后端转向前端开发的程序员,都会遇到的第一问题.JS前端编程与后端编程最大的不同,就是它的异步机制,同时这也是它的核心机制. 为了更好地说明如何返回异步调用的结果,先看三个尝试异 ...

  10. pg_basebackup恢复:unrecognized configuration parameter "restore_command"

    问题描述:2022年最后一个工作日,时间过的真快,一晃又一年过去了,祝愿看到的各位元旦快乐. 使用pg_basebackup进行pg的备份恢复,在恢复的过程中,配置文件添加恢复的参数,一直启动报错. ...