Paxos算法
历史
- Paxos( The Part-Time Parliament )共识算法由Leslie Lamport在1989年首次发布,后来由于大多数人不太能接受他的介绍方法,于是在2001年重新写一篇名Paxos算法的简化版,叫Paxos Made Simple。主要讲述两阶段共识协议部分。
- Paxos算法是分布式系统中的一个共识算法家族,也是第一个有完整数学证明的共识算法
- 所有的分布式共识算法都是基于Paxos算法,比如现在比较流行的zab和raft
Basic Paxos
Basic Paxos 是在一轮决策中对一个或多个被提议(propose)的值,最终选出一个值达成共识
Basic Paxos 可以解决的问题
i.选主
ii.资源互斥访问
iii.复制日志的一致性
iv.其它
可以处理的场景:
- 异步网络,网络不稳定,数据可能会丢失、延迟、重复
- 大多数节点还在运行,决策就可以继续运行,允许少量节点宕机
不可以处理的场景:
消息被篡改或伪造
Paxos角色构成
Proposer
处理客户端请求,主动发起提议。
Acceptor
被动接收来自Proposer的提议信息,并且返回投票结果,通知Learner
Learner
被动接收来自Acceptor的信息
Paxos两阶段协议
讲述的是Paxos算法流程,具体的会在Paxos Made Simple一文中讲解到
Paxos实例场景
P1做为Proposer发出序号为1的准备请求给A1,A2。A1,A2接收后发送承诺给P1,承诺不接受比序号1小的请求。P1发送accpet接收请求给A1,A2。accept请求中包含请求序号为1的提案“cat”。A1,A2,A3中超过半数以上节点接收提案后即可视为达成共识,达成后的结果会返回给Learner所有节点。
上图描述的是Paxos算法的多Proposers情况。P1发送,准备请求1给A1,A2。同时P2发送准备请求2给A2,A3。P1的请求后于P2的请求到达A2。此时A2,A3已经达到半数且满足共识要求,共识就算达成,P1由于之前提案没递交成功,会再次发送递序号更大交申请,递交给A1,A2时,由于A2已经达成共识,A2会返回达成共识的accepted结果,P1会根据接收到的结果将提案改成结果再次提交,从而达成共识,保证一致,一致的结果会发送给Learner图中没有指出。
Paxos死锁
由于算法中只承诺了不接受序号比当前承诺小的提案,但是会接收比 承诺过的序号 大的 序号,这样如果在达成共识前,不断地有Proposer节点向Acceptor节点提交准备请求都希望自己可以提交提案就会造成死锁,这也是这个算法的缺陷。
当需要决定多个值时就需要连续执行多次Paxos算法,一般执行一次Paxos算法的过程称作A Paxos Run 或者 A Paxos Instance
关于Paxos Made Simple将在我的Paxos Made Simple这篇文章中进行讲解。