Paxos算法
Paxos是一种分布式一致性算法。在多个节点中,每个节点可能都有一个值,并且这个值不一定相同,Paxos的作用就是选出一个值,并让所有节点接受这个值。
在Paxos算法中,节点一个有三种角色:Proposer(提议者)
、Acceptor(接受者)
、Learner(告知者)
,并且每台机器可能拥有其中不止一种角色。
Paxos算法分为两个阶段:
-
Proposer
向过半Acceptor
节点发送提案为[Mn, Vn]
的Prepare
请求,其中Mn
为提案编号,Vn
为提案值。Acceptor
接收到Proposer
的Prepare
请求,此时可能会有两种情况:-
该
Acceptor
还未接受过Prepare
请求,那么此时将会接受该请求,并更新自身状态为[Mn, Vn]
,并将[Mn, Vn]
作为Prepare
请求响应反馈给Proposer
,并且承诺不会再接受任何编号比Mn
小的请求。 -
该
Acceptor
已经接受过Prepare
请求,此时有会有两种情况:Mn
小于之前接受过最大的请求编号,忽略该请求。Mn
大于等于之前接受过最大的请求编号Mp
,更新当前状态为[Mn, Vn]
,并将[Mp, Vp]
作为Prepare
请求响应反馈给Proposer
,并且承诺不会再接受任何编号比Mn
小的请求。
-
-
如果
Proposer
接收到半数以上Acceptor
对其发出的提案[Mn, Vn]
的Prepare
请求的响应,那么就会向Acceptor
发出一个提案为[Mn, Vx]
的Accept
请求,其中Vx
为其接收到的Prepare
请求响应中编号最大的提案的值(如果响应中不包含任意提案,那么就为任意值)。Acceptor
接收到的Accept
请求中,如果提案编号Mn
不小于其承诺的最小编号,并且当前Acceptor
没有通过任何编号大于Mn
的Accept
请求,那么就会通过这个Accept
请求。如果有半数以上Acceptor
通过了某个提案,那么就会告知部分Learner
,再由这部分Learner
同步给其他所有Learner
通过的结果。