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,主动同步提议者的提案。
正常流程

单点故障,部分节点失败

proposer失败