【算法分析】Basic Paxos算法解析

什么是Paxos算法

Paxos算法是莱斯利·兰伯特(Leslie Lamport,2014年图灵奖获得者,目前就职微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一

Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。

Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难

Paxos算法还可以分为Basic Paxos, Multi-Paxos以及变种ZAB和Raft,本文重点解析Basic Paxos算法

 

什么是分布式数据一致性问题

【算法分析】Basic Paxos算法解析
分布式数据一致性问题示意

 

Basic Paxos解决的问题: n个节点的分布式系统收到m个数据请求,最终有且仅有一个数据请求会被所有n个节点接受从而保持分布式系统的数据一致性

【算法分析】Basic Paxos算法解析
Basic Paxos

 

Basic Paxos 算法解析

【算法分析】Basic Paxos算法解析

•第一阶段(查询提案权利)

1) 生成全局唯一且递增的ProposalID n (为了保证Proposal ID唯一和递增性,可采用时间戳+Server ID生成)

2) Proposer向所有Acceptors广播Prepare(n)请求;

3) Acceptor比较n和minProposal,如果n>minProposal,minProposal=n,并且将当前已经接受的提案acceptedProposal和 acceptedValue返回(如果没有则返回null)

4) Proposer接收到过半数回复后,如果发现有acceptedValue返回,将所有回复中acceptedProposal最大的acceptedValue作为本次提案的value,否则可以任意决定本次提案的value

•第二阶段(发出提案请求)

5) Proposer广播Accept (n,value) 到所有节点;

6) Acceptor比较n和minProposal,如果n>=minProposal,则acceptedProposal=minProposal=n,acceptedValue=value,返回;否则,返回minProposal。

6) Proposer接收到过半数请求后,如果发现有返回值result >n,表示有更新的提议,跳转到1);否则value达成一致

 

直接要看懂上面的算法比较困难,用示例来解析Basic Paxos算法如下

存取款示例1–简单的顺序请求

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

存取款示例2–复杂的非顺序请求

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

【算法分析】Basic Paxos算法解析

 

三军问题示例

1.1支红军在山谷里扎营,在周围的山坡上驻扎着3支蓝军

2.红军比任意1支蓝军都要强大;如果1支蓝军单独作战,红军胜;如果2支或以上蓝军同时进攻,蓝军胜

3.三支蓝军需要同步他们的进攻时间;但他们惟一的通信媒介是派通信兵步行进入山谷,在那里他们可能被俘虏,从而将信息丢失;或者为了避免被俘虏,可能在山谷停留很长时间

4.每支蓝军的参谋负责提议进攻时间;每支蓝军需要将军批准参谋提出的进攻时间;很明显,1个参谋提出的进攻时间需要获得至少2个将军的批准才有意义

问题:是否存在一个协议,能够使得2支或以上的蓝军同步他们的进攻时间?

paxos算法抽象该问题的求解:

参谋是Proposer发出提案

将军是Acceptor接受提案并且多个将军达到数据一致性

 

【算法分析】Basic Paxos算法解析

  1. 参谋1查询提案权利,派通信兵带信给3个将军,内容为(编号1)
  2. 3个将军收到参谋1的提议,由于之前还没有保存任何编号,因此把(编号1)保存下来,避免遗忘;同时让通信兵带信回去
  3. 参谋1收到至少2个将军的回复,再次派通信兵带信给3个将军,内容为(编号1,进攻时间1)
  4. 3个将军收到参谋1的进攻方案,Accept (编号1,进攻时间1),避免遗忘;同时让通信兵带信回去
  5. 参谋1收到至少2个将军的确认信息,确认进攻时间已经被2个以上军队接收
  6. 参谋2查询提案权利,派通信兵带信给3个将军,内容为(编号2)
  7. 3个将军收到参谋2的提议,由于(编号2)比(编号1)大,因此把(编号2)保存下来,避免遗忘;又由于之前已经接受参谋1的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1)
  8. 参谋2收到至少2个将军的回复,由于回复中带来了已接受的参谋1的提议内容,参谋2确认已经满足2支以上蓝军同步了进攻时间,因此不再提出新的进攻时间

 

【算法分析】Basic Paxos算法解析

  1. 参谋1发起提议,派通信兵带信给3个将军,内容为(编号1)
  2. 3个将军的情况:将军1和将军2收到参谋1的提议,将军1和将军2把(编号1)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去; 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
  3. 参谋2在同一时间也发起了提议,派通信兵带信给3个将军,内容为(编号2)
  4. 3个将军的情况:  将军2和将军3收到参谋2的提议,将军2和将军3把(编号2)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去’ 负责通知将军1的通信兵被抓,因此将军1没收到参谋2的提议; 
  5. 参谋1收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号1,进攻时间1)
  6. 2个将军的情况: 将军1收到了(编号1,进攻时间1),和自己保存的编号相同,因此把(编号1,进攻时间1)保存下来;同时让通信兵带信回去; 将军2收到了(编号1,进攻时间1),由于(编号1)小于已经保存的(编号2),因此让通信兵带信回去
  7. 参谋2收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号2,进攻时间2)
  8. 2个将军的情况: 将军2收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去;  将军3收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去
  9. 参谋2收到至少2个将军的确认回复,确认进攻时间已经被2支以上蓝军接受
  10. 参谋1只收到了1个将军的确认,同时收到一个Reject所以参谋1重新发起提议,派通信兵带信给3个将军
  11. 3个将军的情况:  将军1收到参谋1的提议,由于(编号3)大于之前保存的(编号1),因此把(编号3)保存下来;由于将军1已经接受参谋1前一次的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1);将军2收到参谋1的提议,由于(编号3)大于之前保存的(编号2),因此把(编号3)保存下来;由于将军2已经接受参谋2的提议,因此让通信兵带信回去,内容为(编号2,进攻时间2); 负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
  12. 参谋1收到了至少2个将军的回复,比较两个回复的编号大小,选择大编号对应的进攻时间作为最新的提议;参谋1再次派通信兵带信给有答复的2个将军,内容为(编号3,进攻时间2)
  13. 2个将军的情况: 将军1收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,;   将军2收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去
  14. 参谋1收到了至少2个将军的确认信息,确认进攻时间已经被2支以上蓝军接受