1. paxos简单介绍
Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一。
2. paxos理论总结
2.1、两个操作
1、Proposal Value:提议的值;
2、Proposal Number:提议的编号,可理解为提议版本号,要求不能冲突;
2.2、三个角色
1、Proposer:提议发起者。Proposer 可以有多个,Proposer 提出议案(value)。所谓 value,可以是任何操作,比如“设置某个变量的值为value”。不同的 Proposer 可以提出不同的 value,例如某个Proposer 提议“将变量 X 设置为 1”,另一个 Proposer 提议“将变量 X 设置为 2”,但对同一轮 Paxos过程,最多只有一个 value 被批准。
2、Acceptor:提议接受者。Acceptor 有 N 个,Proposer 提出的 value 必须获得超过半数(N/2+1)的 Acceptor批准后才能通过。Acceptor 之间完全对等独立。这里说明下Acceptor会维护一个信息表记录,(MaxN,AcceptN,AcceptV) MaxN是回复过prepare request的最高Number AcceptN是接受过accept request的最高Number AcceptV是接受过accept request的最高Number对应的Value
3、Learner:提议学习者。上面提到只要超过半数Acceptor通过即可获得通过,那么Learner角色的目的就是把通过的确定性取值同步给其他未确定的Acceptor。
2.3、协议过程
阶段一,准备阶段(prepare阶段)
(a)Proposer选择一个提议编号N,然后向半数以上的Acceptor发送编号为N的prepare request
(b)如果一个Acceptor收到一个编号为N的prepare request,会有以下三种处理场景:
b.1、if MaxN 等于 null,设置MaxN=N,承诺保证不再接受任何编号小于N的request,回应(pok,null,null)
b.2、if N 小于等于 MaxN,回应<pno>
b.3、if N 大于 MaxN,设置MaxN=N,承诺保证不再接受任何编号小于N的request
b.3.1、if AcceptN 等于 null,回应(pok,null,null)
b.3.2、if AcceptN 不等于 null,回应(pok,AcceptN,AcceptV)
阶段二,接受阶段(accept阶段)
(a)Proposer接收到Acceptor对于prepare request的回应
a.1、收到的pok回应未超过半数,重新发起prepare request请求,修改N值
a.2、收到的pok回应超过半数,接下来它将给这些Acceptor发送一个Number为N,Value为V的proposal作为accept request
a.2.1、if 回应全部都是(pok,null,null),任取值作为V,提交
a.2.2、if 回应包括(pok,AcceptN,AcceptV),取最大的AcceptN对应的AcceptV作为V,提交
(b)Acceptor接收到accept request
b.1、if N 小于 MaxN,回应<ano>
b.2、if N 大于等于 MaxN,设置AcceptN=N,AcceptV=V,批准,回应<aok>
阶段三、学习阶段(learn阶段)
1、if 收到的aok回应未超过半数,重新发起prepare request请求,修改N值
2、if 收到的aok回应超过半数,结束,将结果通知给所有的learner
3. 简单举例说明---3军问题
假设的3军问题
1) 1支红军在山谷里扎营,在周围的山坡上驻扎着3支蓝军;
2) 红军比任意1支蓝军都要强大;如果1支蓝军单独作战,红军胜;如果2支或以上蓝军同时进攻,蓝军胜;
3) 三支蓝军需要同步他们的进攻时间;但他们惟一的通信媒介是派通信兵步行进入山谷,在那里他们可能被俘虏,从而将信息丢失;或者为了避免被俘虏,可能在山谷停留很长时间;
4) 每支军队有1个参谋负责提议进攻时间;每支军队也有1个将军批准参谋提出的进攻时间;很明显,1个参谋提出的进攻时间需要获得至少2个将军的批准才有意义;
5) 问题:是否存在一个协议,能够使得蓝军同步他们的进攻时间?
两个参谋先后提议的场景
1) 参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
2) 3个将军收到参谋1的提议,由于之前还没有保存任何编号,因此把(编号1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(pok);
3) 参谋1收到至少2个将军的回复,再次派通信兵带信给3个将军,内容为(编号1,进攻时间1);
4) 3个将军收到参谋1的时间,把(编号1,进攻时间1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(aok);
5) 参谋1收到至少2个将军的(aok)内容,确认进攻时间已经被大家接收;
6) 参谋2发起提议,派通信兵带信给3个将军,内容为(编号2);
7) 3个将军收到参谋2的提议,由于(编号2)比(编号1)大,因此把(编号2)保存下来,避免遗忘;又由于之前已经接受参谋1的提议,因此让通信兵带信回去,内容为(pok,编号1,进攻时间1);
8) 参谋2收到至少2个将军的回复,由于回复中带来了已接受的参谋1的提议内容,参谋2因此不再提出新的进攻时间,接受参谋1提出的时间;
两个参谋交叉提议的场景
1) 参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
2) 3个将军的情况如下
a) 将军1和将军2收到参谋1的提议,将军1和将军2把(编号1)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(pok);
b) 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
3) 参谋2在同一时间也发起了提议,派通信兵带信给3个将军,内容为(编号2);
4) 3个将军的情况如下
a) 将军2和将军3收到参谋2的提议,将军2和将军3把(编号2)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(pok);
b) 负责通知将军1的通信兵被抓,因此将军1没收到参谋2的提议;
5) 参谋1收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号1,进攻时间1);
6) 2个将军的情况如下
a) 将军1收到了(编号1,进攻时间1),和自己保存的编号相同,因此把(编号1,进攻时间1)保存下来;同时让通信兵带信回去,内容为(aok);
b) 将军2收到了(编号1,进攻时间1),由于(编号1)小于已经保存的(编号2),因此让通信兵带信回去,内容为(ano);
7) 参谋2收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号2,进攻时间2);
8)2个将军的情况如下
a)将军2收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去,内容为(aok);
b)将军3收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去,内容为(aok);
9) 参谋2收到至少2个将军的(aok)内容,确认进攻时间已经被多数派接受;
10) 参谋1只收到了1个将军的(aok)内容,同时收到一个(ano);参谋1重新发起提议,派通信兵带信给3个将军,内容为(编号3);
11) 3个将军的情况如下
a) 将军1收到参谋1的提议,由于(编号3)大于之前保存的(编号1),因此把(编号3)保存下来;由于将军1已经接受参谋1前一次的提议,因此让通信兵带信回去,内容为(pok,编号1,进攻时间1);
b) 将军2收到参谋1的提议,由于(编号3)大于之前保存的(编号2),因此把(编号3)保存下来;由于将军2已经接受参谋2的提议,因此让通信兵带信回去,内容为(pok,编号2,进攻时间2);
c) 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
12) 参谋1收到了至少2个将军的回复,比较两个回复的编号大小,选择大编号对应的进攻时间作为最新的提议;参谋1再次派通信兵带信给有答复的2个将军,内容为(编号3,进攻时间2);
13)2个将军的情况如下
a)将军1收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,内容为(aok);
b)将军2收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,内容为(aok);
14) 参谋1收到了至少2个将军的(aok)内容,确认进攻时间已经被多数派接受;
参考的文档:3军问题,https://www.cnblogs.com/charlesblc/p/6037963.html
参考的文档:《Paxos Made Simple》翻译,https://www.cnblogs.com/YaoDD/p/6150498.html
参看的文档:Paxos Made Simple》英文原版PDF版本,https://www.microsoft.com/en-us/research/uploads/prod/2016/12/paxos-simple-Copy.pdf