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