Paxos算法详解
Paxos提高分布式系统容错性的
一致性算法
。
对于有一组可以提出提案的进程集合,对于一个一致性算法需要满足:
- 在这些被提出的提案中,只有一个会被选定。
- 如果没有提案被提出,那么就不会有被选定的提案。
- 当一个提案被选定之后,进程应该可以获取被选定的提案信息。
- 只有一个值被选定。
- 如果某个进程认为某个提案被选定,那么这个提案必须是真的被选定的那个。
Paxos算法中包含三种角色: Proposer
,Acceptor
, Learner
。一个进程可以充当多个角色。不同参与者之间可以通过收发信息进行通信。
- 每个参与者以任意速度执行,可能会因为出错而停止,也可能会重启。同时即使一个提案被选定之后,所有参与者也都有可能失败或重启,因此除非哪些失败或重启的参与者可以记录某些信息,否则将无法确定最终的值。
- 消息在传输过程中可能出现不可预知的延迟,也可能重复或丢失,但是消息不会被损坏,消息内容不会被篡改。
Paxos推导过程:
- P1:一个Acceptor必须批准它收到的第一个提案。
- 不同Proposer分别提出多个提案,没有一个提案被多数人批准。
- 任意一个Acceptor出现问题
- 在P1的基础上,再加上一个提案被选定需要由半数以上的Acceptor批准的需求暗示着一个Acceptor必须能够批准不止一个提案。提案形式使用 (全局唯一编号, Value), 当Value被半数以上Acceptor批准则代表被选定。
- 不同Proposer分别提出多个提案,没有一个提案被多数人批准。
- P2: 如果(M0, V0)被选定,那么所有比编号的M0更高的,且被选定的提案。其Value也是V0。
- P2a: 如果编号为M0、Value值为V0的提案(即[M0,V0])被选定了,那么所有比编号M0更高的,且被Acceptor批准的提案,其Value值必须也是V0。
- P2b: 如果一个提案[M0,V0]被选定后,那么之后任何Proposer产生的编号更高的提案,其Value值都为Vo.
- P2c: 对于任意的Mn和Vn,如果[Mn,Vn]被提出,那么肯定存在一个由半数以上的Acceptor组成的集合S,满足一下条件中任意一个:
- S中不存在任何批准过编号小于Mn的提案Acceptor。
- 选取S中所有Acceptor批准的编号小于Mn的提案,其中编号最大的那个提案其Value值是Vn.