Paxos 算法

共识算法:Paxos 算法


1. 目录

[TOC]

2. 共识问题 [1]

  • 什么是共识问题?
    粗略地说,该问题是在一个或多个进程提议了一个值应当是什么后,使进程对这个值达成一致协定。
  • 解决什么问题?
  • 在一个计算机提议一个动作后,控制引擎的所有计算机要决定“继续”还是“放弃”。
  • 在互斥中,进程对哪个进程可以进入临界区达成协定。
  • 在选举中,进程对当选进程达成协定。
  • 在全排序组播中,进程对消息传递顺序达成协定。

2.1 一个例子:问题描述 [2]

假设有两支(或多支)军队,他们必须做到同时进攻或同时防守,否则就会失败。所有军队组成一个系统,他们必须共同动作。问题是,如何让他们步调一致?

现在不妨把军队看做”进程“,把进攻或防守看做一个变量”行动“。

  • 单机系统中,这个问题很容易解决。用一个互斥量就搞定了,类似于多线程。

  • 分布式系统中,这个问题就麻烦啦。假设每个进程都在不同的服务器上,他们就无法通过共享内存达到同步。如果进程是军队的话,军队之间只能通过通信兵来进行通信(消息传递)。基于消息传递的分布式军队系统会有这些问题:

  1. 如何确定另一支军队是否被干掉?(服务器崩溃)
  2. 如何知道通信兵是否被杀死(消息丢失)或久久未到达其他军队(延迟不可预知)?
  3. 如果马路等通信信道被切断怎么办?(网络分割)

2.2 另一个例子

在一个分布式数据库系统中,如果各节点(server,或进程)的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。为保证每个节点执行相同的命令序列,需要在每一条指令上执行一个“一致性算法”以保证每个节点看到的指令一致,是分布式计算中的重要问题。

3. Paxos 的一致性原则 [3]

  • Safety (坏的事情一定不会发生)
  1. 只有被提议的值才会被选择;
  2. 只能有一个值被批准,不能出现第二个值把第一个覆盖的情况;
  3. 每个节点只能学习到已经被批准的值,不能学习没有被批准的值 。
  • Liveness (好的事情最终一定会发生)
  1. 最终会批准某个被提议的值;
  2. 一个值被批准了,其他进程最终会学习到这个值。

Paxos 只保证Safety,而不能保证Liveness。

4. Paxos算法描述

4.1 假设 [3]

每个server都可以担任三种角色:提案者(Proposer)、接受者(Acceptor)、学习者(Learner)。提案者负责提出提案(proposal),接受者负责通过提案,而学习者负责更新提案。

每个提案都会被分配一个自然数$n$作为ID,以及一个需要提出的值$v$。

4.2 选择一个值(Choosing a Value) [3]

阶段一
a. 提案者选择一个提案(proposal)编号$n$,向接受者多数派组播一个prepare请求。
b. 如果一个接受者收到一个prepare请求,并且编号$n$是所有他已经通过的prepare请求中最大的,那么他会同意这个新的prepare请求,并承诺不会再同意任何比$n$小的prepare请求和accept请求。

阶段二
a. 如果提案者收到一个接受者多数派的回应prepare_ok(n,na, va),那么他就选出最大的$n_a$所对应的$v_a$。或者,若所有回应中$v_a$都为空,也就是还没有同意过任何提案,那么就选择自己的$v$。然后发送accept(n,v)请求。
b. 如果一个接受者收到一个 accept(n,v) 请求,并且$n$大于所有它 prepare 过的$n_p$,那么他就接受这个$v$,然后回复 accept_ok(n)

4.3 学习一个值(Learning a Chosen Value)

当一个提案被多数派通过,这提案者就向所有人(servers)发送decided(v),贯彻与落实这个$v$。

4.4 Paxos伪代码[4]

# Proposer
proposer(v):
    while not decided:
        n = heigher(N[:])  # 尝试分配一个当前最大的n值给这个proposal
        send prepare(n)     # 向所有acceptor发送prepare request
        # 若大部分返回ok:
        if prepare_ok(n, na, va) from majority:
            # 从{na...}中选出最大的那个和对应的va,令v=va;否则,就选自己的v
            v = va with heighest na; otherwise choose its own v
         
            send accept(n, v) to all  # 向所有acceptor发送accept request
            if accept_ok(n) from majority:
                send decided(v) to all  # 决定v并通知所有成员

# Acceptor
acceptor state on each node (persistent):
    np      # 最大的promise值
    na, va  # 最大的accepted值
    
    prepare(n) handler:
        if n > np:
            n = np
            send prepare_ok(n)  # 承诺不再接受任何比 n 小的proposal
        else:
            send prepare_reject
    
    accept(n, v) handler:
        if n >= np:
            na = n
            va = v
            send accept_ok(n)
        else:
            send accept_reject

直观理解

这里写图片描述

这里写图片描述

容错性分析(Fault tolerant) [5]

究竟Paxos是如何保证一致性的呢?例子如下。

3.1服务器崩溃(crash)

若有 $2f+1$ 台服务器,则最多可以容忍 $f$ 台服务器崩溃。下面举一个简单的例子,假设一个分布式系统由5个servers组成,其中2个在任意时刻崩溃。存在两种情况:1.AcceptorLearner崩溃了;2.Leader崩溃了。

3.1.1. Acceptor 崩溃

如下图所示,S1Leader,当其发出Accept请求时,S4S5崩溃了。但是S1S2S3仍然构成多数派,所以$v$仍然可以被决定下来。

acceptor crash

3.1.2. Leader 崩溃

Learder崩溃要稍微麻烦一点。首先要有错误检测,发现leader S1挂了。然后,因为没有leader了,所以要重新选举。如图,S1S5挂了,但是S2S2S3仍然构成多数派。S2发出prepare请求,S3S4返回最近接受的$v_1$,$v_1$再次被S2请求接受。于是$v_1$还是成功被决定下来了。

leader crash

3.2 网络分割(network partitioning)

另一种常见错误是网络分割。如下图所示,S1S2S3S4S5之间的通信被断开,分成了两个子网络。在这种悲催的情况下,系统仍然可以达成共识。
一旦发生分割,通过错误检测是可以发现的,例如超时。然后多数派一方就会进行重新选举,如图,S3成为新leader。系统又可以正常运作了。
不过,问题还没完。如果网络通信在某一时刻又恢复正常,分布式系统中就会同时存在两个leader!Paxos还可以保证共识吗?是可以的。因为$n_2>n_1$,S3~S4 已经承诺不再接受比$n_2$小的提案了。所以老leader S1的提案$(n_1,v_1)$会被拒绝,而S3的提案$(n_2,v')$会获得通过。

network partitioning

3.3 消息丢失(message lost)

由于网络层是不可靠的,消息丢失和延时是无法避免的。应对这类错误的主要方法还是重传。

参考文献


  1. 分布式系统:概念与设计, 共识和相关问题 系统模型和问题定义

  2. 分布式系统:概念与设计, 共识和相关问题 同步系统中的共识问题

  3. Lamport,L: Paxos Made Simple. ACM Trans. on Comp. Syst.

  4. MIT 6.824 Lab 3: Paxos-based Key/Value Service

  5. Tutorial Summary: Paxos Explained from Scratch

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

推荐阅读更多精彩内容

  • Paxos是什么 Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有...
    jiangmo阅读 1,529评论 0 6
  • 持续更新 如何浅显易懂地解说 Paxos 的算法? 参考资料 #8:知行学社的分布式系统与Paxos算法视频课程,...
    xiewen阅读 16,677评论 0 44
  • 引言 有人说分布式系统里面就是可用性,可扩展性,可靠性,一致性,性能等各种特性之间的trade off,没有一个功...
    ssdutzs阅读 1,722评论 2 3
  • Paxos算法与Zookeeper分析 1 Paxos算法 1.1基本定义 算法中的参与者主要分为三个角色,同时每...
    meng_philip123阅读 657评论 0 11
  • 1.来源 Paxos算法是莱斯利·兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递的一致性...
    Lane0x阅读 898评论 0 3