paxos算法 一致性

一、paxos算法中的三个角色        

       首先将议员的角色分为 proposers,acceptors,和 learners(允许身兼数职)。proposers 提出决议,acceptors 批准决议,learners「学习」决议。划分角色后,就可以更精确的定义问题: 

1. 决议(value)只有在被 proposers 提出后才能批准(未经批准的决议称为「提案(proposal)」); 

2. 在一次 Paxos 算法的执行实例中,只批准一个 Value; 

3. learners 只能获得被批准(chosen)的 Value。

      首先 proposers 将 value 发送给 acceptors,之后 acceptors 对 value 进行批准。为了满足只批准一个 value 的约束,要求经「多数派(majority)」批准的 value 成为正式的决议(称为「通过」决议)


二、paxos的约束条件

约束条件P1和P2:

P1:一个 acceptor 只能批准它接收到的第一个 value。

加强版P1a:当且仅当 acceptor 没有收到编号大于 n 的 prepare 请求时,acceptor 批准编号为 n 的提案。

P2:一旦一个 value 被通过,那么之后通过的 value 必须和这个 value 一样。

P2a:一旦一个 value v 被通过,那么之后任何 acceptor 再批准的 value 必须是 v。

P2b:一旦一个 value v 被通过,那么以后 proposer 提出的新提案必须具有 value v。

加强版P2c:如果一个编号为 n 的提案具有 value v,那么存在一个多数派,要么他们中没有人批准过编号小于 n  的任何提案,要么他们进行的最近一次批准具有 value v。


三、paxos算法描述

        proposer 提出一个提案前,首先要和足以形成多数派的 acceptors 进行通信,获得他们进行的最近一次批准活动的编号(prepare 过程),之后根据回收的信息决定这次提案的 value,形成提案开始投票。当获得多数 acceptors 批准后,提案获得通过,由 proposer 将这个消息告知 learner。这个简略的过程经过进一步细化后就形成了 paxos 算法

通过一个决议分为两个阶段: 

1. prepare 阶段: 

1). proposer 选择一个提案编号 n 并将 prepare 请求发送给 acceptors 中的一个多数派; 

2). acceptor 收到 prepare 消息后,如果提案的编号大于它已经回复的所有 prepare 消息,则 acceptor 将自己上次的批准回复给 proposer,并承诺不再批准小于 n 的提案; 

2. 批准阶段: 

1). 当一个 proposor 收到了多数 acceptors 对 prepare 的回复后,就进入批准阶段。它要向回复 prepare 请求的 acceptors 发送 accept 请求,包括编号 n 和根据 P2c 决定的 value(如果根据 P2c 没有决定 value,那么它可以自由决定 value)。 

2). 在不违背自己向其他 proposer 的承诺的前提下,acceptor 收到 accept 请求后即批准这个请求。

       这个过程在任何时候中断都可以保证正确性。例如如果一个 proposer 发现已经有其他 proposers 提出了编号更高的提案,则有必要中断这个过程。因此为了优化,在上述 prepare 过程中,如果一个 acceptor 发现存在一个更高编号的”草案”,则需要通知proposer,提醒其中断这次提案。

点赞