本文详细介绍目前分布式系统中常见的一些一致性协议:两阶段提交协议,三阶段提交协议,向量时钟,RWN协议,paxos协议,Raft协议。下面就一个个详细讲解下。

一. 两阶段提交协议(2PC)
两阶段提交协议,简称2PC,是比较常用的解决分布式事务问题的方式,要么所有参与进程都提交事务,要么都取消事务,即实现ACID中的原子性(A)的常用手段。
两阶段提交将提交过程划分为连续的两个阶段:表决阶段(Voting)和提交阶段(Commit)。假设在没有故障发生的情形下,两阶段提交协议由下列操作序列构成,如下图所示:

协调者的有限状态机如下图:

如上图所示:协调者初始处于INIT状态,当接收到系统发出的Commit消息后,向参与者多播Vote-request消息后转入WAIT状态,在此进入阻塞状态,因为要等待所有参与者发送返回的消息,当收到所有参与者的返回消息后,如果其中包含Vote-Abort消息,则多播Global-abort消息后转入ABORT状态,否则多播Global-commit消息后转入COMMIT状态。
参与者的有限状态机如下图:

如上图所示:参与者初始处于INIT状态,当接收到Vote-Request消息时,发出Vote-commit会转入READY状态,告诉协调者已经准备做好提交准备,否则就返回一个VOTE-ABORT消息。等待协调者行为,如果收到Global-Abort消息,就会进入Abort状态,如果收到Global-commit消息,就会转入COMMIT状态。
从两者的有限状态机可以看出,在所有可能状态中,存在三个阻塞状态:协调者的WAIT状态,参与者的INIT状态和READY状态。

二. 三阶段提交协议(3PC)
3PC就是在2PC基础上将2PC的提交阶段细分位两个阶段:预提交阶段和提交阶段。
3PC中协调者的有限状态机如下图:

3PC中参与者的有限状态机如下图:

三. 向量时钟
通过向量空间祖先继承的关系比较, 使数据保持最终一致性,这就是向量时钟的基本定义。
下面给出一个场景来说明向量时钟的作用:

Vector Clock就是为了解决这种问题而设计的,简单来说,就是为每个商议结果加上一个时间戳,当结果改变时,更新时间戳。所以加上时间戳之后,我们再一次描述上面的场景,如下:

以上这个决策用到了向量时钟,有个图还比较清晰了说明整个过程:

四. NWR协议
NWR是一种在分布式存储系统中用于控制一致性级别的一种策略。在Amazon的Dynamo云存储系统中,就应用NWR来控制一致性。
让我们先来看看这三个字母的含义:
N:在分布式存储系统中,有多少份备份数据
W:代表一次成功的更新操作要求至少有w份数据写入成功
R: 代表一次成功的读数据操作要求至少有R份数据成功读取
NWR值的不同组合会产生不同的一致性效果,当W+R>N的时候,整个系统对于客户端来讲能保证强一致性。当W+R 以常见的N=3、W=2、R=2为例:
N=3,表示,任何一个对象都必须有三个副本(Replica),W=2表示,对数据的修改操作(Write)只需要在3个Replica中的2个上面完成就返回,R=2表示,从三个对象中要读取到2个数据对象,才能返回。
在分布式系统中,数据的单点是不允许存在的。即线上正常存在的Replica数量是1的情况是非常危险的,因为一旦这个Replica再次错误,就 可能发生数据的永久性错误。假如我们把N设置成为2,那么,只要有一个存储节点发生损坏,就会有单点的存在。所以N必须大于2。N约高,系统的维护和整体 成本就越高。工业界通常把N设置为3。
当W是2、R是2的时候,W+R>N,这种情况对于客户端就是强一致性的。

在上图中,如果R+W>N,则读取操作和写入操作成功的数据一定会有交集(如图中的B),这样就可以保证一定能够读取到最新版本的更新数据,数据的强一致性得到了保证。在满足数据一致性协议的前提下,R或者W设置的越大,则系统延迟越大,因为这取决于最慢的那份备份数据的响应时间。而如果R+W<=N,则无法保证数据的强一致性,因为成功写和成功读集合可能不存在交集,这样读操作无法读取到最新的更新数值,也就无法保证数据的强一致性。
在具体实现系统时,仅仅依靠NWR协议还不能完成一致性保证,因为在上述过程中,当读取到多个备份数据时,需要判断哪些数据是最新的,如何判断数据的新旧?这需要向量时钟来配合,所以对于Dynamo来说,是通过NWR协议结合向量时钟来共同完成一致性保证的。

五. paxos协议
Paxos协议的基础比较难以理解,这里就不枯燥无味的介绍paxos协议的理论基础,这方面的资料也是非常多的。估计大家也不希望看到很多理论,公式很多。这里给出几个参考资料供阅读:

1.  架构师需要了解的Paxos原理,历程及实践:http://chuansong.me/n/2189245

2.  微信自研生产级Paxos类库Phxpaxos实现原理介绍:http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483695&idx=1&sn=91ea422913fc62579e020e941d1d059e#rd

3.  数据一致性与Paxos算法(上,中,下三篇文章): http://blog.csdn.net/yinwenjie/article/details/60584554

六. Raft协议
1.  Raft协议的动画: http://thesecretlivesofdata.com/raft/

2.  https://raft.github.io/

参考资料:
Vector Clock. http://en.wikipedia.org/wiki/Vector_clock
Leslie Lamport. Paxos Made Simple. ACM SIGACT News
The chubby lock service for loosely-coupled distributed systems.pdf
Diego Ongaro and John Ousterhout. In Search of an Understandable Consensus Algorithm
http://www.cnblogs.com/yanghuahui/p/3767365.html
other resources
————————————————
版权声明:本文为CSDN博主「快乐的霖霖」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chdhust/article/details/52651741

分布式系统中的一致性协议相关推荐

  1. 分布式系统中的一致性协议之两阶段提交协议(2PC)

    分布式系统中的一致性协议之两阶段提交协议(2PC) 两阶段提交协议是很常见的解决分布式事务的方式,他可以保证分布式事务中,要么所有参与的进程都提交事务成功,要么都取消事务,这样做可以在分布式环境中保持 ...

  2. redis实现轮询算法_白话分布式系统中的一致性哈希算法

    本文首发于:白话分布式系统中的一致性哈希算法 微信公众号:后端技术指南针 持续输出干货 欢迎关注! 通过本文将了解到以下内容:分布式系统的概念和作用 分布式系统常用负责均衡策略 普通哈希取模策略优缺点 ...

  3. 分布式应用中的一致性协议

    在一个分布式系统中,需要一个规定来保证数据的一致性.各节点服务的容错性等等,这个规定就是一致性协议.常见的分布式协议有2PC.3PC.Paxos和raft等. 2PC 即Two-Phase Commi ...

  4. 「数据一致性」理解分布式系统中的一致性

    首先,什么是一致性? 一致性是指分布式系统中多个节点为达到某一数值而达成的协议. 具体来说,可以分为强一致性和弱一致性. 强一致性:所有节点的数据在任何时候都是相同的.同时,您应该得到节点A中的key ...

  5. 分布式系统中的一致性hash

    转载来源: https://zhuanlan.zhihu.com/p/92742908 通过本文将了解到以下内容: 分布式系统的概念和作用 分布式系统常用负责均衡策略 普通哈希取模策略优缺点 一致性哈 ...

  6. 分布式系统中的一致性模型

    文章目录 什么是一致性模型? 强一致性模型 线性一致性(Linearizable Consistency) 顺序一致性(Sequential Consistency) 弱一致性模型 因果一致性(Cau ...

  7. NET Core微服务之路:再谈分布式系统中一致性问题分析

    前言 一致性:很多时候表现在IT系统中,通常在分布式系统中,必须(或最终)为多个节点的数据保持一致.世间万物,也有存在相同的特征或相似,比如儿时的双胞胎,一批工厂流水线的产品,当然,我们不去讨论非IT ...

  8. 分布式系统中节点之间的同步形成区块链

    链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 分布式系统中节点之间的同步形成区块链 分布式系统由Tanenbaum定义,"分布式系统是一组独立的计算 ...

  9. 【人工智能 Open AI】解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明。

    解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明. 文章目录 Raft 简介 Raft Protocol Description Raft 协议讲解 Raft vs. Paxos Raft ...

最新文章

  1. 《大话数据结构》读书笔记-线性表
  2. Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展
  3. Windows phone msdn 索引
  4. 如何使用CREO来导入多个带坐标系参数的零件的装配图档
  5. python 删除尾部0_python之List常见操作
  6. java app退出登录_java – 通过从一个Activity调用一个函数,将退出按钮添加到Android App...
  7. 95-36-210-ChannelHandler-系统Channel-TimeoutHandler
  8. 通过DMVS采集并存储SQL Server性能计数器数据
  9. 代码描述10911 - Forming Quiz Teams
  10. Mandelbrot vs Julia
  11. 好用的import: Vite的Glob 导入
  12. CocosCreator动画背景移动及其小鸟重力加速度坠落
  13. 红帽RHEL5U4平台实现pppoe+freeradius+mysql认证服务器(一)
  14. Mac Android studio 修改历史查看
  15. pdf转jpg的在线与用转换器的转换方法
  16. 面向价值实现的数据资产管理体系构建
  17. 英语各种数字表达方式大全(转载)
  18. AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)
  19. Md5加密算法的原理及应用
  20. JIS-CTF解题思路及关键语句

热门文章

  1. 服务器里怎么维修装备,教你在服务器加自己的装备
  2. linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?
  3. 计算机网络王小茹,计算机网络(王小茹)3.pdf
  4. PHP 运动会,运动会成绩管理系统
  5. java算法编程题_【java题目】考验你编程能力和算法的时候到了
  6. linux密码暴力破解之SHA-512破解
  7. linux笔记之 开机服务启动的控制,系统日志的查看,防火墙的关闭
  8. 没有运行 spring_Spring事务的传播行为案例分析
  9. java socket通信安全_Java Socket通信
  10. html鼠标点击有手势出来,用原生js+css3撸的一个下拉手势事件插件