Paxos
paxos是一种基于消息通知的高容错性的分布式一致性协议。
三种角色
Proposer:提出提案
Acceptor:批准提案
Learner: 获取提案
算法描述
选取提案过程描述
选取提案的过程类似两阶段提交,第一阶段Proposer向Acceptor发送prepare请求,Acceptor给出相应响应;第二阶段Proposer向Acceptor发送Accept请求,Acceptor批准提案,可能出现的场景如图:
为了满足即使一个提案也可以批准提案,约定条件:
P1:Acceptor必须批准它接收到的第一个提案;
为了确保最终选定的value值是唯一的,约定条件:
P2:如果[M0,V0]提案被选定了,那么所有比编号M0更高的,且被选定的提案,其Value值也必须是V0.
为了满足P2,对Proposer和Acceptor约定如下:
Acceptor:如果提案[M0,V0]被选定了,那么所有比编号M0更高的,且被Acceptor批准的提案,其Value值也是V0.
Proposer:如果一个提案[M0,VO]被选定后,那么之后任何Proposer产生的编号更高的提案,其Value值都是V0.
问题及解决方案
由上述过程可知,如果有两个Proposer依次提出一系列编号递增的议案,最终一致在循环,无法选定。解决这个问题的方案是选择一个主Proposer,并规定只有主Proposer可以提出议案。关于这个选主Proposer的方案,个人存在疑问点,只有主Proposer可以提出议案,不也存在单点问题么,选主,是不是也得先保持一致性呢?