(16)云计算核心算法之Paxos算法

云计算的基础技术是集群技术,支撑集群高效协同工作的需要一系列资源和任务调度算法。

这一系列调度算法中,有3种核心算法奠定了集群互连互通的基础,它们是Paxos算法,DHT算法和Gossip协议。

其中,Paxos算法解决分布式系统中信息一致性的问题。

Paxos算法要解决的问题:

Paxos算法要解决的问题是一个分布式系统如何就某个value(指令)达成一致。

为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致

Paxos算法的知识背景:

(1)分布式系统中的各个节点称为"processor"

(2)processor可以担任"proposer","accpter","learner"三个角色中的一个或多个角色。

(3)proposal = [num(编号), value],其中num是proposal的编号(按proposal被提出的顺序递增),不同proposal的num必须是不一样的,value就是需要同步的指令。

(4)proposer可以propose(提出)proposal;accepter可以accept(接受)proposal;learner可以学习被choose出来的value。

(5)choose:当一个proposal被大多数(多数派)的accepter所接受时就说这个proposal被choose,同时该proposal的value也被choose。

(6)各个processor之间的信息传递可以延迟,丢失,但是传达到的信息都是正确的

Paxos算法的核心:

Paxos算法认为,只要满足以下三个条件就能保证数据的一致性:

(1)一个value只有在被proposer提出之后才可以被choose;

(2)每次只有一个value被choose;

(3)value只有被choose之后才能被learners所获取;

Paxos算法其实就是对条件2的不断加强。

条件2的加强版:

1.每次只有一个value被choose  2.任意两个majority(多数派)至少含有一个公共accepter  3.一个accepter只能接受一个value

如何保证条件2?

 有以下限制:

p1: 每个accepter都必须接受它收到的第一个proposal

p2:如果一个value为v的proposal被choose,那么此后被choose的编号更大的proposal的value也必须是v

p2a:如果一个value为v的proposal被choose,那么此后任意accepter接受的编号更大的proposal的value也必须是v

p2b:如果一个value为v的proposal被choose,那么此后被任意proposer提出的编号更大的proposal的value也必须是v

其中p2,p2a和p2b的关系为: p2b蕴含p2a,p2a蕴含p2,翻译成人话就是如果满足了p2b,则p2a一定满足;如果满足了p2a,则p2一定满足。

若同时满足p1和p2b这两个限制,则已经可以保证分布式系统中的一致性。但由于p2b很难在实际中实现,所以还需要对p2b进行加强。

p2c:如果一个proposal=(n,v)想要被提出,那么存在一个多数派S,要么S中没有accepter接受任何num<n的proposal,要么S中accepter所接受的proposal中编号最大的proposal的value是v

p2c是p2b的加强,即若满足p2c则一定能满足p2b的要求。

为了满足p2c,一个proposer要想提出一个编号为n的proposal,它必须知道accepter多数派中已经接受的编号小于n的最大的编号是多少。

proposer提出一个proposal的算法:

(1)proposer选择一个编号n并向一组accepter发送一个prepare请求(包含所选择的编号n),要求accepter返回promise,promise包含两个信息:1.不再接受任何编号小于

n的proposal的承诺2.该accepter所接受的小于n的最大编号的proposal,如果该accepter还未接受过任何proposal则不用返回这个信息。

(2)如果proposer接收到大多数的accepter所返回的promise,则该proposer可以提出编号为n,value为promise所带回的proposal的value的proposal,如果promise没有带回有关的proposal则value可以为任意值。

proposer通过向一组accepter发送accept请求来发送一个已经被接受的proposal。

accepter接受proposal的算法:

p1a:当且仅当accpter没有对任何编号大于n的prepare做出过promise时,它可以接受一个编号为n的proposal。

p1a蕴含p1

即使是宕机或者重启accepter也必须记住它所接受的最大编号的proposal以及它所做出过回应的最大编号的prepare请求。proposer要保证不提出重复的proposal。

proposal提出和接受的系统描述,这个过程分为请求和提出两个阶段:

原文地址:https://www.cnblogs.com/paradis/p/11037295.html