2pc、3pc、paxos、raft都是解决分布式系统中的一致性问题的。

一、两个类型的一致性(操作原子性与副本一致性)

1.2pc、3pc协议用于保证属于多个数据分片上的操作的原子性。这些数据分片可能分布在不同的服务器上,2PC、3PC协议保证多台服务器上的操作要么全部成功,要么全部失败。

2.Paxos协议用于保证同一个数据分片的多个副本之间的数据一致性。当这些副本分布到不同的数据中心时。Raft协议解决Paxos的实现难度
关于2PC 3PC:分布式事务之2pc、3pc

关于:分布式之flp、cap、base理论、一致性问题、共识算法

二、Paxos

参考:分布式系列文章——Paxos算法原理与推导

1.简介:

Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法,它曾就此发表了《The Part-Time Parliament》,《Paxos Made Simple》,由于采用故事的方式来解释此算法,感觉还是很难理解。

Paxos算法是目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致。比如master-slave模式下的选主。

在常见的分布式系统中,总会发生诸如机器宕机或网络异常(包括消息的延迟、丢失、重复、乱序,还有网络分区)等情况。Paxos算法需要解决的问题就是如何在一个可能发生上述异常的分布式系统中,快速且正确地在集群内部对某个数据的值达成一致。即是分布式系统中达成状态的一致性。

这里某个数据的值并不只是狭义上的某个数,它可以是一条日志,也可以是一条命令(command)。。。根据应用场景不同,某个数据的值有不同的含义。

多个节点之间存在两种通讯模型:

共享内存(Shared memory)

消息传递(Messages passing)

Paxos是基于消息传递的通讯模型的。

故障(不响应)的情况称为“非拜占庭错误”恶意响应的情况称为“拜占庭错误”(对应节点为拜占庭节点)

Paxos解决的是非拜占庭错误,即是Paxos的前提是假设信道是安全的,信号是不被篡改的。 

Paxos并没有违背FLP不可能原理,Paxos放松了对liveness可终止性的要求,因此Paxos/Raft才能认为是可行的, 严格讲Paxos可能永远无法结束

2.Paxos算法中的3种角色

Proposer 提案者

作用:负责提出提案Proposal

Proposer 在什么情况下才能认为某个value被选定呢?

只要Proposer发的提案被半数以上的Acceptor接受,Proposer就认为该提案里的value被选定了。

Acceptor 决策者

为了避免单点故障,会有一个Acceptor集合,Proposer像Acceptor集合发送提案

作用:负责对提案作出裁决(accept与否)

Acceptor在什么情况下才能认为某个value被选定呢?

只要Acceptor接受了某个提案,Acceptor就认为该提案里的value被选定了。

Learners 学习者

作用:负责学习提案结果

Learners在什么情况下才能认为某个value被选定呢?

Acceptor告诉Learner哪个value被选定,Learner就认为那个value被选定。

3.对于一致性算法,安全性(safaty)要求如下:

  • 只有被提出的value才能被选定。
  • 只有一个value被选定,并且
  • 如果某个进程认为某个value被选定了,那么这个value必须是真的被选定的那个。

我们不去精确地定义其活性(liveness)要求。我们的目标是保证最终有一个提出的value被选定。当一个value被选定后,进程最终也能学习到这个value。

Paxos的目标:保证最终有一个value会被选定,当value被选定后,进程最终也能获取到被选定的value。

三、Paxos算法描述

Paxos算法类似于两阶段提提交,其算法执行过程分为两个阶段。具体如下:

阶段一(prepare阶段):

(a) Proposer选择一个提案编号N,然后向半数以上的Acceptor发送编号为N的Prepare请求。Pareper(N)

(b) Acceptor收到一个编号为N的Prepare请求,

如果N小于它已经响应过的请求:

拒绝,不回应或回复error。

若N大于该Acceptor已经响应过的所有Prepare请求的编号(maxN):

那么它就会将它已经接受过(已经经过第二阶段accept的提案)的编号最大的提案(如果有的话,如果还没有的accept提案的话返回{pok,null,null})作为响应反馈给Proposer。

同时该Acceptor承诺不再接受任何编号小于N的提案。

阶段二(accept阶段):

(a) 如果一个Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它就会发送一个针对[N,V]提案的Accept请求给半数以上的Acceptor。

注意:V就是收到的响应中编号最大的提案的value(某个acceptor响应的它已经通过的{acceptN,acceptV}),如果响应中不包含任何提案,那么V就由Proposer自己决定

(b) 如果Acceptor收到一个针对编号为N的提案的Accept请求,

只要该Acceptor没有对编号大于N的Prepare请求做出过响应,它就接受该提案。

如果N小于Acceptor以及响应的prepare请求,则拒绝,不回应或回复error

(当proposer没有收到过半的回应,那么他会重新进入第一阶段,递增提案号,重新提出prepare请求)。

流程图:

四、具体例子

问题背景:假设我们有下图的系统,想要在server1,server2,server3选一个master。

1.prepare阶段

(1)每个server向proposer发送消息,表示自己要当leader,

假设proposer收到消息的时间不一样,顺序是: proposer2 -> proposer1 -> proposer3,消息编号依次为1、2、3。

紧接着,proposer将消息发给acceptor中超过半数的子成员(这里选择两个),

如上图所示,

proposer2向acceptor2和acceptor3发送编号为1的消息,

proposer1向acceptor1和accepto2发送编号为2的消息,

proposer3向acceptor2和acceptor3发送编号为3的消息。

(2)假设这时proposer1发送的消息先到达acceptor1和acceptor2,

它们都没有接收过请求,所以接收该请求并返回【pok,null,null】给proposer1,

同时acceptor1和acceptor2承诺不再接受编号小于2的请求;

紧接着,proposer2的消息到达acceptor2和acceptor3,

acceptor3没有接受过请求,所以返回proposer2 【pok,null,null】,acceptor3并承诺不再接受编号小于1的消息。

而acceptor2已经接受proposer1的请求并承诺不再接收编号小于2的请求,所以acceptor2拒绝proposer2的请求;

最后,proposer3的消息到达acceptor2和acceptor3,它们都接受过提议,但编号3的消息大于acceptor2已接受的2和acceptor3已接受的1,所以他们都接受该提议,并返回proposer3 【pok,null,null】;

此时,proposer2没有收到过半的回复,所以重新取得编号4,并发送给acceptor2和acceptor3,此时编号4大于它们已接受的提案编号3,所以接受该提案,并返回proposer2 【pok,null,null】。

2.accept阶段

(1)

Proposer3收到半数以上(两个)的回复,并且返回的value为null,所以,proposer3提交了【3,server3】的提案。 
  Proposer1也收到过半回复,返回的value为null,所以proposer1提交了【2,server1】的提案。 
  Proposer2也收到过半回复,返回的value为null,所以proposer2提交了【4,server2】的提案。

(这里要注意,并不是所有的proposer都达到过半了才进行第二阶段,这里只是一种特殊情况)

(2) 
  Acceptor1和acceptor2接收到proposer1的提案【2,server1】,acceptor1通过该请求,acceptor2承诺不再接受编号小于4的提案,所以拒绝; 
  Acceptor2和acceptor3接收到proposer2的提案【4,server2】,都通过该提案; 
  Acceptor2和acceptor3接收到proposer3的提案【3,server3】,它们都承诺不再接受编号小于4的提案,所以都拒绝。

所以proposer1和proposer3会再次进入第一阶段,

但这时候 Acceptor2和acceptor3已经通过了提案(AcceptN = 4,AcceptV=server2),并达成了多数,

所以proposer会递增提案编号,并最终改变其值为server2。最后所有的proposer都肯定会达成一致,这就迅速的达成了一致。

  此时,过半的acceptor(acceptor2和acceptor3)都接受了提案【4,server2】,

learner感知到提案的通过,learner开始学习提案,所以server2成为最终的leader

五、Learner学习被选定的value

Learner学习(获取)被选定的value有如下三种方案:

六、如何保证Paxos算法的活性

通过选取主Proposer,就可以保证Paxos算法的活性。至此,我们得到一个既能保证安全性,又能保证活性分布式一致性算法——Paxos算法

分布式一致性算法之Paxos相关推荐

  1. 分布式一致性算法 之 Paxos算法

    http://zh.wikipedia.org/zh/Paxos%E7%AE%97%E6%B3%95 转载于:https://www.cnblogs.com/Donal/archive/2012/08 ...

  2. 分布式一致性算法——Paxos 和 Raft 算法

    写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见100个问题搞定大数据理 ...

  3. 【Raft】分布式一致性算法Raft和zab、paxos

    目录 前言 Raft算法 Raft动画教程 Raft手动设置模拟 Raft协议说明 Raft和zab区别 paxos算法 前言 开发面试Zookeeper肯定要问,Zab协议逃不掉,那么和 Raft ...

  4. 分布式一致性协议 之 Paxos协议

    1.什么是Paxos Paxos协议其实说的就是Paxos算法, Paxos算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一. Paxos由 莱斯利· ...

  5. Paxos分布式一致性算法简介和Apache ZooKeeper的概念映射

    为什么80%的码农都做不了架构师?>>>    Paxos是一个基于消息传递的一致性算法,近几年被广泛应用于分布式计算中,Google的Chubby,Apache的Zookeeper ...

  6. 深入浅出Paxos分布式一致性算法

    深入浅出Paxos分布式一致性算法

  7. Paxos、Raft分布式一致性算法应用场景

    本文是Paxos.Raft分布式一致性最佳实践的第一篇文章,说明分布式一致性问题与分布式一致性算法的典型应用场景,帮助后面大家更好的理解Paxos.Raft等分布式一致性算法. 一.分布式一致性 (C ...

  8. 分布式一致性算法-paxos详解与分析

    前言 在Paxos算法面前,其他分布式一致性算法都是渣渣,都是残次品.Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品. ...

  9. 区块链共识算法(4)分布式一致性算法Paxos

    # 分布式一致性算法Paxos Paxos是一种基于消息传递的分布式一致性算法,由Leslie Lamport(莱斯利·兰伯特)于1990提出. 是目前公认的解决分布式一致性问题的最有效算法之一. # ...

最新文章

  1. 用C语言解“12-24小时制”题
  2. Windows Azure Virtual Machine (34) Azure VM挂载WebDAV
  3. [计算机视觉]人脸应用:人脸检测、人脸对比、五官检测、眨眼检测、活体检测、疲劳检测
  4. Tensorflow实现简单神经网络
  5. Ajax实现异步操作实例_针对XML格式的请求数据
  6. JDBC的开发流程是什么?
  7. 实操笔记:为 NSQ 配置监控服务的心路历程
  8. intellij导入scala工程不识别scala语言
  9. Qt中为自己的程序建立一个消息循环
  10. 使用数据库保存Asterisk sip账号信息(odbc方式)
  11. SLAM——绘制高精度地图的研究笔记
  12. 实验7 BindService模拟通信
  13. Silverlight 5的新功能预测
  14. java重命名文件(附道客巴巴文档下载方法)
  15. 多人上传文件公共网盘_360安全云盘多人共享完整版
  16. php模拟post提交 在线,curl post请求 , postman 模拟请求 , 在线测试工具模拟请求...
  17. Airbnb短租房源数据可视化
  18. Redis数据结构-sds
  19. SVN 查看用户名密码
  20. 用opencv实现两张半透明png图片以一定透明度叠加

热门文章

  1. 【MATLAB基础绘图第12棒】绘制饼状图
  2. Oracle如何删除表空间
  3. html+css+js实现一个简单的电商商城首页
  4. .tar实现对文件和目录的压缩解压缩
  5. 运营商 html劫持 原理,细数宽带运营商常见的几种http劫持行为
  6. 1 前端 HTTP协议 HTML介绍
  7. 蒙哥马利快速幂摸算法
  8. 7.01 计算平均值
  9. mac苹果电脑打开应用程序提示错误的处理方法
  10. switch语句解决ATN取款机问题