basic paxos解析
basic paxos是我见过最难懂的算法,我最近一个月都在研究这个东西,自认有一些粗浅的心得,在这里写一下我对它的理解
为了降低理解难度,本文使用了大量的比喻,可能词不达意,见谅
basic paxos只为了解决一个问题:一个分布式系统如何就某个值(决议)达成一致。
先给出Wiki上对paxos的流程说明:
basic paxos分为两个阶段:
prepare 阶段:
1a) proposer选择一个提案编号n并将prepare请求发送给acceptors中的一个多数派;
1b) acceptor收到prepare消息后,如果提案的编号大于它已经回复的所有prepare消息,则acceptor将自己上次接受的提案回复给proposer,并承诺不再回复小于n的提案;
accept 阶段:
2a) 当一个proposer收到了多数acceptors对prepare的回复后,就进入批准阶段。它要向回复prepare请求的acceptors发送accept请求,包括编号n和根据P2c决定的value(如果根据P2c没有已经接受的value,那么它可以自由决定value)。
2b) 在不违背自己向其他proposer的承诺的前提下,acceptor收到accept请求后即接受这个请求。
p2c:如果一个编号为n的提案具有value v,那么存在一个多数派,要么他们中所有人都没有接受(accept)编号小于n的任何提案,要么他们已经接受(accept)的所有编号小于n的提案中编号最大的那个提案具有value v。
当然,上面说的简直不像是人话。下面我会尝试用更容易理解的方式来描述这个算法。
在拍卖行里拍卖商品时,需要对某个商品竞价。
我们使用basic paxos来限制竞价者(proposer)与记账员(acceptor),希望能在有限轮竞价之后,确定某个商品的归属。
前提
1. 记账员有一张纸,一只铅笔,一只钢笔和一块橡皮。铅笔写下的字迹可以被抹掉,钢笔写下的字迹不能被抹掉。
2. 竞价员可以给自己改名
3. 有一种特殊的机制,可以让竞价者每次的报价都不相同而且递增
竞价过程分为两个阶段:
准备阶段:
1a) 竞价者选择报价n,并将报价n发给超过一半的记账员
1b) 记账员收到竞价者的报价n之后
if(发现这个报价大于他之前收到过的所有报价) {
if(记账员已经用钢笔写下其他竞价者的报价) {
记账员将之前用钢笔写下的报价和竞价者的名字返回
} else {
if(记账员已经用铅笔写下其他竞价者的报价) {
记账员用橡皮抹去上一次用铅笔写下的报价
}
用铅笔写下报价n
}
} else {
忽略
}
确认阶段:
2a) 竞价者收到了大多数记账员的回复后,竞价者会查看收到的所有回复。
如果记账员的回复中带有其他竞价者的名字以及他的报价,那么竞价者会选择其中报价最高的那个回复,然后将自己的名字改成这个回复中带有的名字。
竞价者会向这些记账员发起确认请求,确认请求中含有自己的报价n和自己的名字(名字可能在上一行中被更新)
2b) 记账员收到确认请求之后
if(纸上只有铅笔写的报价n && 纸上用铅笔写下的报价n == 确认请求里的n) {
记账员确认这个请求,用钢笔将确认请求中竞价者的名字和报价n写在纸上
}
补充:如果竞价者没有收到多数派的返回,会提高自己的报价(不与其他竞价者的竞价重复)然后重新尝试竞价
场景分析
前提:我们有p1p2两个竞价者,和a1a2a3三个记账员
场景1
a. p1提出竞价请求:(1)
b. a1a2a3全部收到,都用铅笔在纸上记下(1),并回复p1
c. p1收到a1a2a3的回复,然后向a1a2a3发起确认请求(1,p1)
d. a1a2a3确认,都用钢笔将(1,p1)写在纸上
总结
这是一次正常情况下的请求,a1a2a3最终都记录了相同的值。
实际上,在这个场景里,paxos已经退化成了两阶段提交协议。
场景2
a. p1提出竞价请求:(1)
b. a1a2收到,都用铅笔在纸上记下(1),并回复p1,a3网络中断没有收到请求
c. p1收到a1a2的回复,然后向a1a2发起确认请求(1,p1)
d. a1a2确认,用钢笔将(1,p1)写在纸上
总结
虽然有一台机失效,但是依然保证了多数派写入数据的一致性。
场景3
a. p1提出竞价请求:(1)
b. a1a2a3全部收到,都用铅笔在纸上记下(1),并回复p1
c. p2提出竞价请求:(2)
d. a1a2a3全部收到,由于p2开价更高,于是放弃p1的竞价请求,都用铅笔在纸上记下(2),并回复p2
e. p1收到步骤b中a1a2a3的回复,向a1a2a3发起确认请求(1,p1)
f. 由于a1a2a3的纸上记录的价格都是2,因此不会理睬p1的确认请求
g. p2收到步骤d中a1a2a3的回复,向a1a2a3发起确认请求(2,p2)
h. a1a2a3确认,用钢笔将(2,p2)写在纸上
总结
虽然有两次竞价请求,但是最终只对其中一次竞价请求做出了回应
场景4
a. p1提出竞价请求(1)
b. a1a2收到,都用铅笔在纸上记下(1),并回复p1。而a3没有收到
c. p2提出竞价请求:(2)
d. a2a3收到,a3直接用铅笔在纸上写下(2),a2已经在纸上用铅笔记下(1),但是由于p2开价更高,于是放弃p1的竞价请求,用铅笔在纸上记下(2),并回复p2
e. p1收到步骤b中的回复,向a1a2发起确认请求(1,p1)
f. a1先收到确认请求,用钢笔在纸上记下(1,p1)。a2后收到确认请求,由于a2纸上写的是(2),因此不做反应
g. p1未能达成多数派确认
h. p2收到步骤d中的回复,向a2a3发起确认请求(2,p2)
i. a2a3收到确认请求,用钢笔在纸上记下(2,p2)
j. p2达成多数派确认
总结
两次时序上有交叉的竞价请求,导致a1a2a3的最终结果不完全一致,但是a2a3依然达成了多数派的一致性。
如果想要获得最终确认后的结果,不能只做单点读取(如果读到a1就不对了),需要做一次多数派读取才行。
场景5
a. p1提出竞价请求(1)
b. a1a2a3全部收到,都用铅笔在纸上记下(1),并回复p1
c. p2提出竞价请求:(2)
d. a1a2a3全部收到,由于p2开价更高,于是放弃p1的竞价请求,都用铅笔在纸上记下(2),并回复p2
e. p1收到步骤b中a1a2a3的回复,向a1a2a3发起确认请求(1,p1)
f. 由于a1a2a3的纸上记录的价格都是2,因此不会理睬p1的确认请求
g. p1提高价格,发起竞价请求(3)
h. a1a2a3全部收到,由于p1这次开价更高,于是放弃p2的竞价请求,都用铅笔在纸上记下(3),并回复p1
i. p2收到步骤d中a1a2a3的回复,向a1a2a3发起确认请求(2,p2)
j. 由于a1a2a3的纸上记录的价格都是3,因此不会理睬p2的确认请求
k. p2提高价格,发起竞价请求(4,p2)
。。。
总结
p1和p2不断发起时序上交叉的竞价请求,导致竞价请求不断被互相覆盖
无法形成统一的竞价结果
这个就是所谓的活锁(live lock)
场景6
a. p1提出竞价请求:(1)
b. a1a2收到,都用铅笔在纸上记下(1),并回复p1,a3没有收到请求
c. p1收到a1a2的回复,然后向a1a2发起确认请求(1, p1)
d. a1a2确认,用钢笔将(1,p1)写在纸上
e. p2提出竞价请求(2)
f. a2a3收到,a3直接将(2)用铅笔写在纸上,a2的纸上已经用钢笔写下了(1,p1),因此将此信息返回给p2
g. p2收到a2和a3的回复,发现a2的纸上已经用钢笔写下了(1,p1),因此p2将自己的名字改名为p1,然后向a2a3发起确认请求(2,p1)
h. a3纸上用铅笔写下了(2),与收到的确认请求里的价格相等,因此a3将确认请求(2,p1)用钢笔写在纸上
i. p1在a1a2a3上达成全部确认
总结
虽然p1只在a1和a2上完成多数派确认,但是后来的p2会将这个确认传递给其他的记账员
参考资料
basic paxos解析的更多相关文章
- 从 Basic Paxos 到 Multi Paxos 到 Raft
在朴素Paxos算法中, 各个节点经过 Prepare 和 Accept 阶段, 会达成一个值, 这个值一旦达成, 就不能被修改, 如下例子: 图示1 上面的操作几乎没有任何实用价值, 于是演变成下面 ...
- Paxos 实现日志复制同步(Basic Paxos)
Paxos 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频 ...
- 理解分布式一致性:Paxos协议之Basic Paxos
理解分布式一致性:Paxos协议之Basic Paxos 角色 Proposal Number & Agreed Value Basic Paxos Basic Paxos without f ...
- 从 Paxos 到 ZooKeeper
分布式一致性 分布式文件系统.缓存系统和数据库等大型分布式存储系统中,分布式一致性都是一个重要的问题. 什么是分布式一致性?分布式一致性分为哪些类型?分布式系统达到一致性后将会是一个什么样的状态? 如 ...
- 分布式系统理论进阶 - Paxos
引言 <分布式系统理论基础 - 一致性.2PC和3PC>一文介绍了一致性.达成一致性需要面临的各种问题以及2PC.3PC模型,Paxos协议在节点宕机恢复.消息无序或丢失.网络分化的场景下 ...
- 分布式系统理论进阶 - Paxos变种和优化
引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工程实践,了解基本原理还不够. 有很多基于Pax ...
- 分布式一致性算法--Paxos
Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说, ...
- Paxos算法与Zookeeper分析
1 Paxos算法 1.1 基本定义 算法中的参与者主要分为三个角色,同时每个参与者又可兼领多个角色: ⑴proposer 提出提案,提案信息包括提案编号和提议的value; ⑵acceptor 收到 ...
- Paxos变种和优化
分布式系统理论进阶 - Paxos变种和优化 引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工 ...
随机推荐
- 当网卡收到的包的目的地址是主机上另一个网卡的地址.arp总结
2019/01/13 今天测试发现结果不符合预期呀,发现设置了arp_filter之后,仍然是能ping通主机上的另外一张网卡.但是现在的问题是 -------------------- 内核中是如何 ...
- 关于全球唯一标识符GUID
在C#中的语法: Console.WriteLine(System.Guid.NewGuid()); Console.ReadKey(); System.Guid.NewGuid().ToString ...
- 【题解】NOI2009二叉查找树 + NOIP2003加分二叉树
自己的思维能力果然还是太不够……想到了这棵树所有的性质即中序遍历不变,却并没有想到怎样利用这一点.在想这道题的过程中走入了诸多的误区,在这里想记录一下 & 从中吸取到的教训(原该可以避免的吧) ...
- 【题解】CQOI2012交换棋子
感受到网络流的强大了……这道题目的关键在于: 前后颜色不变的,流入流出的次数相等:原本是黑色的最后变成了白色,流出比流入次数多1:原本是白色最后变成黑色,流入比流出次数多一.所以我们将每一点拆成3个点 ...
- ibeacon UUID
import sys; import uuid; s=uuid.uuid4().hex #s="f6bc15e0939046679be1866ec8a199dc" sys.stdo ...
- TCP ------ RST的产生
产生RST的几个原因 1.请求超时 有89.27两台主机.主机89向主机27发送了一个SYN,表示希望连接8888端口,主机27回应了主机89一个SYN表示可以连接.但是主机89莫名其妙的发送了一个R ...
- Android 实现对图片 Exif 的修改(Android 自带的方法)
很多时候我们都要对我们的图片信息进行一些处理,比如向图片中写入经纬度,拍摄时间,设备信息,作者等等. 这个时候我们就要对我们的图片Exif进行写入信息的操作,当然,我们想知道图片的Exif信息,也可以 ...
- struts2学习问题(一)
一.struts2 Unknown tag (s:property). 解释:不识别标签 解决:这是sturts2的标签,导入相应的包<%@taglib prefix="s" ...
- 线段树+矩阵快速幂 Codeforces Round #373 (Div. 2) E
http://codeforces.com/contest/719/problem/E 题目大意:给你一串数组a,a[i]表示第i个斐波那契数列,有如下操作 ①对[l,r]区间+一个val ②求出[l ...
- CentOS 7 安装python3.6.1
说明:CentOS 7最小化安装,默认Python 2.7 ,开发需要安装python3.6.1 . 1.检查python版本 [root@bogon ~]# python -VPython 2.7. ...