参考资料
[1] Lamport 自己的描述: http://lamport.azurewebsites.net/pubs/pubs.html#lamport-paxos
[2] The Part-Time Parliament: https://lamport.azurewebsites.net/pubs/lamport-paxos.pdf
[3] Paxos Made Simple: https://lamport.azurewebsites.net/pubs/paxos-simple.pdf
[4] 视频: https://www.youtube.com/watch?v=JEpsBg0AO6o
[5] Time, Clocks and the Ordering of Events in a Distributed System: http://lamport.azurewebsites.net/pubs/time-clocks.pdf
[6] Paxos算法详解
[7] 图解超难理解的 Paxos 算法
背景
- 1989年,Leslie Lamport在工作论文The part-time parliament中提出Paxos 算法, 由于文章采用了讲故事的叙事风格且内容过于艰深晦涩,直到1998 年才通过评审,发表在ACM transactions on computer systems 期刊上.
Leslie Lamport. The part-time parliament[J]. ACM Transactions on Computer Systems (TOCS),1998,16(2).
- 朴实版本Paxos Made Simple
- Paxos特点是难……
说明
- 解决问题: 分布式一致性问题,一个分布式系统中的各个进程如何就某个值达成一致
- 运行环境:允许宕机故障的异步系统中,可容忍消息不可靠、丢失等
N
个节点的系统最多允许(N-1)/2
个节点故障
术语
Proposal Value
提案的值Proposal ID
提案编号Proposal
提案 = 提案编号 + 提案的值Proposer
提议者Acceptor
决策者Learner
最终决策学习者
过程
Paxos将系统中的角色分为提议者 (Proposer),决策者 (Acceptor),和最终决策学习者 (Learner):
Proposer
: 提出提案 (Proposal)。Proposal信息包括提案编号 (Proposal ID) 和提议的值 (Value)。
Acceptor
:参与决策,回应Proposers的提案。收到Proposal后可以接受提案,若Proposal获得多数Acceptors的接受,则称该Proposal被批准。
Learner
:不参与决策,从Proposers/Acceptors学习最新达成一致的提案(Value)。
prepare
阶段:Proposer
(提议者)选择一个Proposal ID
(提案编号)向所有的Acceptors
(决策者)发送Prepare请求,Acceptors针对收到的Prepare请求进行Promise承诺Accept
阶段:Proposer收到多数Acceptors承诺的Promise后,向Acceptors发出Propose请求,Acceptors针对收到的Propose请求进行Accept处理Learn
阶段:Proposer在收到多数Acceptors的Accept之后,标志着本次Accept成功,决议形成,将形成的决议发送给所有Learners
整个算法流程中的消息描述如下
Prepare
: Proposer生成全局唯一且递增的Proposal ID (可使用时间戳加Server ID),向所有Acceptors发送Prepare请求,这里无需携带提案内容,只携带Proposal ID即可Promise
: Acceptors收到Prepare请求后,做出“两个承诺,一个应答”
两个承诺,一个应答
两个承诺
:
- 不再接受Proposal ID小于等于(注意:这里是<= )当前请求的Prepare请求
- 不再接受Proposal ID小于(注意:这里是< )当前请求的Propose请求
一个应答
:
不违背以前作出的承诺下,回复已经Accept过的提案中Proposal ID最大的那个提案的Value和Proposal ID,没有则返回空值
分割线--------------------------------------------------------------
自己的理解
Paxos算法分类
- Basic Paxos
- Multi Paxos
- Fast Paxos