paxos协议是一个解决分布式系中,多个节点之间,就某个值(提案)达成一致(决议)的通信协议。它能够处理在少数节点离线的情况下,剩余的多数节点仍能够达成一致。
paxos时一个两段协议,分为prepare阶段和accept阶段该协议涉及两个参与角色:proposer(提议提案的服务器)和acceptor(批准提案的服务器)。二者在屋里上可以是同一台机器。
proposer生成一个全局唯一,且递增的提案的ID,向paxos集群的所有机器发送请求,这里无须携带提案的内容,之提供提案的ID即可(且把提案ID叫做Pn)
Acceptor收到提案请求后,做出以下约定:
--不再应答 <= Pn的Prepare请求;
--对于 < Pn的请求亦不处理
Acceptor做的处理包括:
--在应答前要在本地持久化当前提案ID
--如果现在请求的ID也就是Pn大于此前存放的proposalID,则做以下逻辑;
If Pn>proposalID then proposalID =pn
如果该Acceptor Accept 过的提案,则返回proposalID最大的那个提案的内容,否则返回空值
proposer收到多数派应答(超过n/2+1,n时集群数)prepare阶段的返回值后,从中选择proposalID最大的提案内容,作为要发起ACCEPT的提案,如果这个提案为空,则可以自己随意决定提案内容。然后携带当前proposalID向paxos集群的所有机器发送Accept请求。
Acceptor收到请求后,检查不违背自己之前做出约定的情况下,持久化当前Proposal和提案内容。最后收集到多数派应答的Accept回复之后,形成决议。