大数据_Zookeeper - Paxos 算法

 

 

Paxos 协议描述的场景:

 

  在古希腊有一个Paxos 的小岛,岛上采用议会的形式来通过法令,议会中的议员通过信使进行消息的传递。值得注意的是,议员跟信使都是兼职的,他们随时有可能会离开议会厅,并且信使可能会重复的传递消息,也可能一去不复返。

  因此,议会协议要保证在这种情况下,法令仍能够正确的产生,并且不会出现冲突。

 

下面对 Paxos 算法进行描述:

假设有一组可以提出协议的进程集合,那么对于一个一致性算法要确保以下几点:

1.在这些被提出的提案中,只有一个会被选定

2.如果没有提案被提出,那么就不会有被选定的提案

3.当一个提案被选定后,进程应该可以获取被选定的提案信息

 

对于一致性来说,安全性需求如下:

1.只有被提出的提案才能被选定

2.只能有一个值被选定

3.如果某个进程人为某个协议被选定了,那么这个提案必须是真的被选定的那个。

 

下面引入 Paxos 协议的 3个最主要的角色

Acceptor : 对协议进行批准

Proposer :  发起协议

Learner : 对通过的协议,更新自己的信息

 

下面对其中的主要逻辑过程进行讲解:

一个提案被选定,需要半数以上的Acceptor 批准

  我们使用一个全局的标号来标识每一个被Acceptor 批准的提案。当一个具有某Value 值的提案被半数以上的Acceptor 批准后,我们认为该Value被选定了,此时我们也认为该提案被选定了。

   需要注意的是,提案跟Value 不是一个概念了,提案变成了一个由编号和Value组成的组合体。以 【编号,Value】标识一个提案。

P2C: 对于任意的Mn 和 Vn,  如果提案 [Mn, Vn] 被提出,那么肯定存在一个 由半数以上的 Acceptor 组成的集合S, 满足以上两个条件中的任意一个。

  1)S中不存在任何批准过编号小于Mn 的提案的Acceptor

  2)选取S中所有Acceptor 批准的编号小于 Mn的提案,其中编号最大的那个提案其Value的值是Vn.

 

 

 

Proposer 生成提案流程

步奏一

1.Proposer 选择一个新的提案编号Mn. 然后向某个Acceptor 集合的成员发送请求,要求该集合中的Acceptor 做出如下的回应。

 .1 向Proposer 承诺,保证不再批准任何编号小于Mn的提案。

 .2 如果Acceptor 已经批准过任何提案,那么其就向Proposer 反馈当前该Acceptor 已经批准的编号小于Mn 但为最大编号的那个提案的值。

 该流程是编号Mn提案 的Prepare 请求。

步奏二

2.如果Proposer 收到了半数以上的Acceptor 的响应结果,那么它就可以产生编号为 Mn, Value 为 Vn 的提案。这里的Vn 是响应中编号最大的提案的Value值。

 

Acceptor 批准提案;

 

一个Acceptor 可能会收到来自 Proposer 的两种请求,分别是 Prepare 请求 和 Accept 请求。对这两种请求做出响应的条件分别如下:

Prepare 请求:Acceptor 可以在任何时候响应一个Prepare 请求

Accept 请求: 在不违背Accept 现有承诺的前提下,可以任意响应Accept 请求。

 

对Acceptor 处理逻辑的约束条件,大体可以定义如下。

P1a : 一个Acceptor 只要尚未响应过编号大于 Mn的 Prepare 请求,那么就可以接受这个编号为Mn的提案。

 

 

算法描述

 

2阶段提交算法流程:

阶段一:

1.Proposer 选择一个提案编号Mn, 然后向Acceptor的某个超过半数的子集成员发送编号为Mn的Prepare 请求

2.如果一个Acceptor收到一个编号为Mn的Prepare 请求,且编号 Mn大于该 Acceptor 已经响应的所有Prepare 请求的编号,那么它就会将它已经批准过的最大编号的提案作为响应反馈给 Proposer, 同时 该 Acceptor 会承诺不再批准任何编号小于 Mn 提案。

 

例子:

假设一个Acceptor 已经响应过的所有Prepare 请求的提案编号分别是 1,2,5.。。7 , 那么该Acceptor 在接收到一个编号为8的 Prepare 请求后,就会将编号为7 的提案作为响应反馈给 Proposer.

 

阶段二 : 

1.如果Proposer 收到来字半数以上的 Acceptor 对于其发出的编号为 Mn的 Prepare 请求的响应,那么它就会发送一个针对 【Mn,Vn】提案的Accept 请求给 Acceptor. 注意, Vn的值就是收到的响应中编号最大的提案的值,如果响应中不包含任何天,那么它就是任意值。

 

2.如果Acceptor 收到这个针对 [Mn, Vn] 提案的 Accept 请求,只要该 Acceptor 尚未对编号大于 Mn 的Prepare 做出响应,它就可以通过这个提案。

 

 

Learner 学习流程

 

Learner 获取一个已经被选定的提案的前提是,该提案已经被半数以上的Acceptor 批准。

为了减少网络开销,我们可以通过将批准的提案发送给一个特定的Learner 集群的方式完成数据的更新。

 

 

主Proposer 问题

   当有多个Proposer 的时候,有可能出现始终无提案被选中的情况,这个时候,我们对Proposer 进行改进,确保只有一个Proposer 进行批准提案。

 

你可能感兴趣的:(大数据,Zookeeper)