[置顶] Paxos算法与Fischer-Lynch-Paterson结论

Fischer-Lynch-Paterson结论,是Michael J. Fischer , Nancy A. Lynch , Michael S. Paterson在论文Impossibility of distributed consensus with one faulty process证明的一个结论,称得上是分布式理论中最为深刻的结论,大致表述如下:


在一个多进程异步系统中,只要有一个进程不可靠,那么就不存在一个协议,此协议能保证有限时间内使所有进程达成一致(consensus)。


首先,什么是“异步系统”?进程间是完全隔离的,只能用消息传递通信,进程完好运行时,能够保证它send的消息在有限时间内到达对方,但是,这个“有限的时间”无法给出上界,同时进程运行速率也可以任意低。与此对应,有消息传输时间上界和进程每一步执行时间上界的系统,称之为“同步系统”。


其次,什么叫“达成一致”?简单的定义如下,每个进程给定一个输入值,每个进程都不知道对方的值,现在每个进程按照规定的协议运行,可以收发消息,最终所有进程产生一个输出值(挂掉的进程除外),值必须一致,同时输出值必须是所有进程输入值其中之一,那么就达成一致。


我们希望找到一个协议,能够保证在有限时间内使得最终活着的进程达成一致,但是,FLP结论指出,即使只有其中一个进程可能出问题(出问题的可能是任意一个进程,但总共只有一个出问题),这个协议也是不存在的。


这里并不准备复述一遍原论文抽象的证明,只想通过简单的例子,来让大家感性的认识一下这个结论。


考虑最简单的情况,两个进程,输入值分别为a,b,怎么达成一致呢?很容易想到,让两个进程发送自己的值给对方,收到对方值后,和自己的值对比,选个小的值输出,就达成一致了。如果两个进程保证都不出问题,这个做法可以保证在有限时间内达成一致。但是,如果它们之一可能挂掉的话,另一个进程就陷入两难的境地,是要一直等到接收到对方的值呢,还是认为对方挂掉,直接输出自己的值?关键在于消息传递的时间虽然“有限”,却不能给出一个“上界”,这样进程不论等了多久,都不能放弃等待,而无限的等下去,又可能因为对方挂掉,使得永远不能达成协议。若放弃等待,那么就可能使输出的值不一致。


下面考虑一下Paxos算法,假设三个进程,输入值分别为a,b,c,每个进程都同时运行Proposor,Acceptor,Learner角色,看上去,似乎只要挂掉的进程不超过1个,就不影响最终达成一致了。但是,多个Proposor,可能形成活锁,即,假设进程A Paxos阶段2提交时由于进程B Paxos阶段1提出新的Proposal而失败,导致A提交新的Proposal,这又可能导致进程B运行到Paxos阶段2失败,这样可以无限的循环下去,虽然概率很小。


要避免活锁,那么只能有唯一的Proposor,但是,每一个进程都有可能挂掉,关键在于如何保证运行Proposor的进程挂掉之后,另一个进程如何检测到并再启动一个Proposor。容易看出,没有方法能够保证在任意情况下做到这一点。由于消息传递时间可以任意大,另两个进程通过有限的时间等待无法判断运行Proposor的进程是挂掉了,还是消息还未发送到。如果无限的等下去,那么Proposor真的挂掉的话,算法也就永远停滞了,如果等待一段时间后不等了,再开个Proposor,在原始Proposor没挂的情况下,就出现了两个Proposor,这时照样出现了活锁。


由此可以看出,Paxos算法,一样是遵循Fischer-Lynch-Paterson结论的,也就是说,在理论上定义的“异步系统”中,Paxos算法可能无限的运行下去永远无法达成一致,虽然这种概率很小。当然,实际的应用中,完全可以给receive消息设定一个超时时间,过了就当做对方机器或网络失败。

你可能感兴趣的:(c,算法,网络)