分布式一致性原理学习笔记(3)

来源:互联网 发布:威海手机数据恢复公司 编辑:程序博客网 时间:2024/05/22 12:43

Paxos算法

算法作者:Leslie Lamport(莱斯利·兰伯特)
Paxos 算法的核心是一致性算法 “synod”。从一致性问题的描述来理解算法需要解决的实际需求。

问题的描述

假设有一组可以提出提案的进程集合,那么对于一个一致性算法来说需要保证以下几点:
1:在这些被提出的天中,只有一个会被选定。
2:如果么有提案被提出,那么久不会有被选定的提案。
3:当一个提案被选定后,进程可以获取这些被选定的提案信息。
安全性需求如下:
1:只有被提出的提案才能被选定
2:只有一个值被选定
3:如果某个进程认为某个提案被选定了,那么这个提案必须是真的被选定的那个。
Paxos算法的目标就是保证最终有且只有一个提案被选定,当被选定后,进程最终也能获取到被选定的提案。
三种参与角色
Proposer,Acceptor,Learner

问题的解决

最简单的选定

允许以个Accepetor, 所有的Proposer只能发送给这个Acceptor,Acceptor选择它接收到的第一提案作为被选定的提案。简单,但是一旦Acceptor出现问题,整个系统就无法工作。
更好的选定,应该符合以下判定
P1:一个Acceptor必须批准它收到的第一个提案。
p1引入的问题:不同的Proposer分别提出多个提案。任意一个Acceptor出问题,都无法保证正确的提案。所以引入
以 [编号,Value] 来标识一个提案。
P2:如果编号为M0,value值为V0的提案被选定了,那么所有比编号M0更高的,且被选定的提案,其Value值必须也是V0。
P2a:如果编号为M0,value值为V0的提案被选定了,那么所有比编号M0更高的,且被Acceptor批准的提案其Value值必须也是V0
P2b如果一个提案[M0,V0]被选定后,那么之后任何Proposer产生的编号更高的提案,其Value值为V0
Proposer生成提案
阶段一:
Acceptor对于Proposer产生的提案Mn保持谨慎态度,Proposer产生Mn的Prepare请求 要Acceptor保证两点 一个是 不批准任何编号小鱼Mn的提案,二:如果已经批准了天,返回那个小于Mn 且当前最大的提案。
阶段二:
Proposer的prepare收到超过半数以上的 积极响应的话。进行Vn的选择。类似的根据prepare返回的两种情况。Vn取值也是有两种,一种是随意指定(所有的acceptor还没批准过)。另一种是批准的最大编号的Vn。此时 Proposer在进行真正意义的提案请求。

Acceptor 批准提案
对于Prepare请求: 任何时候响应一个prepare请求
对于Accept请求:不违背Accept现有承诺的前提下,任意响应Accept请求。
既:一个Acceptor只要尚未响应过任何编号大于Mn的prepare请求,那么它就可以接受这个编号为Mn的提案。

提案的获取

方案一:
关播提案,一旦Acceptor批准了一个提案,就广播该天给所有的learner。此法请求超级多。
方案二:
引入主 Learner 。批准的提案只发给主Learner。主Learner负责同志其他Learner。此法避免不了Learner的单点故障。
方案三:
引入组主learner 。批准的提案发给Learner集合。通过集合通知给各个Learner

提案申请出现的问题
死循环问题

Proposer P1提出了编号为M1的提案,并且通过了Prepare请求。准备正是提交。此时 Proposer P2提出了M2的提案,率先完成了prepare请求。于是 Acceptor承诺不批准小于M2的提案,此时P1的正是提案请求会被进行忽略。于是P1又进入了Prepare请求。提出了M3提案。这又导致P2的M2被忽略。P2又进入Prepare请求。提出了M4 如此循环往复。 P1 P2就陷入了死循环。

避免死循环
Proposer指定一个主Proposer只有它能提交提案。Proposer接受其他Proposer的提案进行过滤。一旦发现当前流程中有一个编号更大的提案被提出。那么它就丢弃原来的编号小的提案。最终选择一个足够大编号的天。 问题解决。

1 0