Paxos算法基于消息传递的分布式一致性算法:解决了分布式一致性问题
-
Paxos的重要概念:
- 提案(Proposal):Proposal消息包括提案编号(Proposal ID)和提案的值(最终一致值Value)
-
Paxos算法角色:
- Client:客户端,主要是向分布式系统发出请求,并等待响应。例如:对分布式文件服务器中文件的写请求
- Proposer:提案发起者,提倡客户请求,试图说服Acceptor对此达成一致,并在发生冲突时充当协调者以推动协议向前发展。
- Acceptor:决策者,可以批准提案;如果某个提案被选定,那么该提案里的Value就被选定了。
- Learners:最终决策的学习者,充当该协议的复制。
规则:
- 一个Acceptor必须接受它收到的第一个提案
- 一个提案被选定需要被半数以上的Acceptor接受
- 如果某个value为v的提案被选定了,那么每个编号更高的被Acceptor接受的提案的value必须是v
- 如果某个value为v的提案被选定,那么之后任何Proposer提出的编号更高的提案的value必须是v
- 对于任意的Mn和Vn,如果提案[Mn,Vn]被提出,那么肯定存在一个由半数以上的Acceptor组成的集合S,满足一下两个条件中的任意一个:
- 要么S中每个Acceptor都没有接受过编号小于Mn的提案(之前没有接受提案)
- 要么S中所有Acceptor批准的所有编号小于Mn的提案中,编号最大的那个提案的value值为Vn。
- 如果Acceptor没有接受过提案,有提案就接受最先到达的提案
- Proposer提交提案的时候,如果Acceptor已经接受过提案,提交的提案的value必须和上次一样不变
- 如果Acceptor接受提案时,要求填的编号不能比上次的提案编号小,如果编号小,会忽略。提交提案的值,Acceptor接收时候,value必须和上次接收的value一样。
总结:
- 如果Acceptor没有接受过提案,有提案就接受最先到达的提案。
- Proposer提交提案的时候,如果Acceptor已经接受过提案,提交的提案的value必须和上次一样不变
- 如果Acceptor接受提案时,要求提案的编号不能比上次的提案编号小,如果编号小则忽略。提交提案的值,Acceptor接收的时候,value也必须上次接受的value一样。
提案的生成规则及接收
提案者给决策者发送prepare请求,提案者创建一个编号为N的提案发送给多数派决策者,今后不会再接收比N小的数,然后多数派响应一个V或者Null给提案者,提案者发现没有对应的提案,然后需要创建自己的Value, 然后发送accept请求,编号为N,值为Value([N,V]),如果此时决策者的编号出现大于N,则返回Null或者error等信息,使提案者重新增加编号的值,继续发送prepare请求,如果编号是N则直接响应回来。
Learner学习方式
- Acceptor接收了一个提案,就将该提案发送给leaner
- 优点:Learner能快速获取被选定的value
- 缺点:通信次数为(M*N)
- Acceptor接收了一个提案,将该提案发送给主Learner,主Learner在通知其他Learner
- 优点:通信次数减少(M+N+1)
- 缺点:单点问题(主Learner可能出现故障)
- Acceptor接收了一个提案,将该提案发送给Learner集合,Learner集合再通知其他Learner
- 优点:集合中Learner个数越多,可靠性越好
- 缺点:网络通信复杂度搞。
Paxos算法活性
上图失去活性的问题可以通过选出一个主Proposer,都通过主Proposer去发送提案