paxos算法
Paxos
算法是
Leslie Lamport 1990年提出的一种一致性算法,该算法是一种提高分布式系统容错性的一 致性算法,解决了
3PC
中网络分区的问题,
paxos算法可以在节点失效、网络分区、网络延迟等各种异 常情况下保证所有节点都处于同一状态,同时
paxos
算法引入了
“
过半
”
理念,即少数服从多数原则。
- paxos有三个版本:
Basic Paxos
Multi Paxos
Fast Paxos
- paxos算法的四种角色
paxos的四种角色分别具有三种不同行为,但是多数情况下,一个进程可能充当多种角色
- client:系统外部角色,请求发起者,不参与决策
- proposer:提案提议者
- acceptor:提案的表决者,即是否accept该提案,只有超过半数以上的acceptor接受了提案,该 提案才被认为被“选定”
- learners:提案的学习者,当提案被选定后,其同步执行提案,不参与决策
Paxos
算法分为两个阶段:
prepare
阶段、
accept
阶段
- prepare阶段
<1> proposer
提出一个提案,编号为
N,
发送给所有的
acceptor
。
<2>
每个表决者都保存自己的
accept
的最大提案编号
maxN
,当表决者收到
prepare(N)
请求时,会
比较
N
与
maxN
的值,若
N
小于
maxN,
则提案已过时,拒绝
prepare(N)
请求。若
N
大于等于
maxN
,
则接受提案,并将该表决者曾经接受过的编号最大的提案
Proposal(myid,maxN,value)
反馈给提议
者:其中
myid
表示表决者
acceptor
的标识
id
,
maxN
表示接受过的最大提案编号
maxN
,
value
表
示提案内容。若当前表决者未曾
accept
任何提议,会将
proposal(myid,null,null)
反馈给提议者。
- accept阶段
<1>
提议者
proposal
发出
prepare(N),
若收到超过半数表决者
acceptor
的反馈,
proposal
将真正的
提案内容
proposal(N,value)
发送给所有表决者。
<2>
表决者
acceptor
接受提议者发送的
proposal(N,value)
提案后,会将自己曾经
accept
过的最大
提案编号
maxN
和反馈过的
prepare
的最大编号,若
N
大于这两个编号,则当前表决者
accept
该提
案,并反馈给提议者。否则拒绝该提议。
<3>
若提议者没有收到半数以上的表决者
accept
反馈,则重新进入
prepare
阶段,递增提案编号,
重新提出
prepare
请求。若收到半数以上的
accept
,则其他未向提议者反馈的表决者称为
learner
,主动同步提议者的提案。
正常流程
![](https://i-blog.csdnimg.cn/blog_migrate/6104ab833b0ca8a4332f10df19667db3.png)
单点故障,部分节点失败
![](https://i-blog.csdnimg.cn/blog_migrate/d5bee14f53b427828818834dec52bf1c.png)
proposer失败