【好】Paxos以及分布式一致性的学习

Paxos,一言以蔽之,我们需要一种提交协议来确保分布式系统中的全局操作即使是在发生故障的情况下也能保证正确性。

跟拜占庭将军问题是不同的问题,虽然拜占庭也是Lamport提出的。拜占庭里面有叛徒,有坏人,而Paxos里面都是好人,都是期望达成一致的,只是有时候有故障或者有同步问题。要说有联系,那就是Lamport根据拜占庭将军问题的成功,也用了一个古代的例子,就是Paxos岛上的议会的问题来说明分布式一致性的问题。

跟两军问题更加不一样。两军问题强调的是信道的不稳定。虽然衍生出一个三军问题,可以说是Paxos的一个变体,说的就是分布式情况下,怎么达成一致。

后面还有一篇文章:http://www.cnblogs.com/charlesblc/p/6037963.html

————————

开始搜出来这篇文章(link),发现不知所云,先忽略。

然后搜出来这篇文章(link),说是偏向工程实现,建议先看维基(link),但是维基打不开。

所以还是先看知乎的这篇文章吧(https://www.zhihu.com/question/19787937/answer/82340987

Lamport用两段话就描述清楚了它的流程,他老人家也说paxos其实是个简单的算法。但是是我在工程领域见过最为精妙的算法。

分布式一致性是个有趣的领域,而Paxos和类似的协议对这个问题的重要性不喻,在过去的十年,Paxos几乎等价于分布式一致性。
Paxos算法是用来解决一致性问题,首先解释一下何为一致性问题,考虑如下的场景:有一组进程p1,p2.....pn,一个变量v。所谓的一致性问题就是:如何让这组进程就变量v的值达成一致。为了解释何谓达成一致,考虑如下情形:
p1令v=a,p2令v=b,那么显然进程p1和p2就v的值没有达成一致。如果p2令v=a,那么认为p1,p2就v的值达成一致。让各个进程对变量v的值达成一致需要两个过程:
(1)给变量v选择一个值,假设是c
(2)让各个进程都认为v=c,即进行就c达成一致,这时我们认为变量v的值被决定。
 
法定集合:
接着介绍一个性质,称之为法定集合性质。我们将一个超过半数的集合称之为法定集合,比如数字1,2,3,4,5,共5个元素,{1,2,3}有三个元素就是法定集合。
法定集合性质:任意两个法定集合,必定存在一个公共的成员;这个性质是Paxos的基石,如果要回答paxos基于什么原理,那么就是这个。
 
安全性: 
实际上我们不能等所有进程都认为v是同个值,才认为v的值被决定。这样一旦有一个进程挂了,v的值永远就不发被决定。这里我们直接给出v的值被决定的定义:当法定集合的进程 令v为某个相同的值,比如都是c,那么称v的值被决定为c
一旦变量v的值被决定为c,那么不会再有另外一个不为c的值被决定,Paxos通过保证这个性质来解决一致性问题,这也称为安全性。

一致性、活性:

为了让最终总有一个值被决定,一个进程不能只接受一个值,不然只要每个进程都赋予本地v不同的值,比如上面的例子在p1另p2.v=c之前,p2自己令v=e,
由于只能接受一个值,p2拒绝了p1,此时p1.v=c,p2.v=e,p3.v=d且每个进程不再更改v的值,一致性无法达成。对于这种一致性总能达成的要求称之为活性。

看着看着,发现这个人的回答非常逻辑。看不下去了。换一个回答看看:【好】Paxos以及分布式一致性的学习

【好】Paxos以及分布式一致性的学习

【好】Paxos以及分布式一致性的学习

上面那个回答,还有一些图片的例子。。

回到这篇文章:

http://www.cnblogs.com/endsock/p/3480093.html

再举一个例子,zookeeper常常用来做分布式事务锁。Zookeeper所使用的zad协议也是类似paxos协议的。
所有分布式自协商一致性算法都是paxos算法的简化或者变种。Client是使用zookeeper服务的机器,
Zookeeper自身包含了Acceptor, Proposer, Learner。Zookeeper领导选举就是paxos过程,还有Client对Zookeeper写Znode时,也是要进行Paxos过程的,
因为不同Client可能连接不同的Zookeeper服务器来写Znode,到底哪个Client才能写成功?需要依靠Zookeeper的paxos保证一致性,
写成功Znode的Client自然就是被最终接受了,Znode包含了写入Client的IP与端口,其他的Client也可以读取到这个Znode来进行Learner。
也就是说在Zookeeper自身包含了Learner(因为Zookeeper为了保证自身的一致性而会进行领导选举,所以需要有Learner的内部机制,
多个Zookeeper服务器之间需要知道现在谁是领导了),Client端也可以Learner,Learner是广义的。

现在通过一则故事来学习paxos的算法的流程(2阶段提交),有2个Client(老板,老板之间是竞争关系)和3个Acceptor(*官员):

  1. 现在需要对一项议题来进行paxos过程,议题是“A项目我要中标!”,这里的“我”指每个带着他的秘书Proposer的Client老板。
  2. Proposer当然听老板的话了,赶紧带着议题和现金去找Acceptor*官员。
  3. 作为*官员,当然想谁给的钱多就把项目给谁。
  4. Proposer-1小姐带着现金同时找到了Acceptor-1~Acceptor-3官员,1与2号官员分别收取了10比特币,找到第3号官员时,没想到遭到了3号官员的鄙视,3号官员告诉她,Proposer-2给了11比特币。不过没关系,Proposer-1已经得到了1,2两个官员的认可,形成了多数派(如果没有形成多数派,Proposer-1会去银行提款在来找官员们给每人20比特币,这个过程一直重复每次+10比特币,直到多数派的形成),满意的找老板复命去了,但是此时Proposer-2保镖找到了1,2号官员,分别给了他们11比特币,1,2号官员的态度立刻转变,都说Proposer-2的老板懂事,这下子Proposer-2放心了,搞定了3个官员,找老板复命去了,当然这个过程是第一阶段提交,只是官员们初步接受贿赂而已。故事中的比特币是编号,议题是value。

    这个过程保证了在某一时刻,某一个proposer的议题会形成一个多数派进行初步支持;

===============华丽的分割线,第一阶段结束================

 5. 现在进入第二阶段提交,现在proposer-1小姐使用分身术(多线程并发)分了3个自己分别去找3位官员,最先找到了1号官员签合同,遭到了1号官员的鄙视,1号官员告诉他proposer-2先生给了他11比特币,因为上一条规则的性质proposer-1小姐知道proposer-2第一阶段在她之后又形成了多数派(至少有2位官员的赃款被更新了);此时她赶紧去提款准备重新贿赂这3个官员(重新进入第一阶段),每人20比特币。刚给1号官员20比特币, 1号官员很高兴初步接受了议题,还没来得及见到2,3号官员的时候

这时proposer-2先生也使用分身术分别找3位官员(注意这里是proposer-2的第二阶段),被第1号官员拒绝了告诉他收到了20比特币,第2,3号官员顺利签了合同,这时2,3号官员记录client-2老板用了11比特币中标,因为形成了多数派,所以最终接受了Client2老板中标这个议题,对于proposer-2先生已经出色的完成了工作;

这时proposer-1小姐找到了2号官员,官员告诉她合同已经签了,将合同给她看,proposer-1小姐是一个没有什么职业操守的聪明人,觉得跟Client1老板混没什么前途,所以将自己的议题修改为“Client2老板中标”,并且给了2号官员20比特币,这样形成了一个多数派。顺利的再次进入第二阶段。由于此时没有人竞争了,顺利的找3位官员签合同,3位官员看到议题与上次一次的合同是一致的,所以最终接受了,形成了多数派,proposer-1小姐跳槽到Client2老板的公司去了。

===============华丽的分割线,第二阶段结束===============

在最初的第二阶段,议题是先入为主的,谁先占了先机,后面的proposer在第一阶段就会学习到这个议题而修改自己本身的议题,因为这样没职业操守,才能让一致性得到保证,这就是paxos算法的一个过程。

Paxos过程结束了,这样,一致性得到了保证,算法运行到最后所有的proposer都投“client2中标”,所有的acceptor都接受这个议题。

上一篇:Zookeeper学习 & Paxos


下一篇:PL真有意思(三):名字、作用域和约束