本文以图文并茂的方式重新演绎 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. 1、ArrayList源码解析

    目录 1 概述 2 底层数据结构 3 构造函数 4 自动扩容 5 set() get() remove() 6 Fail-Fast机制 1 概述 ArrayList实现了List接口,是 顺序容器,允 ...

  2. 10 STL-list

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦! 写在前面,本篇章主要介绍S ...

  3. 使用Python实现多线程、多进程、异步IO的socket通信

    多线程实现socket通信服务器端代码 import socket import threading class MyServer(object): def __init__(self): # 初始化 ...

  4. TKE 超级节点,Serverless 落地的最佳形态

    陈冰心,腾讯云产品经理,负责超级节点迭代与客户拓展,专注于 TKE Serverless 产品演进. 背景 让人又爱又恨的 Serverless Serverless 炙手可热,被称为云原生未来发展的 ...

  5. JavaScript中的Error错误对象与自定义错误类型

    Error Error是JavaScript语言中的一个标准的内置对象,专门用于处理JS开发中的运行时错误. 当我们的JS代码在运行过程中发生错误的话,就会抛出Error对象,整个程序将会中断在错误发 ...

  6. windows安装grunt时提示不是内部或外部命令解决方案

    参考:https://www.cnblogs.com/hts-technology/p/8477258.html 安装windows安装elasticsearch-head时 不需要输入grunt s ...

  7. 【Java SE进阶】Day08 File类、递归

    一.File类 1.概述java.io.File 文件和路径的抽象表示 用于文件和目录的创建.查找和删除等 分类 file--文件 directory--文件夹/目录 path--路径 2.静态成员变 ...

  8. python中函数教程

    函数的基本概念 1.什么是函数? 函数相当于一种工具,就是把一串代码装到一起,我们下次需要用的这个功能的时候可以直接使用 函数相当于是工具(具有一定功能) 不用函数 修理工需要修理器件要用锤子 原地打 ...

  9. RGB以及RGBA

    字母含义及取值 R:红色.0~255 整数 G:绿色.0~255 整数 B:蓝色.0~255 整数 A:透明度.0~1.整数或者小数 RGB和RGBA的关系 项目遇见一个需求,后台返回所占比例,前端根 ...

  10. 解决笔记本安装centos7后无法调节屏幕亮度

    起因:本人有台老古董笔记本,大约是10年前左右了,三星rv411,配置较低无法安装win7以上的系统.装个CentOS7正好可以拿来学习Linux系统. 但是遇到一个特别恶心的情况,笔记本上调节屏幕亮 ...