Paxos算法——科普贴(下篇,设计之美)

接上篇:Paxos算法——科普贴(上篇,共识问题+故障是常态)

Paxos算法由图灵奖得主Leslie Lamport在《The Part-Time Parliament》一文中提出(中文译文见链接)。本文主要对Paxos算法步骤以及设计思路进行分析。

首先,需要明白Paxos算法适用于哪种环境(适用环境)以及Paxos算法设计目标,即:Paxos算法致力于提供什么样的性能(算法保证)

适用环境:非拜占庭故障下的异步系统

异步系统中,没有时间的限制。时钟以任意速度运行,网络通信所需时间不确定,节点执行操作可以花费任意长的时间。 

非拜占庭故障是指,节点故障表现为对收到的消息无法进行响应,永远保持在当前状态;节点之间的消息传递是可靠的,即:消息可以不按顺序到达,可以重复发送,但不会损坏。

Paxos算法可以容忍非拜占庭故障,对于拜占庭故障,并不能很优雅地处理。

算法保证

1. Paxos算法在任何情况下均可保证安全性(Safety)

这里安全性由两个部分组成:

(1)非平凡性(Nontriviality):只有客户端提出的请求才能被学习;

(2)一致性(Consistency): 同一个实例,最多只有一个客户端请求能被学习。 

这里,如果节点持久存储了客户端请求,我们称节点“学习”了客户端请求。

Paxos算法中,存在一个预先确定的编号1,2,...,n,对于收到的客户端请求,分配一个特定的编号,由<编号,客户端请求>构成的二元组称为实例。Paxos通过确保每个节点收到相同的实例,节点按实例编号执行客户端请求,即可实现共识。

2. Paxos 在少数节点故障的情况下,可以提供进展保证(Progress guarantee)

即: 如果足够多的节点没有故障,并且消息在超时之前到达,对于特定编号的实例,最终可以确定对应的客户端请求,并在所有无故障节点上持久存储该实例。

Paxos算法在异步系统中,放宽了一点要求:少数节点故障,消息最终可以送达,并没有违背FLP定理(FLP定理不存在少数节点故障,消息最终可以送达这一限制)

下面,针对Paxos算法提供的算法保证,考虑Paxos的适用环境,对Paxos算法步骤进行介绍。

算法步骤

为了实现安全性保证,Paxos算法需满足非平凡性以及一致性。对于非平凡性,不难满足,Paxos只处理客户端提出的请求即可。对于一致性,是实现的难点。Paxos算法首先证明,如果满足特定约束,算法即可提供一致性和进展保证。

1.相关概念

cf:学习,确认

Paxos算法中,节点持久存储客户端请求的过程,我们称为“学习”

节点首次收到特定实例(包含<编号,客户端请求>)会进行“确认”,这里的确认并未持久存储,而是节点会记录下,收到过这一实例。Paxos算法中,在“学习”客户端请求之前,肯定会经过节点“确认”的过程。

2.特定约束

约束1:每次投票都有一个独一无二的投票编号

约束2:任意两次投票的法定人数的交集不为空,即:任意两次投票的法定人数至少有一个共同的节点。

约束3:对每次投票,如果法定人数中的节点在早期的投票中对某些实例编号(k1,k2,...,kn)的客户端请求进行了确认,并且这次投票依然需要确定这些实例编号(k1,k2,...,kn)的客户端请求,那么这些实例编号(k1,k2,...,kn)的客户端请求只能设置为法定人数中的节点在早期投票中,最晚确认的那次客户端请求。

这里,投票可以理解为执行一次Paxos算法。那么约束1要求一次Paxos算法需要有一个独一无二的编号来唯一标识。

法定人数指的是包含大多数节点(如果系统中一共有N个节点,那么大多数节点指的是最少有\lfloor N/2\rfloor +1个节点,\lfloorN/2\rfloor 表示N/2的下界)的节点集合,在Paxos算法中,法定人数需要和特定节点进行消息交流。约束2要求,任意两次Paxos算法选择的法定人数至少有一个共同节点。

约束3是实现一致性的关键所在。约束3要求,对于一个实例,如果一次投票中法定人数的节点在之前的投票中对客户端请求进行了确认,那么这个实例的客户端请求必须设置为法定人数中的节点在早期投票中,最晚确认的客户端请求。那么,对于一个实例,假设在一次投票(假设编号为k)中,有一个客户端请求被学习。在紧接着的一次投票(编号为k+1)中,法定人数中的节点肯定至少存在一个节点在编号为k的投票中,对该实例进行了确定(约束2导致)。那么对于该实例,只能选择编号为k的投票中选择的客户端请求。以此类推,在之后的投票中,该实例的客户端请求只能选择编号为k的投票中选择的客户端请求,进而实现了:同一个实例,最多只有一个客户端请求能被学习。 

如果大多数的节点没有故障,那么在满足约束1-3的情况下,实例被学习是有可能的。

3.算法步骤

(1) 节点p选择一个比之前所有投票都大的新的投票编号ba,将lastTried[p]设置为ba,并给某个节点集合发送NextBallot(ba,n)消息,n表示编号小于等于n的实例均已被p学习。

(2) 节点q从p处收到NextBallot(ba,n)消息并且ba要大于q收到的所有NextBallot(ba,n)消息中的ba,q将nextBal[q]设置为ba。如果q中存在小于等于n的实例未被学习,q会请求p发送这样的实例;如果q中存在大于n的实例已经被学习,会通知p;如果q中存在大于n的实例的确认,但并未学习,则给p发送LastVote(ba, v)消息,v等于q之前发送过确认的大于n的实例集合,对于每个实例来说,其中的客户端请求是最晚发送确认的客户端请求。(如果ba\leq q收到的所有NextBallot(ba,n)消息中的ba,那么就忽略NextBallot(ba,n)消息)

(3) 节点p如果收到请求发送实例的信息,则发送相应实例;如果收到其他节点发送的已学习实例的通知,则学习相应实例;如果从某个大多数集合Q中的每个牧师那都收到LastVote(ba, v)(ba= lastTried[p])消息,p会初始化一次新投票,投票编号为ba,法定人数为Q,实例集合为d,d中客户端请求的选择满足约束3。p给Q中所有牧师接着发送BeginBallot(ba, d)消息。

(4) 在节点q收到BeginBallot(ba, d)消息并且ba= nextBal[q],q对投票编号为ba的实例进行确认,并记录下确认的实例,并且给p发送一个Voted(ba, q)消息。(如果ba\neq nextBal[q],那么就忽略BeginBallot(ba, d)消息)

(5) 如果p从Q(投票编号为ba的投票中的法定人数)中的每个节点q那都收到了Voted(ba, q)消息,并且ba = lastTried[p],那么p将d写入分类账中并给每个节点发送Success(d)消息。

(6) 在收到Success(d)消息之后,节点持久存储d中的实例,即:学习d中的实例。

其中,步骤(1)(2)主要是为约束3的执行收集一些必要信息(例如:早期投票中,节点最晚发送确认的客户端请求);步骤(3)根据约束3为实例选择相应的客户端请求;步骤(4)会对下一次投票收集约束3相关的信息产生影响,同时也会决定是否执行步骤(5)(6)。执行步骤(5)(6)表明实例被成功“学习”。

综上,Paxos算法步骤可以满足约束1-3,Paxos可以保证安全性,此时影响进展保证的因素是:如果不断有节点尝试进行步骤(1),投票编号ba的值设置地越来越大,那么会阻碍下面步骤的执行(ba\leq q以及ba\neq nextBal[q]的情况发生)。因此,为了提供进展保证,Paxos需要选出一个特定的节点(领导者),只有该节点有权执行步骤(1),(3)。具体的选择方法,Paxos算法中并未详细描述。


Paxos算法设计精细巧妙,本身较为难懂,本文对Paxos算法进行了一个简单的描述,可能存在描述不清楚的地方,欢迎进行提问。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 寻找一种易于理解的一致性算法(扩展版) 摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos...
    枝叶君阅读 2,638评论 0 15
  • 寻找一种易于理解的一致性算法(扩展版) 摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos...
    yflau阅读 951评论 0 1
  • Paxos漫谈 发展史Paxos算法是现代分布式系统中的一项重要的基础性技术,得到了广泛的应用。Paxos的整个发...
    莫名FCJ阅读 2,380评论 0 1
  • 1 Paxos算法 1.1基本定义 算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色: ⑴propo...
    阿斯蒂芬2阅读 365评论 0 1
  • 腊八,骢马疾驰至陈康、小欢伉俪雅居,美馔佳肴满席,葡萄美酒不醉人。言及2015年初入金陵之景,忽文词泉涌,感念从前...
    慕容文兮阅读 326评论 2 8