分布式系统中的一致性协议
本文详细介绍目前分布式系统中常见的一些一致性协议:两阶段提交协议,三阶段提交协议,向量时钟,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
分布式系统中的一致性协议相关推荐
- 分布式系统中的一致性协议之两阶段提交协议(2PC)
分布式系统中的一致性协议之两阶段提交协议(2PC) 两阶段提交协议是很常见的解决分布式事务的方式,他可以保证分布式事务中,要么所有参与的进程都提交事务成功,要么都取消事务,这样做可以在分布式环境中保持 ...
- redis实现轮询算法_白话分布式系统中的一致性哈希算法
本文首发于:白话分布式系统中的一致性哈希算法 微信公众号:后端技术指南针 持续输出干货 欢迎关注! 通过本文将了解到以下内容:分布式系统的概念和作用 分布式系统常用负责均衡策略 普通哈希取模策略优缺点 ...
- 分布式应用中的一致性协议
在一个分布式系统中,需要一个规定来保证数据的一致性.各节点服务的容错性等等,这个规定就是一致性协议.常见的分布式协议有2PC.3PC.Paxos和raft等. 2PC 即Two-Phase Commi ...
- 「数据一致性」理解分布式系统中的一致性
首先,什么是一致性? 一致性是指分布式系统中多个节点为达到某一数值而达成的协议. 具体来说,可以分为强一致性和弱一致性. 强一致性:所有节点的数据在任何时候都是相同的.同时,您应该得到节点A中的key ...
- 分布式系统中的一致性hash
转载来源: https://zhuanlan.zhihu.com/p/92742908 通过本文将了解到以下内容: 分布式系统的概念和作用 分布式系统常用负责均衡策略 普通哈希取模策略优缺点 一致性哈 ...
- 分布式系统中的一致性模型
文章目录 什么是一致性模型? 强一致性模型 线性一致性(Linearizable Consistency) 顺序一致性(Sequential Consistency) 弱一致性模型 因果一致性(Cau ...
- NET Core微服务之路:再谈分布式系统中一致性问题分析
前言 一致性:很多时候表现在IT系统中,通常在分布式系统中,必须(或最终)为多个节点的数据保持一致.世间万物,也有存在相同的特征或相似,比如儿时的双胞胎,一批工厂流水线的产品,当然,我们不去讨论非IT ...
- 分布式系统中节点之间的同步形成区块链
链客,专为开发者而生,有问必答! 此文章来自链客区块链技术问答社区,未经允许拒绝转载. 分布式系统中节点之间的同步形成区块链 分布式系统由Tanenbaum定义,"分布式系统是一组独立的计算 ...
- 【人工智能 Open AI】解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明。
解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明. 文章目录 Raft 简介 Raft Protocol Description Raft 协议讲解 Raft vs. Paxos Raft ...
最新文章
- 《大话数据结构》读书笔记-线性表
- Python Cookbook(第3版)中文版:15.17 传递文件名给C扩展
- Windows phone msdn 索引
- 如何使用CREO来导入多个带坐标系参数的零件的装配图档
- python 删除尾部0_python之List常见操作
- java app退出登录_java – 通过从一个Activity调用一个函数,将退出按钮添加到Android App...
- 95-36-210-ChannelHandler-系统Channel-TimeoutHandler
- 通过DMVS采集并存储SQL Server性能计数器数据
- 代码描述10911 - Forming Quiz Teams
- Mandelbrot vs Julia
- 好用的import: Vite的Glob 导入
- CocosCreator动画背景移动及其小鸟重力加速度坠落
- 红帽RHEL5U4平台实现pppoe+freeradius+mysql认证服务器(一)
- Mac Android studio 修改历史查看
- pdf转jpg的在线与用转换器的转换方法
- 面向价值实现的数据资产管理体系构建
- 英语各种数字表达方式大全(转载)
- AI上推荐 之 NeuralCF与PNN模型(改变特征交叉方式)
- Md5加密算法的原理及应用
- JIS-CTF解题思路及关键语句
热门文章
- 服务器里怎么维修装备,教你在服务器加自己的装备
- linux驱动大小,为什么在Linux字符驱动程序读取调用中大小总是= 4096?
- 计算机网络王小茹,计算机网络(王小茹)3.pdf
- PHP 运动会,运动会成绩管理系统
- java算法编程题_【java题目】考验你编程能力和算法的时候到了
- linux密码暴力破解之SHA-512破解
- linux笔记之 开机服务启动的控制,系统日志的查看,防火墙的关闭
- 没有运行 spring_Spring事务的传播行为案例分析
- java socket通信安全_Java Socket通信
- html鼠标点击有手势出来,用原生js+css3撸的一个下拉手势事件插件