paxos协议(1)-朴素paxos
前言
学习paxos协议,最困惑我的两点是:
1. 朴素paxos是怎么样的?这部分主要是原理;
2. paxos协议是怎么运用到分布式系统解决问题的。因为很多博客的开篇说paxos协议可以运用在很多地方,如:分布式中的一致性、NoSQL中的数据更新。然而博客中又是以论文中的三个小岛的场景去解释,作为初学者,我没有把该协议解决的问题和算法的步骤联系起来。
1.朴素paxos的提出
paxos解决的是:如何确定一个不可变变量取值问题。比如,我们三个人同时拿笔写东西,我们要用一个协议去约定我们写的东西,使得我们三个写的东西是一样的,而且我们所写的东西不可更改。这时候最大的困惑是:这个和Nosql数据更新怎么联系起来,先不要想它的运用场景,就这个不可变变量的取值问题去理解朴素的paxos算法,之后再去看运用。
(1)如何实现这个系统?
需求:需要一个存储系统,存储一个变量var,这个变量var的取值要么是v,要么是null。一旦这个变量var的取值被确定为v,那么不可改变。
三种角色定义:
Proposer——提出一个proposal(该proposal目前就是就是:把一个值写进系统中)
Acceptor——同意这个proposal
Learner—— 每当一个proposal被Acceptor确定之后,需要Learner知道
方案1:如果Accepter只有一个,我们可以把所有的proposal都发到这个acceptor,它选取收到的第一个proposal并同意proposal即可保证一致性。
问题:Acceptor发生单点故障这个系统就挂了。
方案2: 引入多Acceptor。
P1: 批准者必须批准它收到的第一个议案。但是这样并不能保证所有acceptor接受的是同一个值的proposal。
将proposal编号(这时候proposal有两个信息一个是编号n,一个是数值v),这个proposal有三个状态:被提出(issued)、被接受(accepted)、被最终选定(choosen)。
P2: 如果编号n的proposal已经被最终选定,那么高于编号n、被最终选定(choosen)的proposal包含数值v。
P2a.如果编号n的proposal已经被选择,那么高于编号n、被acceptor接受的proposal包含数值v;
P2b 如果编号n的proposal已经被选择,那么高于编号n、被proposer提出的proposal包含数值v;
P2c 对于每一个<n,v>,如果任何一个proposal<n,v>被提出,必须有超过半数的acceptor构成一个集合S,才能够被最终选定,
这个集合S要么满足以下条件(a),要么满足条件(b).
(a)没有小于编号n的proposal被S中的acceptor接受;
(b)v是S接受过的比n小的提案中号码最大的提案的值;
P2c=>P2b=>P2a=>P2,详情可以参考博文:paxos算法1-算法形成理论。
所以要实现这个系统,需要实现P2b和p1。
算法执行步骤:
第一阶段:
第二阶段:
用视频中例子来跑这个算法。
a.执行phrase 1(a),发起prepare请求,试图获取访问权,进入phrase1(b),因为目前还acceptor都没有回复过proposor,所以最大编号的当然是 #1,
并且这时候接收到这个prepare请求的acceptor把 #1作为当前最大编号,不会接收小于这个编号的proposal。
b. 这时候收到半数的回复,进入第二阶段,发送一个accept 请求到多数的acceptor,prase2(a)中说的这个V值怎么取?如果prepare阶段中,acceptor回应中包含了value,则取其编号最大的那个,作为v;如果回应中不包含任何value,则proposer随意选择一个。因为这里是不包含任何value,那么就取Accept<#1,v1>,试图让acceptor接受这个值。按照prase b,这个时候收到的是#1的accept请求,所以它就接受这个accept
c. 按照prase2(a),收到acceptor对于prepare的回复之后,会向它们发起accept请求,但是在网络中会存在延时的问题,可能发生的情况是p2试图发起prepare请求。这个时候,执行phrase1(b),这个时候访问权被p2抢占。
d.p2进入prase2,但是这时候恰好p1执行prase2阶段的话,获得#2访问权的acceptor就会把p1发来的accept给refuse掉。这时候p1收到ok,按照prase1(a),它收到了超过半数的回复,那么实际上它已经是确定性取值了。
e.进入p2的prase2阶段之后,如果prepare阶段中,acceptor回应中包含了value,则取其编号最大的那个,作为v;如果回应中不包含任何value,则proposer随意选择一个。这里p2就是选取编号最大的一个#1,然后accept中带#1对应的value v1 .
这里p1形成了 确定性取值,v2也形成了确定性取值。如果只有p2形成确定性取值,取值还是v1.
(2)活锁问题
在上面的例子中,如果总是在prase2完成之前,下一个prase1发生,这就是活锁。
(3)唯一编号问题
reference
paxos-simple[1]
[1]论文中经常提到拜占庭错误,如果没兴趣了解可以先忽略,不影响paxos的理解
paxos协议(1)-朴素paxos的更多相关文章
- 理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos
理解分布式一致性:Paxos协议之Generalized Paxos & Byzantine Paxos Generalized Paxos Byzantine Paxos Byzantine ...
- 理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos
理解分布式一致性:Paxos协议之Cheap Paxos & Fast Paxos Cheap Paxos Message flow: Cheap Multi-Paxos Fast Paxos ...
- 理解分布式一致性:Paxos协议之Basic Paxos
理解分布式一致性:Paxos协议之Basic Paxos 角色 Proposal Number & Agreed Value Basic Paxos Basic Paxos without f ...
- Paxos协议理解
第三次报告: 理解Paxos协议 一. Paxos协议背景 什么是Paxos协议? 一般地,从客户端和服务器的角度,任何一个分布式系统都可以理解成由一个服务器集合和一个客户端集合组成,一个或多个客户端 ...
- 理解分布式一致性:Paxos协议之Multi-Paxos
理解分布式一致性:Paxos协议之Multi-Paxos Multi-Paxos without failures Multi-Paxos when phase 1 can be skipped Mu ...
- Paxos协议超级详细解释+简单实例
转载自: https://blog.csdn.net/cnh294141800/article/details/53768464 Paxos协议超级详细解释+简单实例 Basic-Paxos算法 ...
- 11张PPT介绍Paxos协议
之前翻译了<The Part-Time Parliament>一文,论文非常经常,强烈推荐读一读原文.翻译完论文后,希望自己能用简单的描述来整理自己的理解,所以花了一些时间通过PPT的形式 ...
- Paxos协议笔记
对Paxos协议的介绍,可以通过Leslie Lamport的<Paxos Made Simple>展开学习和了解.Paxos算法在允许失败的分布式系统环境下,实现系统一致性.失败的情况有 ...
- SRE学习笔记:分布式共识系统、Paxos协议
最近阅读了<SRE Google运维解密>的第23章,有一些感触,记录一下. 日常工作中,我们经常需要一些服务分布式的运行.跨区域如跨城.跨洲部署运行分布式系统往往是容易的,但是如何保证各 ...
随机推荐
- input自定义样式上传图片
在我们写网页的时候,有很多各种各样的上传图片的样式,但是input 的 type="file" 的样式是不可被更改的. 其实我们要的只是input的点击,清楚这点就行了. CSS部 ...
- C#基础-for循环执行顺序
for(表达式1;表达式2;表达式3) {循环体} 执行顺序:1-表达式1赋值 2-判断表达式2是否为真 3-表达式2如果为否跳出for循环,如果为真执行循环体 4-执行表达式3 5-判断表达式2继续 ...
- Hololens开发笔记:UDP接收数据
Hololens的应用需要与其他设备通信的时候,UDP是比较方便的一种方式,Unity3d 2017.3 C#开发的时候可以用Windows.Networking.Sockets.DatagramSo ...
- LintCode2016年8月22日算法比赛----克隆二叉树
克隆二叉树 题目描述 深度复制一个二叉树. 给定一个二叉树,返回一个它的克隆品. 样例 给定一个二叉树: 1 / \ 2 3 / \ 4 5 返回其相同结构相同数值的克隆二叉树: 1 / \ 2 3 ...
- RecyclerView之UI与数据绑定
package activity.cyq.com.learnrsv; import android.support.v7.widget.RecyclerView; import android.vie ...
- 如何提高 Java 中锁的性能
锁不是问题的根源,锁之间的竞争才是 通常在多线程的代码中遇到性能方面的问题时,一般都会抱怨是锁的问题.毕竟锁会降低程序的运行速度和其较低的扩展性是众所周知的.因此,如果带着这种“常识”开始优化代码,其 ...
- nginx部署及简单优化
研究nginx优化时反复安装清理nginx,为方便做了一个简单部署脚本,用的最新稳定版1.14.0,默认路径,加入systemd系统进程管理中,可以通过systemd管理nginx的启动.终止.重载. ...
- Exchange2016 & Skype for business集成之二 OWA集成IM
Microsoft Outlook Web App 和IM集成部署或升级Exchange server 2016与Skype for business 2015后使用原来2013版本方法集成OWA网页 ...
- Web前端——jQuery----细节
jQuery终极思想:创建jQuery对象(当发现相同的选择器在你的代码里出现多次时,请用变量把它储存起来.一切面向对象) 认识jQuery 1.jQuery库可以做什么? HTML元素选取 HTML ...
- OC继承
1.成员访问类型 private:私有成员,不能被外部函数访问(使用),也不能被子类继承: protected:保护成员,不能被外部函数访问,可以被子类继承: public:公有成员,可以被外部函数访 ...