Paxos算法

分布式系统的核心问题是数据一致性,解决一致性有很多算法,而 Paxos 算法

无疑是最著名的,Google 工程师曾说,所有一致性算法都可以归结为 Paxos 算法

的一个特列。可见,很有必要学习 Paxos 算法。

 

Paxos 算法是由 Lamport 提出来的,他得论文 Paxos made simple 是最好的

学习资料。我在阅读的过程中遇到很多困难,文中的一些逻辑推论隐藏得比较深,

需要反复研读,这里对算法的描述就不写了,只是记录一些个人的理解。

 

论文首先指出一致性最核心的要求是,Only a single value is chosen,就是说,

协商的结果,最终只能确定一个值,不能选多个值。后面的一些条例都是为了满足

这个要求。

 

我们规定,每个 acceptor 最多只能 accept  一个 value,如果存在一个 acceptor

的多数派,其中每个 acceptor 都 accept 了同一个 value 时,该 value就能被 chosen ,

这里多数派,我的理解是超过一半的 acceptor。所以说,一个 value 要想被 chosen,必须有超过一半

的 acceptor 支持(accept)它。由于每个 acceptor 最多只能投一票,因此不可能存在两个 value

它们的支持率均超过 50%,最终只能有一个 value 获胜。这就保证了 Only a single value is chosen.

 

一致性问题产生的原因是多个 proposer 可能提出各种不同的 value,导致系统不知道选择哪个 value,

有一个特例,如果只有一个 proposer 提出 value,显然就不存在一致性问题,这个时候,必须选择这个

唯一的 value。考虑只有一个 proposer 提出 value的情况,该 proposer 向所有 acceptor 发出 proposal,

由于没有其他的 proposal,所以每个 acceptor 会而且只会收到唯一的 proposal,如前所说,这个 proposal

理应被 chosen,但是要想它被chosen,就要求多数派的 acceptor 都支持(accept)此 proposal。于是有了准则 P1:

 

P1. An acceptor must accept the first proposal that it receives.

 

说的是,对于第一个 receive 到的 proposal, acceptor 必须无条件 accept。

有了这个准则,就可以保证形成一个多数派的 acceptor 来支持这个唯一的 proposal。于是在只有一个

proposer 提出 value 时,该 value 必将被 chosen。

 

准则 P1 只是为了满足上面提到的特列,即只有一个 proposer 的时候,而如果有多个 proposer,准则 P1 就

不一定能保证一致性了。考虑两个 proposer 分别提出 value1 和 value2,如果 value1 和 value2 各得到

一半的 acceptor 支持,这样两者都不能形成一个多数派,就无法确定获胜者了。

 

为了形成多数派,解决的办法是允许 acceptor 投多张票,即让 acceptor 可以同时支持多个 proposal。

但这样又会产生一个问题,可能两个proposal 都形成了多数派,比如 proposal1 获得超过一半的 acceptor 支

持,proposal2也获得了超过一半的 acceptor 支持,那到底选哪个 proposal 呢,其实我们的要求是确定一个

value 出来,只要 proposal1 和proposal2都具有相同的 value,就能保证 only a single value is chosen。

 

所以我们允许多个 proposal 被 chosen,即多个 proposal 同时获得超过一半 acceptor 的支持,但是要求

这些 proposal 都具有相同的 value。 如何保证这点呢,看准则 P2

 

P2. If a proposal with value v is chosen, then every higher-numbered proposal that is chosen

      has value v

 

为了区分 proposal,我们给每个 proposal 一个唯一的编号,这样 proposal 由编号和 value 组成,可简单表示

为 <n, value>,其中 n 就是编号。

 

准则 P2 说的是,如果 <n, v> 被 chosen,则要求其他被 chosen 的,而且编号比 n 大的 proposal 的 value

也是 v。比如这几个proposal <n, v>, <n1, v1>, <n2, v2>, <n3, v3> 都被 chosen,而且有 n < n1 < n2 < n3。

根据准则P2, <n, v> 被 chosen,要求 v1 == v, v2 == v, v3 == v。 于是保证了所有被 chosen 的 proposal

的 value 都是 v。

 

准则 P2 是对 chosen 的结果做要求,为了得到这样的结果,我们需要在算法运行过程中对 acceptor 做要求。

于是有了准则 P2a,P2a 蕴含着 P2

 

P2a. If a proposal with value v is chosen, then every higher-numbered proposal accepted

        by any acceptor has value v.

 

说的是,如果 <n, v> 被 chosen,则要求任何被 acceptor 支持(accept)的,而且编号比 n 大的 proposal

的 value 也是 v。 这一条准则保证了所有 acceptor 支持的 proposal 都具有相同的 value。进而所有被 chosen

的 proposal 具有相同的 value,所以说,P2a 蕴含 P2。

 

准则 P2a 有一个漏洞,假设 <n, v> 被 chosen,说明 <n, v> 得到了大多数 acceptor 的支持,但由于网络原因,

可能某个 acceptor a,没有收到任何 proposal,网络恢复的时候,恰好 a 收到一个编号更高的 proposal <m, v1>,

其中 m > n, v1 与 v 不相同,根据准则 P1, a 必须支持 <m, v1>,而 <m, v1> 与 <n, v> 的 value 是不相同的,

这就违反了 P2a。所以 P1 和 P2a 不能很好的配合,我们需要寻找一个更合适的准则来与 P1 配合,共同保证一致性。

于是出现准则 P2b。

 

P2b. If a proposal with value v is chosen, then every higher-numbered proposal issued by

        any proposer has value v.

 

说的是,如果 <n, v> 被 chosen, 则要求任何 proposer 提出的,编号比 n 大的 proposal 的 value 也是 v。

这一条准则要求所有 proposer 提出的 proposal 都具有相同的 value。

 

准则 P2b 非常严格,因为它从源头上要求各个 proposal 具有相同的 value。但是做到这点不容易,必须对

proposer 做严格要求,绝不允许proposer 随意提出 proposal, proposer 提出一个 proposal前,得先看看该

proposal 是否满足条件,如果不满足,则不允许 proposer 提出 proposal。于是出现了准则 P2c:

 

P2c. For any v and n, if a proposal with value v and number n is issued, then there is a

       set S consisting of a majority of acceptors such that either (a) no acceptor in S has

       accepted any proposal numbered less than n, or (b) v is the value of the highest-numbered

       proposal among all proposals numbered less than n accepted by acceptors in S.

 

P2c 说明了在何种条件下,proposer 才能提出 proposal <n, v>。只要满足两个条件中的任意一个,就可以提出

proposal。

 

条件1说的是, 如果大多数 acceptor 都没有 accept 过任何 proposal,根据 P1, 也可以理解为

大多数 acceptor 都没有 receive 到任何 proposal,就允许该 proposal 提出,而且 proposal 的值

可以是任意的。比如一个多数派 acceptor,其中每个 acceptor 都没有 receive 到 proposal,这个时候

proposer 把 <n, v> 发送给多数派 acceptor,根据 P1,多数派中每个 acceptor 都无条件 accept 此 proposal。

然后 <n, v> 被 chosen,满足一致性的要求:Only a single value is chosen。

 

条件2说的是,先取得大多数 acceptor accept过的,编号最大的 proposal 的 value,记为 v1,

如果 v 和 v1 相同,就允许该 proposal 提出。

 

P2C 可以保证一致性,可以用递推证明,P2C 的两个条件恰好对应证明过程的初始状态和递推状态:

最开始,所有 acceptor 都没有 accept 过任何 proposal,根据 P2C的条件1,proposer 可以

提出任何 proposal <n, v>, 而且都会被 chosen。然后另一个 proposer 也想提出 proposal <n1, v1>,

由于这个时候不满足条件1,我们看能否满足条件2,先取得大多数 acceptor accept 过的,编号最大的

proposal,即为 <n, v>,然后看 v1 和 v 是否相等,如果相等,就可以提出 <n1, v1>。当 <n1, v1> 被

chosen 后,Since v1 is equal to v, The chosen value is still v. 同理后续提出的 proposal 的 value

都是 v,最后算法完成,The chosen value is v, 保证了 Only a single value is chosen。

 

你可能感兴趣的:(算法)