天天看点

Paxos分析之一—Paxos是什么

has been regarded as difficult to understand, perhaps because the original

presentation was greek to many readers. 我们的重点在前半句,至于要理解后半句,需要了解paxos的产生历史,paxos的历史是计算机历史中最有趣的历史之一,这里就不八卦了,有兴趣的同学可以自行google.

the paxos algorithm for solving consensus is used to implement a fault-tolerant

atomic broadcast.

we used the paxos algorithm (“paxos”) as the base for a framework that implements a fault-tolerant

log.

从这3句描述paxos的句子中可以发现,都共同提到了一个词:fault-tolerant。fault-tolerant就是paxos的核心。通常paxos被用在数据写入多个副本的场景,paxos可以保证在容忍少量节点(n/2)挂掉的情况下仍然可以保证数据最终被成功写入所有副本。假设我们不用paxos,自己来实现副本写入的逻辑,我们同步写所有的副本,当所有副本都返回成功后,再通知用户这条数据写入成功,这种实现可以达到写入多个副本的目的,但是这种方式无法容忍节点挂掉。paxos的核心就是在容忍节点挂掉的情况下,保证数据最终写入所有副本。所以说paxos的核心是fault-tolerant,在任何一个paxos的定义中都没有提到一致性,所以说一致性不是paxos关注的点。(paxos是否保证强一致性这里就不讨论了)

从上面的3句话中我们还能看出2个点,第一个点是paxos解决什么问题:consensus。什么是consensus,有人把它翻译成一致性(也许这就是为什么paxos被有些人误解为"是一种强一致性协议"的原因吧,错误的翻译了这个词),其实不准确,应该翻译成共识。共识也就是说多个进程在分布式的条件下,针对一个值达成共识。后面会再解释consensus。

第二个点就是paxos可以用来实现atomic broadcast,或者log(也可以说状态机)。后面也会再解释atomic broadcast和状态机。

总结一下paxos是什么:

接下来,说一下paxos具体是什么?leslie lamport的论文中的paxos协议由2个部分组成,一个是basic paxos,一个是multi paxos。协议中定义了4中角色:client, proposer, acceptor, learner 。这里要特别指出的是learner。了解zookeeper的人都知道,zookeeper所使用的zab协议和paxos类似(有人说zab是paxos的变种,个人觉得2者差别很大)。zookeeper中有3种角色,leader,follower,observer,在zookeeper中observer角色其实是可用可无,但是在paxos中learner角色是必须的。个人曾经受上面说法的影响,认为learner类似oberserver的所起的功能,导致很长时间无法正确理解paxos协议的细节。

basic paxos是一种consensus算法。consensus像上面所说的是用来让多个进程针对一个值达成共识的,而且这个共识一旦达成就不可更改。这里我们先不展开说明达成共识是怎样的一个过程。我们这里假设你已经理解了这个过程。这个过程可以单独再写篇文章来分析。这个达成共识过程就是atomic broadcast要完成功能。zab其实就是从这个角度出发,将自己叫作原子广播协议(zookeeper atomic broadcast)。

最后再总结一下paxos是什么: