Paxos学习笔记

最早发表的《The Part-Time Parliament》历史有点久远了,先略过不读。

一、《Paxos Made Simple》

这是Lamport 2001年写的基本上是《The Part-Time Parliament》的简化版本。Lamport在文中强调的是Paxos的两阶段执行过程(准备阶段和接受阶段),最后的Phase 3没有被当作独立的阶段(但文章用独立章节2.3介绍了Phase3即学习阶段)。 

Paxos问题描述

为了方便描述和分析这个问题,做了如下定义

决议(Valule):要解决的问题,这里定义为选择一个决议(Valule)

议案(Proposal):任何进程对这个的一个提议,我们叫做一个议案

三种角色:提议者Proposer(提出一个议案),批准者Acceptor(同意这个议案),学习者Learner(获知结果)。一个进程可以同时兼任这几个角色。

对结果的限制

只有被提出过的值可以被选择

只有一个值可以被选择

一个进程不会知道一个值被选择了,除非这个值真的被选择了(也就是没有错误信息)。

总体而言,问题的目标是保证,如果有一些值被提议了,那最终会有一个值会被选择通过,如果一个值被选择通过了,任一进程最终都会得知这个结果。值得注意的是,在这里,最终哪个值被选择了不重要(显然如果每个进程都坚持自己的议案,那永远不能达成一致),重要的是有一个值最终被选择了。

实现过程

个人觉得分为3阶段可方便理解。参考Adrian Colyer的博客笔记https://blog.acolyer.org/2015/03/04/paxos-made-simple/

准备阶段

1.提议者选择提议数Ñ并发送一个准备与号码请求Ñ到多数派。

2.如果接受者收到编号为n的准备请求,其中n大于其已经响应的任何准备请求,则其响应承诺不再接受编号小于n的任何提议,并且编号最高的提议(如果有的话)它已经接受了。(因此,接受者需要保持他们已接受的最高编号提议的可靠状态)

 

接受阶段
前提条件:提议者已收到对其大多数接受者编号为n的准备请求的答复。
1. 该提议发送一个接受用于建议消息(NV) ,其中,v是最高编号接受的建议的之间的承诺响应的建议值,或任何值,如果被返回之前没有接受提议者选择。
2. 如果接受者收到编号为n的提案的接受消息,则它接受提议,除非它已经响应了值大于n的准备请求。(若干提案可能同时传播)。

 

学习阶段

我们说有三个角色:提议者,接受者和学习者。一个学习者是有人需要去发现最终由多数派

的建议实际上是。(请记住,这些角色通常组合在一个代理中)。

一个不可靠的模型,是有一个或多个提名的“杰出学习者”接受者发送他们的接受通知,然后这些模型广播给其他学习者。

 

 

 

 

二、深入浅出理解Paxos算法

https://blog.csdn.net/21aspnet/article/details/50700123

事件发展:

 

第一个框代表第一阶段--提议

1.p2最先找到A2,P2提议序号是2,A2记录下,因为之前没有其他的序号所以成功了,然后返回标志给p2;

2.p1找到A1,P1提议序号是1,A1记录下,因为之前没有其他的序号所以成功了,然后返回标志给p1;

3.p1找到A3,P1提议序号是1,A3记录下,因为之前没有其他的序号所以成功了,然后返回标志给p1;

问题来了

4.p1找到A2,P1提议序号是1,A2已经记录下提议序号2,2>1,所以不成功;

5.p2找到A1,P2提议序号是2,A1已经记录下提议序号1,1>2,所以成功;,然后返回标志给p2;

6.p2找到A3,P2提议序号是2,A3已经记录下提议序号1,1>2,所以成功;,然后返回标志给p2;

第二个框代表第二阶段--确认提议(投票)

7.p1找到A1,P1确认序号是1,A1已经记录下提议序号2,1<2,所以不确认,然后p1继续提议序号是3,周而复始...;

8.p2找到A2,P2确认序号是2,A2已经记录下提议序号2,2=2,所以确认成功;,然后返回投票标志给p2;

9.p2找到A3,P2确认序号是2,A3已经记录下提议序号2,2=2,所以确认成功;,然后返回投票标志给p2;

10.p2找到A1,P2确认序号是2,A1已经记录下提议序号3,2<3,所以不确认,;然后p2继续提议序号是4,周而复始...;

问题来了

11.p1找到A2,P1确认序号是1,A1已经记录下确认序号2,1<2,所以不确认,然后返回确认序号2;

12.p1找到A3,P1确认序号是1,A3已经记录下确认序号2,1<2,所以不确认,然后返回确认序号2;

13.p1和p2都得到确认也就是投票结果是2。

14.所有的Learner最终学习的目标是2。

 

1) 参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);

2) 3个将军的情况如下

a) 将军1和将军2收到参谋1的提议,将军1和将军2把(编号1)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok);

b) 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;

3) 参谋2在同一时间也发起了提议,派通信兵带信给3个将军,内容为(编号2);

4) 3个将军的情况如下

a) 将军2和将军3收到参谋2的提议,将军2和将军3把(编号2)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok);

b) 负责通知将军1的通信兵被抓,因此将军1没收到参谋2的提议;

5) 参谋1收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号1,进攻时间1);

6) 2个将军的情况如下

a) 将军1收到了(编号1,进攻时间1),和自己保存的编号相同,因此把(编号1,进攻时间1)保存下来;同时让通信兵带信回去,内容为(Accepted);

b) 将军2收到了(编号1,进攻时间1),由于(编号1)小于已经保存的(编号2),因此让通信兵带信回去,内容为(Rejected,编号2);

7) 参谋2收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号2,进攻时间2);

8) 将军2和将军3收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去,内容为(Accepted);

9) 参谋2收到至少2个将军的(Accepted)内容,确认进攻时间已经被多数派接受;

10) 参谋1只收到了1个将军的(Accepted)内容,同时收到一个(Rejected,编号2);参谋1重新发起提议,派通信兵带信给3个将军,内容为(编号3);

11) 3个将军的情况如下

a) 将军1收到参谋1的提议,由于(编号3)大于之前保存的(编号1),因此把(编号3)保存下来;由于将军1已经接受参谋1前一次的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1);

b) 将军2收到参谋1的提议,由于(编号3)大于之前保存的(编号2),因此把(编号3)保存下来;由于将军2已经接受参谋2的提议,因此让通信兵带信回去,内容为(编号2,进攻时间2);

c) 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;

12) 参谋1收到了至少2个将军的回复,比较两个回复的编号大小,选择大编号对应的进攻时间作为最新的提议;参谋1再次派通信兵带信给有答复的2个将军,内容为(编号3,进攻时间2);

13) 将军1和将军2收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,内容为(Accepted);

14) 参谋1收到了至少2个将军的(accepted)内容,确认进攻时间已经被多数派接受;

三、《Paxos Made Live》

通过谷歌工程师视角描述的Paxos的实际应用

posted @ 2018-11-07 10:21  cmxss  阅读(254)  评论(0编辑  收藏  举报