Paxos算法解决的是⼀个分布式系统如何就某个值(决议)达成⼀致。⼀个典型的场景是,在⼀个分布式数据库系统中,如果各个节点的初始状态⼀致,每个节点执⾏相同的操作序列,那么他们最后能够得到⼀个⼀致的状态。为了保证每个节点执⾏相同的操作序列,需要在每⼀条指令上执⾏⼀个“⼀致性算法”以保证每个节点看到的指令⼀致。在Paxos算法中,有三种⻆⾊:Proposer (提议者),Acceptor(接受者),Learners(记录员)
Proposer提议者:只要Proposer发的提案Propose被半数以上的Acceptor接受,Proposer就认为该提案例的value被选定了。
Acceptor接受者:只要Acceptor接受了某个提案,Acceptor就认为该提案例的value被选定了Learner
记录员:Acceptor告诉Learner哪个value被选定,Learner就认为哪个value被选定。
Paxos算法分为两个阶段,具体如下: 阶段⼀ (preprae ):
-
Proposer收到client请求或者发现本地有未提交的值,选择⼀个提案编号 N,然后向半数以上的Acceptor发送编号为 N的Prepare请求。
-
Acceptor收到⼀个编号为 N的 Prepare请求,如果该轮paxos
本节点已经有已提交的value记录,对⽐记录的编号和N,⼤于N则拒绝回应,否则返回该记录
value及编号
没有已提交记录,判断本地是否有编号N
1
,N
1
>N、则拒绝响应,否则将N
1
改为N(如果没有
N
1
,则记录N),并响应prepare
阶段⼆ (accept):
-
如果 Proposer收到半数以上 Acceptor对其发出的编号为 N的 Prepare请求的响应,那么它就会发送⼀个针对[N,V]提案的
Accept请求给半数以上的 Acceptor。V就是收到的响应中编号最⼤的value
,如果响应中不包含任何value,那么V 就由 Proposer ⾃⼰决定。
-
如果 Acceptor收到⼀个针对编号为 N的提案的 Accept请求,Acceptor对⽐本地的记录编号,如果⼩于等于N,则接受该值,
并提交记录value。否则拒绝请求
Proposer 如果收到的⼤多数Acceptor响应,则选定该value值,并同步给leaner,使未响应的Acceptor达成⼀致
活锁:accept时被拒绝,加⼤N,重新accept,此时另外⼀个proposer也进⾏相同操作,导致accept⼀致失败,⽆法完成算法multi-paxos:区别于paxos只是确定⼀个值,multi-paxos可以确定多个值,收到accept请求后,则⼀定时间内不再accept其他节点的请求,以此保证后续的编号不需要在经过preprae确认,直接进⾏accept操作。此时该节点成为了leader,直到accept被拒绝,重新发起prepare请求竞争leader资格。