转自:http://www.vpsee.com/2009/09/paxos-algorithm/

Paxos 是分布式计算里非常重要的一个算法,最初由 Leslie Lamport 在1990年发表,题为:The Part-time Parliament,这是一篇很有趣的论文,Lamport 在这篇论文里面把人物(分布式计算领域内的重要科学家)的英文名字用希腊文代替,并且整篇论文站在人类学家的立场、古文明、议会的角度来写导致人们很难理 解这是一篇计算机学术论文,所以论文一直没能被发表,更糟的是,没人能真正理解其中的算法。就这样直到1998年,一个 ACM 的编辑从一堆旧稿中发现这篇论文觉得有点价值才得以发表。不过人们依然抱怨算法太难理解,于是 2001 年 Lamport 写了一篇简单容易理解的 Paxos Made Simple,直到现在还是有大部分人不能完全理解这个算法。Consensus 是分布式计算中的一个经典问题,Paxos 就是用来解决 consensus 问题的其中一种重要的 protocol,类似的 protocol 还有:Castro 和 Liskov 的 PBFT.

问题由来

什么是 consensus (一致性)问题呢?在一个分布式系统中,有一组的 process,每个 process 都可以提出一个 value,consensus 算法就是用来从这些 values 里选定一个最终 value。如果没有 value 被提出来,那么就没有 value 被选中;如果有1个 value 被选中,那么所有的 process 都应该被通知到。

上面问题看上去很好解决,比如用一个 master,所有 process 都向这个 master 提交 value,这个 master 可以根据先到的原则选择最先到达的 value 为最终 value 并通知给所有 process。这里有个问题,如果这个 master 断了、当机、重启、崩溃了怎么办?所以一个好的方法就是选择一组 masters,value 由这一组 masters 共同决定,有点像 ”议会“。为了解决这个问题,大家提出了各种各样的 protocols(协议),其中最有名的就是 Lamport 的 Paxos.

算法

Paxos is a consensus algorithm executed by a set of processes, termed replicas, to agree on a single value in the presence of failures.

在实际的分布式系统中,replicas 面临崩溃、当机、重启,replicas 之间的网络可能会丢包、延迟、瘫痪等各种不可预测的问题,所以 replicas 需要一个可永久保存的日志来记录步骤,以便需要时从灾难中恢复,就像数据库日志那样。一些 replicas 可以提交 value 就一致性问题进行协商,如果大部分 replicas 运行的时间足够长,到最后的结果就是:所有的 replicas 就某个提交的 value 达成一致。Paxos 算法大致可以分为3部分:

  1. 选一个 replicas 出来做 leader;
  2. leader 选一个 value 出来然后通知给所有 replicas 进行协商,replicas 要么接受要么拒绝;
  3. 一旦多数 replicas 接受 leader,consensus(一致性问题)达成,leader 随后抄送给所有 replicas.

要理解上面的算法是怎么工作的可以假设一个最简单的情形,假如只有一个 leader 而且永不崩溃,这时只要多数 replicas 接受并回复 leader,consensus 就可达成,即使少数 replicas 崩溃也没有关系,只要有一个 replica “活着” 就可以收到 consensus value.

现在假设事情稍微变得复杂一点,在实际场合 leader 可能会崩溃,所以如果有多个 leader 的话就不怕其中一个 leader 崩溃了。Paxos 并不要求某时某刻只能存在一个 leader,可以有多个 replicas 成为 leader. 这样一来就会有新问题,多 leader 会选出多个不同的 value 出来给 replicas 协商,怎么办呢?Paxos 引入两条机制来解决这个问题:a) 给每个 leader 按顺序编号;b) 限制 leader 只能选一个 value. 给 leader 编号以后,每个 replica 就能分辨哪个是 current leader 发的 value,哪个是pervious leader 发的 value,replicas 就能在达成 consensus 后拒绝从 old leaders 发来的 value. 每个 replica 都跟踪最新收到的 leader 编号。如果一个 replica 想成为 leader,它生成的 leader 编号必须大于它最新收到的那个 leader 编号,并且告诉给所有的 replicas. 如果多数 replicas 回复并且告知他们跟踪的编号里面没有比这个更高的,那么这个 replica 就成为 leader.

一旦某个 consensus value 达成一致了,Paxos 必须强制未来的新 leader 会依然遵守这个 consensus value,不会出现翻旧账的情况。Paxos 如何做到这点呢?从 replica 发出的通知消息中包含2条信息,一个是最近 value,另一个是 leader 编号,新 leader 会选择从最近 leader 那里得到的 value,因为这个 value 的 leader 编号是所有 replica 发出的消息中最高的。如果通知消息中没有 value,新 leader 就随意选一个 value 然后协商。

想要更深入了解 Paxos 算法还是要看原作者的 The Part-time Parliament 和 Paxos Made Simple.

应用

Keyspace 是 Scalien 公司开发的高可靠 key-value 存储系统,可以参考:Keyspace:高可靠的 Key-Value 存储系统 和 Keyspace Whitepaper.

Chubby 是 Google 开发的一个分布式文件系统,提供分布式锁机制和小文件的存储,可以参考:Paxos Made Live – An Engineering Perspective 和 The Chubby Lock Service for Loosely-Coupled Distributed Systems.