详解Paxos算法

Paxos算法是什么?

Paxos算法是莱斯利.兰伯特1990年提出的一种基于消息传递的、具有高容错性的一致性算法

算法描述

算法角色描述

Paxos算法中有三种角色,分别具有三种不同的行为,一个进程可能同时充当多个角色。
Proposer: 提案的提议者。
Acceptor: 提案的表决者。超过半数的Acceptor同意了提案,则表示提案通过。
Learners:提案的学习者,当提案通过时,需执行提案。
一个集群中可能会存在多个提案者(Proposer)和多个表决者(Acceptor).

算法需保证以下几点:

  • 每个提议者(Proposer)在提出提案时都会首先获得一个全局唯一的、递增的提案号N。
  • 表决者(Acceptor)在同意提案时会将提案编号N保存到本地,承诺后续只会同意编号大于N的提案。
  • 一旦一个题案被选定(超过半数的Acceptor同意了提案),则其他服务器会主动同步(Learn)该提案。
算法过程描述

Paxos算法的执行过程有两个阶段:准备阶段(prepare)和接受阶段(accept)。
1.准备阶段
提议者(Proposer)准备提交一个提案,这是会获取一个提案编号N,然后将N发送给所有的表决者(Acceptor),用于判断集群是否支持该编号的提议。
每个表决者(Acceptor)本地都保存了曾经同意过的提案的最大编号N,有上诉请求来时,会判断N和本地保存的N谁大,
如果下于本地N,则不回应
如果N大于本地N,则认为该提议的编号是可以接受的,当前表决者会将N记录下来,并将其曾经接受的最大提案Proposal(myid,maxN,value)反馈给提议者。
myid:当前表决者的id,
maxN:表决者本地缓存的最大编号N
value:缓存的最大编号N的提议内容。

2.接受阶段
①当提议者(Proposer)的编号N收到超过半数的表决者(Acceptor)响应时,就可以将真正的提案Proposal(N,value)发送给所有的表决者。
②表决者收到提案请求后会再次取出本地缓存的最大提案号N与当前请求的提案号N比较(再次比较是因为提议者不止一个,在这期间有可能表决者本地缓存的提案号N已经被其它提议者的请求替换了),如果提案号大于本地缓存的编号N,则该提议者反馈,表示同意提案,如果下於则不响应。
③如果提议者没有收到超过半数表决者(Acceptor)的反馈,则重新走准备阶段的流程,如果超过半数则会向外广播信息:
向曾经通过该提案的Acceptor发送“可执行数据同步”信息,即让他们执行提案;
向未曾反馈的Acceptor发送“提案+可执行数据同步”信号,让他们也接受提案并执行。

Paxos算法的活锁问题

如果大家理解了上诉步骤,就应该知道会存在这样一个问题,一个提议者的提案可能一直通过不了,在算法的两个阶段都有可能导致提案不能通过,一直重复提案。这就是活锁问题。
解决方法:改进Paxos算法,比如Fast Paxos算法(只允许一个提议者)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章