Paxos算法浅析

前言在文章2PC/3PC到底是啥中介绍了2PC这种一致性协议,从文中了解到2PC更多的被用在了状态一致性上(分布式事务),在数据一致性中很少被使用;而Paxos正是在数据一致性中被广泛使用,在过去十年里,Paxos基本成为了分布式领域内一致性协议的代名词 。google的粗粒度锁服务Chubby的设计开发者Burrows曾经说过:“所有一致性协议本质上要么是Paxos要么是其变体” 。Paxos的提出者LeslieLamport也因其对分布式系统的杰出理论贡献获得了2013年图灵奖 。
在介绍Paxos之前,先介绍一下数据一致性到底被用在什么场景中,下面以副本状态机来表述
副本状态机在分布式环境下,一致性协议的应用场景一般会采用副本状态机来表达,这是对各种不同应用场景的一种抽象化表述 。
一种典型的实现副本状态机的机制是采用Log副本的方式,如下图(来源网上):

Paxos算法浅析

文章插图
 
集群中多台服务器各自保存一份Log副本及内部状态机,Log内顺序记载客户端发来的操作指令,服务器依次执行Log内的指令并将其体现到内部状态机上,如果保证每台机器内的Log副本内容完全一致,那么对应的状态机也可以保证整体状态一致 。
一致性协议的作用就是保证各个Log副本数据的一致性,上图中的一致性模块就是用来保证一致性的 。
再来看一个更具体的例子:在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态 。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个「一致性算法」以保证每个节点看到的指令一致 。
民主选举算法如何保证各个Log副本数据的一致性(或者说如何来实现这个一致性模块),可能最先想到的是只需要提供一个唯一一致性模块,然后用类似2PC的方式来保证数据的一致性,但是我们也知道了2PC方式中面临着一致性模块的当机以及网络的异常等问题,最终导致数据出现不一致;
而本文要介绍的Paxos一致性协议就是如何在可能发生几起宕机或网络异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致,并且保证不论发生以上任何异常,都不会破坏整个系统的一致性,主要原因还是Paxos提供了集群一致性模块,然后以民主选举的算法——大多数的决定会成个整个集群的统一决定 。任何一个点都可以提出要修改某个数据的提案,是否通过这个提案取决于这个集群中是否有超过半数的结点同意(所以Paxos算法需要集群中的结点是单数);
当然这个保证是有一个前提的,这就是下面要介绍的拜占庭问题 。
拜占庭问题其故事背景是这样的:拜占庭位于现在土耳其的伊斯坦布尔,是东罗马帝国的首都 。由于当时拜占庭罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信差传消息 。在战争的时候,拜占庭军队内所有将军必需达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营 。但是,军队可能有叛徒和敌军间谍,这些叛徒将军们会扰乱或左右决策的过程 。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,这就是拜占庭将军问题 。
从理论上来说,在分布式计算领域,试图在异步系统和不可靠的通道上来达到一致性是不可能的,因此在对一致性的研究过程中,都往往假设信道是可靠的,即假设不存在拜占庭问题 。
非拜占庭模型定义:
【Paxos算法浅析】1.一致性模块的行为可以以任意速度执行,允许运行失败,在失败后也许会重启并再次运行;
2.一致性模块之间通过异步方式发送信息通信,通信时间可以任意长,信息可能会在传输过程中丢失,也允许重复发送相同的信息,多重信息的顺序可以任意 。但是有一点:信息不允许被篡改 。
Paxos的基本概念首先是并行进程(对应副本状态机上每台服务器的一致性模块)的角色概念,Paxos协议下不同并行进程可能承担的三种角色如下:
倡议者(Proposer):倡议者可以提出提议(数值或操作命令等)以供投票表决;
接受者(Acceptor):接受者可以对倡议者提出的提议进行投票表决,从众多提议中选出唯一确定的一个;
学习者(Learner):学习者无倡议投票权,但是可以从接受者那里获知是哪个提议最终被选中;
在一致性协议框架中,一个并行进程可以同时承担以上多种角色 。


推荐阅读