分布式系统理论进阶 - Paxos

引言

《分布式系统理论基础 - 一致性、2PC和3PC》一文介绍了一致性、达成一致性需要面临的各种问题以及2PC、3PC模型,Paxos协议在节点宕机恢复、消息无序或丢失、网络分化的场景下能保证决议的一致性,是被讨论最广泛的一致性协议。

Paxos协议同时又以其“艰深晦涩”著称,下面结合 Paxos Made SimpleThe Part-Time Parliament 两篇论文,尝试通过Paxos推演、学习和了解Paxos协议。

Basic Paxos

何为一致性问题?简单而言,一致性问题是在节点宕机、消息无序等场景可能出现的情况下,相互独立的节点之间如何达成决议的问题,作为解决一致性问题的协议,Paxos的核心是节点间如何确定并只确定一个值(value)。

也许你会疑惑只确定一个值能起什么作用,在Paxos协议里确定并只确定一个值是确定多值的基础,如何确定多值将在第二部分Multi Paxos中介绍,这部分我们聚焦在“Paxos如何确定并只确定一个值”这一问题上。

和2PC类似,Paxos先把节点分成两类,发起提议(proposal)的一方为proposer,参与决议的一方为acceptor。假如只有一个proposer发起提议,并且节点不宕机、消息不丢包,那么acceptor做到以下这点就可以确定一个值:

P1. 一个acceptor接受它收到的第一项提议

当然上面要求的前提条件有些严苛,节点不能宕机、消息不能丢包,还只能由一个proposer发起提议。我们尝试放宽条件,假设多个proposer可以同时发起提议,又怎样才能做到确定并只确定一个值呢?

首先proposer和acceptor需要满足以下两个条件:

1. proposer发起的每项提议分别用一个ID标识,提议的组成因此变为(ID, value)

2. acceptor可以接受(accept)不止一项提议,当多数(majority,或quorum) acceptor接受一项提议时该提议被确定(chosen)

(注: 注意以上“接受”和“确定”的区别)

我们约定后面发起的提议的ID比前面提议的ID大,并假设可以有多项提议被确定,为做到确定并只确定一个值acceptor要做到以下这点:

P2. 如果一项值为v的提议被确定,那么后续只确定值为v的提议

(注: 乍看这个条件不太好理解,谨记目标是“确定并只确定一个值”)

由于一项提议被确定(chosen)前必须先被acceptor接受(accepted),为实现P2,实质上acceptor需要做到:

P2a. 如果一项值为v的提议被确定,那么acceptor后续只接受值为v的提议

满足P2a即满足P2 (P2a => P2)。

目前在多个proposer可以同时发起提议的情况下,满足P1、P2a即能做到确定并只确定一个值。如果再加上节点宕机恢复、消息丢包的考量呢?

假设acceptor c 宕机一段时间后恢复,c 宕机期间其他acceptor已经通过了一项值为v的决议但c 因为宕机并不知晓;c 恢复后如果有proposer马上发起一项值不是v的提议,由于条件P1,c 会接受该提议,这与P2a矛盾。为了避免这样的情况出现,进一步地我们对proposer作约束:

P2b. 如果一项值为v的提议被确定,那么proposer后续只发起值为v的提议

满足P2b即满足P2a (P2b => P2a => P2)。

P2b约束的是提议被确定(chosen)后proposer的行为,我们更关心提议被确定前proposer应该怎么做:

P2c. 对于提议(n,v),acceptor的多数派S中,如果存在acceptor最近一次(即ID值最大)接受的提议的值为v‘,那么要求v = v‘;否则v可为任意值

满足P2c即满足P2b (P2c => P2b => P2a => P2)。

光看P2c的描述可能会觉得一头雾水,我们通过 The Part-Time Parliament 中的例子加深理解:

假设有A~E 5个acceptor,- 表示acceptor因宕机等原因缺席当次决议,x 表示acceptor不接受提议,o 表示接受提议;多数派acceptor接受提议后提议被确定,以上表格对应的决议过程如下:

  1. ID为2的提议最早提出,根据P2c其提议值可为任意值,这里假设为a
  2. acceptor A/B/C/E 在之前的决议中没有接受(accept)任何提议,因而ID为5的提议的值也可以为任意值,这里假设为b
  3. acceptor B/D/E,其中D曾接受ID为2的提议,根据P2c,该轮ID为14的提议的值必须与ID为2的提议的值相同,为a
  4. acceptor A/C/D,其中D曾接受ID为2的提议、C曾接受ID为5的提议,相比之下ID 5较ID 2大,根据P2c,该轮ID为27的提议的值必须与ID为5的提议的值相同,为b;该轮决议被多数派acceptor接受,因此该轮决议得以通过
  5. acceptor B/C/D,3个acceptor之前都接受过提议,相比之下C、D曾接受的ID 27的ID号最大,该轮ID为29的提议的值必须与ID为27的提议的值相同,为b

以上提到的各项约束条件可以归纳为3点,如果proposer/acceptor满足下面3点,那么在少数节点宕机、网络分化隔离的情况下,在“确定并只确定一个值”这件事情上可以保证一致性(consistency):

  • B1(ß): ß中每一轮决议都有唯一的ID标识
  • B2(ß): 如果决议B被acceptor多数派接受,则通过决议B
  • B3(ß): 对于ß中的任意提议B(n,v),acceptor的多数派中如果存在acceptor最近一次(即ID值最大)接受的提议的值为v‘,那么要求v = v‘;否则v可为任意值

(注: 希腊字母ß表示多轮决议的集合,字母B表示一轮决议)

另外为保证P2c,我们对acceptor进行两项约束:

1. 记录曾接受的ID最大的提议,因proposer需要问询该信息以决定提议值

2. 在回应提议ID为n的proposer自己曾接受过ID最大的提议时,acceptor同时保证(promise)不再接受ID小于n的提议

proposer/acceptor完成一轮决议可归纳为prepare和accept两个阶段,图示如下:

还有一个问题需要考量,假如proposer A发起ID为n的提议,在提议未完成前proposer B又发起ID为n+1的提议,在n+1提议未完成前proposer C又发起ID为n+2的提议…… 如此不能完成决议、形成活锁(livelock),虽然这不影响一致性,但我们一般不想让这样的情况发生。解决的方法是从proposer中选出一个leader,统一由proposer leader发起提议避免活锁。

最后我们再引入一个新的角色:learner,learner依附于acceptor,用于习得已通过的决议。以上决议过程都只要求acceptor多数派参与,而我们希望尽量所有acceptor的状态一致。如果部分acceptor因宕机等原因未知晓已通过决议,宕机恢复后可经本机learner采用pull的方式从其他acceptor习得。

Multi Paxos

通过以上步骤分布式系统已经能确定一个值,“只确定一个值有什么用?这可解决不了我面临的问题。” 你心中可能有这样的疑问。

其实不断地进行“确定一个值”的过程,就能确定具有全序关系(total order)的系列值,进而能应用到数据库副本存储等很多场景。我们把单次“确定一个值”的过程称为实例(instance),它由proposer/acceptor/learner组成,下图说明了A/B/C三机上的实例:

不同序号的实例之间互相不影响,A/B/C三机输入相同、过程实质等同于执行相同序列的状态机(state machine)指令 ,因而将得到一致的结果。

proposer leader在Multi Paxos中还有助于提升性能,常态下统一由leader发起提议,可节省prepare步骤(leader不用问询acceptor曾接受过的ID最大的提议、只有leader提议也不需要acceptor进行promise)直到发生leader宕机、网络丢包等。

小结

以上介绍了Paxos的推演过程、如何在Basic Paxos的基础上通过状态机构建Multi Paxos。Paxos协议比较“艰深晦涩”,但多读几遍论文一般能理解其内涵,更难的是如何将Paxos真正应用到工程实践。

微信后台开发同学实现并开源了一套基于Paxos协议的多机状态拷贝类库PhxPaxos,PhxPaxos用于将单机服务扩展到多机,其经过线上系统验证并在一致性保证、性能等方面作了很多考量。

--

本文提到的一些概念包括一致性(consistency)、一致性系统模型(system model)、多数派(quorum)、全序关系(total order)等,在以下文章中有介绍 :)

《分布式系统理论基础 - 一致性、2PC和3PC》

《分布式系统理论基础 - 时间、时钟和事件顺序》

《分布式系统理论基础 - CAP》

--

时间: 2024-10-05 18:28:43

分布式系统理论进阶 - Paxos的相关文章

分布式系统理论进阶 - Raft、Zab

引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议——Raft和Zab.通过与Paxos对比,了解Raft和Zab的核心思想.加深对一致性协议的认识. Raft Paxos偏向于理论.对如何应用到工程实践提及较少.理解的难度加上现实的骨感,在生产环境中基于Paxos实现一个正确的分布式系统非常难[1]: There are significant gaps between the description of the Paxos al

后端技术:分布式系统理论 - 从放弃到入门

分布式系统理论 - 从放弃到入门随承载用户数量的增加和容灾的需要,越来越多互联网后台系统从单机模式切换到分布式集群.回顾自己毕业五年来的工作内容,同样有这样的转变. 毕业头两年负责维护运行在刀片机上的业务,在机房里拔插单板的日子是我逝去的青春.设备之间通过VCS组成冷备,但即使有双机软件保护,宕机.网络丢包等问题发生时业务仍会受影响.这样的系统架构下为保证SLA,有时候需要深入 Linux系统内核或硬件层面分析机器重启的原因. 接下来负责维护承载在分布式集群上的业务,相比前面的工作,这个阶段主要

分布式系统理论(二):一致性协议Paxos

摘要: 分布式系统理论第二章,此系列主要以理论为主. Paxos算法 Paxos算法是莱斯利·兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递的一致性算法. Paxos 算法是一个解决分布式系统中,多个节点之间就某个值(注意是某一个值,不是一系列值)达成一致的通信协议.能够处理在少数派离线的情况下,剩余的多数派节点仍然能够达成一致. Lamport是通过故事的方式提出Paxos 问题:希腊岛屿Paxon 上的执法者在议会大厅中表决通过法律(一次paxos过程),并通过服务

图解分布式一致性协议Paxos

Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分布式系统的事务处理>: Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品. <大规模分布式存储系统>: 理解了这两个分布式协议之后(Paxos/2PC),学习其他分布式协议会变得相当容易. 学习Paxos算法有两部分:a) 算法的原理/证明:b) 算法的理解/运作. 理解这个算法的运作过程其实基本就可以用于工程实践.而且理解这个过程相

[转]图解分布式一致性协议Paxos

Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分布式系统的事务处理>: Google Chubby的作者MikeBurrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品. <大规模分布式存储系统>: 理解了这两个分布式协议之后(Paxos/2PC),学习其他分布式协议会变得相当容易. 学习Paxos算法有两部分:a) 算法的原理/证明:b) 算法的理解/运作. 理解这个算法的运作过程其实基本就可以用于工程实践.而且理解这个过程相对

分布式一致性算法--Paxos

Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说,就是可以通过Paxos实现多副本一致性,分布式锁,名字管理,序列号分配等.比如,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点执行相同的操作序列,那么他们最后能得到一个一致的状态.为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致.本

分布式一致性算法——paxos

一.什么是paxos算法 Paxos 算法是分布式一致性算法用来解决一个分布式系统如何就某个值(决议)达成一致的问题. 人们在理解paxos算法是会遇到一些困境,那么接下来,我们带着以下几个问题来学习paxos算法: 1.paxos到底在解决什么问题? 2.paxos到底如何在分布式存储系统中应用? 3.paxos的核心思想是什么? 二.paxos解决了什么问题 分布式的一致性问题其实主要是指分布式系统中的数据一致性问题.所以,为了保证分布式系统的一致性,就要保证分布式系统中的数据是一致的. 在

【转载】分布式系列文章——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%E2%80%94%E2%80%94Paxos%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86%E4%B8%8E%E6%8E%A8%E5%AF%BC/ Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上

分布式系统理论 - 从放弃到入门

随承载用户数量的增加和容灾的需要,越来越多互联网后台系统从单机模式切换到分布式集群.回顾自己毕业五年来的工作内容,同样有这样的转变. 毕业头两年负责维护运行在刀片机上的业务,在机房里拔插单板的日子是我逝去的青春.设备之间通过VCS组成冷备,但即使有双机软件保护,宕机.网络丢包等问题发生时业务仍会受影响.这样的系统架构下为保证SLA,有时候需要深入Linux系统内核或硬件层面分析机器重启的原因. 接下来负责维护承载在分布式集群上的业务,相比前面的工作,这个阶段主要关注点不是单节点的异常,更多是系统