【算法分析】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解决的问题: n个节点的分布式系统收到m个数据请求,最终有且仅有一个数据请求会被所有n个节点接受从而保持分布式系统的数据一致性

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–简单的顺序请求

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

三军问题示例

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

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

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

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

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

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

参谋是Proposer发出提案

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

 

  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支以上蓝军同步了进攻时间,因此不再提出新的进攻时间

 

  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支以上蓝军接受
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值