Paxos分布一致性算法简介(从零开始学区块链 39)
Posted 区块链大师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Paxos分布一致性算法简介(从零开始学区块链 39)相关的知识,希望对你有一定的参考价值。
Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院) 于1990年提出的一种基于消息传递的一致性算法。
为何以一个希腊小岛名字算法?Lamport这样解释道:
I thought, and still think, that Paxos is an important algorithm. Inspired by my success at popularizing the consensus problem by describing it with Byzantine generals, I decided to cast the algorithm in terms of a parliament on an ancient Greek island. Leo Guibas suggested the name Paxos for the island.
为描述 Paxos 算法,Lamport 虚拟了一个叫做 Paxos 的希腊城邦,这个岛按照议会民主制的政治模式制订法律,但是没有人愿意将自己的全部时间和精力放在这种事情上。所以无论是议员,议长或者传递纸条的服务员 都不能承诺别人需要时一定会出现,也无法承诺批准决议或者传递消息的时间。但是这里假设没有拜占庭将军问题(Byzantine failure,即虽然有可能一个消息被传递了两次,但是绝对不会出现错误的消息);只要等待足够的时间,消息就会被传到。另外,Paxos 岛上的议员是不会反对其他议员提出的决议的
由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到TOCS上。即 便如此paxos算法还是没有得到重视,2001年Lamport用可读性比较强的叙述性语言给出算法描述。可见Lamport对paxos算法情 有独钟。近几年paxos算法的普遍使用也证明它在分布式一致性算法中的重要地位。06年google的三篇论文初现“云”的端倪,其中的chubby锁 服务使用paxos作为chubby cell中的一致性算法,paxos的人气从此一路狂飙。
Paxos 算法是分布式一致性算法用来解决一个分布式系统如何就某个值(决议)达成一致的问题。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态 一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个"一致性 算法"以保证每个节点看到的指令一致。这里想提一下一些中文的paxos算法理解的文章中用分布式系统竞争锁的场景作例子介绍paxos算法的过程,就我 个人感觉不是很合适,因为paxos算法是一个较高效的一致性算法,和传统的分布式锁算法还是不太一样的,比如RA算法,它和单机上的加锁解锁有一个最大 的共同点就是有很明显的“请求--等待”的过程,而paxos算法每一个实例之间相对独立,选举过程可以平行执行,后发生的实例是可以再先发生的实例之前 表决的,并没有明显的“请求--等待”的感觉。在具体的应用时,分布式锁算法更多的是“互斥”的感觉,一致性算法更多的是“同步”的感觉。
chubby中有paxos的具体实现可惜看不到代码,表现形式也不确定,可能是以库的形式提供也可能散布在程序的很多地方。现在手里能拿到的一个是 sourceforge上的开源库libpaxos,作者是一位意大利的帅小伙Marco。和Marco交流后发现他对paxos的理解确实挺深的。虽然 libpaxos现在还没得到商用,但感觉还是挺有前途的;另一个实现是在北大天网实验室的类chubby实现---debby,是使用ICE现实的,看 过之后总觉得有些不太通顺的地方,似乎代码的实现并没有严格遵循paxos算法;还有一个是Diskless Paxos的实现,不使用disk保存状态怎么实现各个角色的“可重启”呢?还没时间研究,应该还是挺有意思的;除了这些,在google code上有paxos的java实现,BerkeleyDB的复制也有使用了paxos算法。在本系列的后续文章中将重点介绍对其中一些实现的理解,以 及给libpaxos做跨windows平台移植遇到的问题。
Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。一个典型的场景是,在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行"一致性算法"以保证每个节点看到的指令一致。节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing)。Paxos 算法就是一种基于消息传递模型的一致性算法。
场景一:C/S模式的冗余备份的系统
C={C1,C2,C3,........,Cn}代表n个客户端,S={S1,S2,S3,........,Sm}代表m个服务器。在这样的冗余系统中要完成这样的任务:让任何一个Cx提出的请求(提交的数据),能在这m个服务器上都执行(保存)一遍,最终所有的服务器达到一个一致的状态(也就是说每个server相当于一个“replica”,而外部看来似乎只有一个server提够服务,这样设计主要是为了容灾考虑)。这时问题就产生了,由于client与server、server与server之间是用网络连接的,则由网络协议带来的不可靠、不确定性将会影响这m个server到达一个一致状态。
例如:C1、C2先后提出请求,C1要求更新value1,C2要求删除value1。由于网络的不确定,这两个请求到达server的顺序可能是S1(requestC1,requestC2),S2(requestC2、requestC1).....等等,使得操作序列在m个服务器可能各不相同,如果S中的每一个server执行了不同的合法操作序列,将会导致整个系统的不一致问题,所以一致性算法的任务就是保证S中每个处于正常工作的server都将执行一个相同的操作序列,如(requestC1、requestC2)。
C/S模式的冗余备份 系统常常有两种形式:
每一个client和所有的server连接
所有的client和一个server连接(相当于server中的leader),再由这个leader与其他冗余server连接。
不管是那种形式都会受到网络不确定性的影响从而产生操作序列不一致问题。
场景二:系统中各节点是对等关系
在典型的区块链网络中,各个节点是对等的,互为client/server,当一节点发生改变时,其他所有节点也要发生相同的改变。比如在ATC(空中交通管制系统)中有五台供管制员使用的席位(即五台主机),在实际应用中会遇到这样的情况:管制员G1在席位1对参数value1做相应的操作,而几乎同时管制员G2在席位2上也对value1做操作。由于网络传输的不确定性可能会导致这五台主机最终的显示结果不尽相同,产生不一致性的问题。paxos算法就是用来解决这类问题。
Paxos算法利用Majority机制的投票形式保证2F+1的容错能力,即2F+1个结点的系统最多允许F个结点同时出现故障。使得各角色之间的结构、联系比较松散,加之很弱的先决条件,让paxos算法在实际工程中易于实现。使用单增的实例id来标识决议的方式,使得整个算法的并行性更好(id号大的决议可以先于id号小的决议被批准,不会影响决议序列的顺序)。总得来说paxos算法是很巧妙的,Lamport严谨的证明也保证了算法的正确性。在Basic paxos算法基础上发展而来的fastpaxos只用两次消息传递就能通过一个value,比传统的一致性算法减少了一次消息传递。这几年,paxos算法的广泛使用很好的证明了算法的价值。
长按关注,了解更多
以上是关于Paxos分布一致性算法简介(从零开始学区块链 39)的主要内容,如果未能解决你的问题,请参考以下文章