问题

  • Paxos 到底解决什么样的问题,动机是什么
  • Paxos 流程是怎么样的?
  • Paxos 算法的缺陷是什么

概述

Paxos 是分布式一致性算法,根据少数服从多数的原则多个节点确定某个数值。通过学习 Base Paxos ,我们再进一步优化,提出了 Multi Paxos .

动机

我们先思考为什么会出现一致性问题,原因是我们原本使用一台机器,而使用多台机器后(分布式),发生网络延迟或是其他原因导致所有机器不能同时在线,分布式的好处为了让我们享有可用性的好处,但是多台同时也会带来一致性的问题,最好理解的就是MySQL 中的主从复制,当主在写入的时候从没来得及复制完毕,那么此时的读到的数据是和刚写入的值是不一致的,而过多一会再次读就可以读到正确的值,也就是上面讲到的主从复制保证的最终一致性,于是,起码来说分布式中要解决这两个问题 :

  • 部分机器挂了
  • 一致性问题

我们来看一下wiki中关于 Paxos 的介绍 :

Paxos is a family of protocols for solving consensus in a network of unreliable processors (that is, processors that may fail). Consensus is the process of agreeing on one result among a group of participants. This problem becomes difficult when the participants or their communication medium may experience failures.[1]

Consensus protocols are the basis for the state machine replication approach to distributed computing, as suggested by Leslie Lamport[2] and surveyed by Fred Schneider.[3] State machine replication is a technique for converting an algorithm into a fault-tolerant, distributed implementation. Ad-hoc techniques may leave important cases of failures unresolved. The principled approach proposed by Lamport et al. ensures all cases are handled safely.

来自 <https://en.wikipedia.org/wiki/Paxos_(computer_science)#Typical_deployment>

所以该算法的最终目的是在节点出现问题的情况下保持一致性,关于另外一个理解Paxos 存在的动机可以看这一篇文章

Paxos 协议过程

下面的推导过程来自 <https://www.cnblogs.com/bangerlee/p/5655754.html> ,非原创

Paxos 协议的包含三个角色 :

  • Proposer
  • Acceptor
  • Learner

协议开始之前我们思考一个问题,当面对多个节点协议而达到一致性的情况,第一个想到的解决方案是什么?少数服从多数。Paxos 协议的思路实际就是少数服从多数。

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

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

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

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

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

2. acceptor可以接受(accept)不止一项提议,当多数(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)。

以上提到的各项约束条件可以归纳为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两个阶段。prepare阶段proposer发起提议问询提议值、acceptor回应问询并进行promise;accept阶段完成决议,图示如下:


上面我们对协议进行了推导,下面用文字表述一下这个过程 :

阶段1.

  1. proposer 选择一个提案编号Mn,向acceptor的多数派发送编号为Mn的prepare请求。
  2. acceptor:如果接收到编号为Mn 的prepare请求,并且Mn大于它已经回应的任何prepare请求,它就返回已经批准的编号最高的提案的value(如果有的话),并承诺不再批准任何编号小于Mn的提案。

阶段2.

  1. proposer :如果收到了多数acceptor对prepare请求Mn的回应,它就向这些Acceptor发送提案[Mn, Mv]的accept请求,其中Mn是所有prepare请求回应中编号最大的已批准提案的value;或者是proposer 选择的值,如果所有prepare请求的响应均没有带回已批准的提案。
  2. acceptor:如果收到了提案[Mn, Mv]的accept请求,它就批准该提案,除非它已经回应了一个编号大于Mn的提案。

其中,Mn是提案编号。

可能出现的问题

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

上图来自 wiki。

Multi Paxos

上面我们知道在第一阶段中prepare 的目的是为了获取最新的提案编号,并且这个过程只能确定一个值。并且Base Paxos 中多个 proposer 发送多个消息,最终只有一个提案通过,大量的信息都是浪费的,Multi Paxos 中只使用一个 proposer 。

  • 选主状态,由集群中的任意节点拉票发起选主,拉票中带上自己的vx,通过收集集群中半数以上的Vn,来更新自己的Vc 值,得到目前集群通过的最大Vc = Vn
  • 强leader状态,leader对Vn的演变了如指掌,每次把Vn的值直接在一阶段中发送给acceptor,和basic paxos的区别:basic paxos一阶段的时候,proposer对vn的值一无所知,要依赖一阶段的结果来算 Vn

我们把单次“确定一个值”的过程称为实例(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的更多相关文章

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

    图解分布式一致性协议Paxos https://www.cnblogs.com/hugb/p/8955505.html   Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分 ...

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

    Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分布式系统的事务处理>: Google Chubby的作者MikeBurrows说过这个世界上只有一种一致性算法,那就是 ...

  3. 图解分布式一致性协议Paxos

    Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分布式系统的事务处理>: Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就 ...

  4. [从Paxos到ZooKeeper][分布式一致性原理与实践]<二>一致性协议[Paxos算法]

    Overview 在<一>有介绍到,一个分布式系统的架构设计,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是产生了一系列的一致性协议. 为解决分布式一致性问题,在长期的探索过程中 ...

  5. 搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法

    搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法 2PC 由于BASE理论需要在一致性和可用性方面做出权衡,因此涌现了很多关于一致性的算法和协议.其中比较著名的有二阶提交协议(2 Phas ...

  6. [转帖]分布式一致性协议介绍(Paxos、Raft)

    分布式一致性协议介绍(Paxos.Raft) https://www.cnblogs.com/hugb/p/8955505.html  两阶段提交 Two-phase Commit(2PC):保证一个 ...

  7. 使用GO实现Paxos分布式一致性协议

    什么是Paxos分布式一致性协议 最初的服务往往都是通过单体架构对外提供的,即单Server-单Database模式.随着业务的不断扩展,用户和请求数都在不断上升,如何应对大量的请求就成了每个服务都需 ...

  8. 分布式一致性协议Raft原理与实例

    分布式一致性协议Raft原理与实例 1.Raft协议 1.1 Raft简介 Raft是由Stanford提出的一种更易理解的一致性算法,意在取代目前广为使用的Paxos算法.目前,在各种主流语言中都有 ...

  9. Zookeeper——分布式一致性协议及Zookeeper Leader选举原理

    文章目录 一.引言 二.从ACID到CAP/BASE 三.分布式一致性协议 1. 2PC和3PC 2PC 发起事务请求 事务提交/回滚 3PC canCommit preCommit doCommit ...

随机推荐

  1. [NOI2010] 超级钢琴 - 贪心,堆,ST表

    这也算是第K大问题的套路题了(虽然我一开始还想了个假算法),大体想法就是先弄出最优的一批解,然后每次从中提出一个最优解并转移到一个次优解,用优先队列维护这个过程即可. 类似的问题很多,放在序列上的,放 ...

  2. 在Ubuntu 18.04上安装Git

    步骤1.首先,通过运行以下命令确保您的系统和apt包列表完全更新: apt-get update -yapt-get upgrade -y 第2步.在Ubuntu 18.04上安装Git. 现在让我们 ...

  3. django 搭建一个投票类网站(一)

    写在最前,之前零零散散的看过django,但是由于比较杂,学的云里雾里的,所以就停了一段落,但是我最近找到了一个django的书,是李建编著的django入门与实践,于是,打算照着书上的步骤来写好一个 ...

  4. Winform中使用Reactivex代替BeginInvoke/Invoke来更新UI数据

    首先通过Nuget安装包System.Reactive. ReactiveX项目 Url: https://github.com/Reactive-Extensions/Rx.NET public p ...

  5. 计算机网络,HTTP - 如何查看一个网站是否使用HTTP/2?

    方法 HTTP/2用":authority"头部代替"Host"头部. Chrome F12里面,HTTP/1.1有"view source" ...

  6. 2019牛客多校第一场E ABBA dp

    ABBA dp 题意 给出2(N+M)个AB字符,问能构造出N个AB子序列和M个BA子序列组成的2*(n+m)的序列种类有多少 思路 碰到计数构造类的题目,首先要去找到判断合法性的条件,即什么情况下合 ...

  7. selenium-JavaScript的处理

    JavaScript的处理 在自动化过程中,遇到js处理的元素,需要使用js语言对元素进行操作,例如,滑动到浏览器的底部或者顶部,时间控件的处理,元素可见不可见以及富文本的处理等,都需要js语言的支持 ...

  8. fader

    fader在音频处理中是比较基础的处理.通常用于平滑的调节音量,或是音频的渐入和渐出效果. 比较常见的fader有line和cubic线型的fader. line fader即fader的渐变过程是线 ...

  9. DB技能数据库里把技能伤害调整

    1. MagID 技能代号 2. MagName 技能名称 3. Effect Type 效果类型(使用技能时角色的动作效果) 4. Effect 效果(技能产生的动画效果) 5. Spell 每次耗 ...

  10. Spark学习笔记1

    趁着工作业余时间,趁着内心对技术追求的热情,还是对Spark这个大数据内存计算框架动手了,毕竟人与人之间的差距都是在工作业余时间拉开的…… Spark官网:http://spark.apache.or ...