paxos算法是什么
在容忍消息乱序、重复、少数派宕机的前提下,多个节点就一个值达成一致,不管这个值是什么。
这里的“一致”隐含意思的最终一致性(从每个节点的物理存储来说),即如果所有节点存活且可达,在经过一定的时间后,最终所有节点的值会一致。这种算法统称为consensus algorithm(翻译为共识算法或者一致性算法)。
这里的“一致”可以是强一致性,通过proposer发起提案即可立即确认已达成一致的值。
世界上只有一种一致性算法,那就是paxos,其他的都是残次品。
paxos算法简述
组成
- proposal:提案,提案包括proposal number:提案编号和value:提案内容。
- proposer:用来提出提案
- acceptor:用来通过提案
- learner:用来学习提案,learner不是必须的。
流程
- 经过多次proposal达成一个值得确定,且仅确定一个值(也就是提案的内容)
acceptor可以接受两种请求,一种是prepare,一种是accept,也是阶段一和阶段二的划分标准。 - 阶段一:
- proposer给大多数的acceptor发送一个提案编号为n的prepare请求。
- acceptor收到了提案编号为n的prepare请求,
- 如果它之前接受的prepare请求编号都小于等于n,或者没接受过prepare请求
- 那么它会“同意”提案编号为n的prepare请求并且承诺“不接受”提案编号小于n的accept请求
- 返回 本提案已接受的状态 和 已接受的accept请求最大编号的提案(包括提案编号和提案内容)
- 否则它之前接受过至少一个prepare请求编号大于n
- 那么它会拒绝提案编号为n的prepare请求
- 返回 本提案已拒绝的状态 和 已接受的prepare请求的最大的提案编号(返回 已接受的prepare请求的最大的提案编号不是必要的,但是可以提高算法性能)
- 如果它之前接受的prepare请求编号都小于等于n,或者没接受过prepare请求
- 阶段二:
- proposer
- 如果有acceptor拒绝编号为n的prepare请求,则回到阶段一,提交编号为n+1的prepare请求。
- 这个条件分支不是必要的,即不影响算法的正确性,但是可以提高算法性能
- 如果收到了大多数acceptor接受编号n的prepare请求,它会发送一个accept请求给这些acceptor,请求的内容是一个编号为n、内容为v的提案。
- 如果proposer收到的响应中没有携带提案,proposer会取任意值作为v,
- 否则的话,v是响应携带的提案中的最大编号的内容。
- 如果不能收到大多数acceptor接受编号n的prepare请求,如请求超时,acceptor宕机,丢包等。则回到阶段一,提交编号为n+1的prepare请求。(这个条件分支不是必要的,即不影响算法的正确性,但是通过回到阶段一重试,使算法可以进行下去)
- 如果有acceptor拒绝编号为n的prepare请求,则回到阶段一,提交编号为n+1的prepare请求。
- acceptor收到编号为n的accept请求,
- 如果acceptor没有接受过编号大于n的prepare 请求,它就会接受这个编号为n的提案。
- proposer
learner
通过上面的流程,可以实现确定一个值,但是不能保证最终一致。因为多数接受即可确定一个值,流程就结束了。
learner将达成一致的值同步给所有acceptor来达成最终一致性。通过已确定一致性proposer将一致的结果通知到learner,learner转发给所有acceptor。但是已确定一致性proposer宕机了,那么learner可以通过存活的proposer发起议案获取到确认的议案即可。
java代码实现
待补充
paxos算法两阶段的必要性
考虑一个简单的算法。从多个冲突的值选一个值,并同步到所有节点。
- 有两种角色:proposer和acceptor,
- proposer提出一个值,如果多数acceptor同意即返回
- acceptor现将请求值持久化后直接返回接受。
该算法最大的问题是某些情况下不能将已达成一致的值同步到所有节点,
举例:3个acceptor,proposer提出值A,acceptor1接受,acceptor2和acceptor3未收到,未达到多数,proposer提出值B,acceptor1未收到,acceptor2和acceptor3接受,达到多数,值为B,
之后acceptor3宕机,此时虽有多数节点存活,但却无法确定已达成一致的值为A还是B。
paxos就可以避免这个问题,如果就某个值达成一致后,只要有多数节点存活,就可以确定这个值,方法是通过proposer提出议案即可确定。
paxos算法问题
保证了数据强一致性,但是,会有活性问题和效率问题(至少两轮rpc)。
即使不保证数据强一致性的简单多数派也会有活性问题,源于并发竞争。如:3个acceptor,3个proposer并发请求不一样的值。
paxos资料
Paxos Made Simple 论文中,有Paxos的推导过程,也是证明过程。
Paxos Made Simple 论文
Paxos Made Simple 论文中文翻译
https://www.cnblogs.com/linbingdong/p/6253479.html