分布式系统中的一致性协议

前言

在分布式系统设计的过程中,我们需要考虑cap理论的指导思想,如下图所示,P分区容错性,考虑到分布式系统部署在多个结点上,因此分区容错性是分布式系统的最基本要具备的。因此我们只能在一致性和可用性之间作权衡。于是就出现了很多一致性协议。著名的协议有二阶段提交协议,三阶段提交协议和Paxos算法。本文主要介绍二阶段提交协议和三阶段提交协议的理论基础。

基本概念

①二阶段提交。

2pc,是two-phase-commit的缩写,即二阶段提交。二阶段分为提交事务请求、执行事务提交。

②三阶段提交

3pc,是Three-phase-commit的缩写,即三阶段提交。三阶段分为CanCommit、PreCommit、doCommit。

③协调者

统一调度所有分布式节点的执行逻辑的组件叫作协调者。当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入一个称为“协调者”的组件来统一调度所有分布式节点的执行逻辑。

④参与者

被协调者调度的分布式节点叫作参与者。

2PC

二阶段提交协议,被认为是一致性协议,用来保证分布式系统的数据一致性。二阶段提交协议顾名思义分成了两个阶段:提交事务请求、执行事务提交

①提交事务请求

(1).事务询问:协调者向所有的参与者发送事务内容,询问是否可于执行事务提交操作,并开始等待各参与者的响应。

(2).执行事务:各参与者结点执行的事务操作,并将Undo和Redo信息记入事务日志中。

(3).各参与者向协调者反馈事务询问的响应:如果参与者成功执行了事务操作,就反馈给协调者YES的响应,表示事务可以执行;如果参与者没有成功执行了事务操作,就反馈给协调者NO的响应,表示事务不可以执行。

②执行事务提交

(1).执行事务提交

假如所有的参与者反馈的响应信息都是YES,则执行事务提交。

(2).中断事务

假如任何一个参与者反馈的信息是NO,或者等待超时之后,还没有收集全所有参与者的反馈信息。就会中断事务。

小结:二阶段提交协议原理简单,实现方便。但是存在同步阻塞,单点问题,脑裂,太过保守。

3PC

三阶段提交协议,是二阶段提交协议的改进版,将提交事务请求的过程一分为二。形成了CanCommit、PreCommit、do Commit三个阶段组成。

①CanCommit

事务询问:协调者向所有的参与者发送一个包含事务内容的canCommit请求,询问是否可以执行事务提交操作,并开始等待各参与者的响应。

各参与者向协调者反馈事务询问的响应:参与者在接收到来自协调者的canCommit请求之后,如果自身认为可以顺利执行的话,反馈YES,并且进入预备状态。否则反馈NO。

②PreCommit

执行事务预提交:如果协调者从所有的参与者获得的反馈都是YES,那么执行事务预提交。

事务中断:假如任何一个参与者反馈的信息是NO,或者等待超时之后,还没有收集全所有参与者的反馈信息。就会中断事务。

③do Commit

执行提交:如果协调者接收到所有的参与者Ack响应,那么把预提交状态置为提交的状态。

中断事务:有任意一个参与者相协调这反馈No响应。那么就会中断事务。

小结:降低参与者的阻塞范围,并且能够在出现单点故障之后继续达成一致。

三阶段在降低了参与者阻塞范围的同时,也引入了新的问题,在参与者接收到preCommit消息后,如果出现网络分区,此时协调者所在的节点和参与者无法进行通信,参与者依然会进行事务提交,这必然会引起数据的不一致性。

2PC和3PC提交协议不能完全的解决一致性的问题,另外一种非常重要的且有效的算法Paxos是具有高度容错的一致性算法。

原文地址:https://www.cnblogs.com/sunshine798798/p/9739291.html

时间: 2024-09-29 00:21:04

分布式系统中的一致性协议的相关文章

分布式系统中有关一致性的理解

首先什么是一致性? 一致性就是分布式系统中相互独立多个节点就某个值达成一致. 具体可分为强一致性和弱一致性. 强一致性:在任意时刻,所有节点中的数据是一样的.同一时间点,你在节点A中获取到key1的值与在节点B中获取到key1的值应该都是一样的. 弱一致性:不保证任意时刻所有节点数据一样,有很多不同实现.最广泛实现的是最终一致性.所谓最终一致性,就是不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化.也可以简单的理解为在一段时间后,

分布式系统中的一致性,与数据库的隔离级别

一致性,是描述多副本的同步特征(本文我们不讨论分布式数据库中,保持多个分片里的数据在业务逻辑上一致性的情况,仅讨论数据多副本的case).一般从两个角度来研究: 从全局数据角度来看: 强一致性: 无论谁.无论何时读,得到的都是最新写入后的结果 线性一致性: 如果把读写操作按照严格时间戳排序,每个进程的读写都遵循该排序的结果 顺序一致性: 每个进程的读写操作顺序都一致,但不保证按照时间戳顺序 因果一致性: 两个有因果关系(读写了同一数据)的进程之间,读写顺序都一致,不保证按照时间戳顺序,而且无关的

分布式系统中的一致性hash初探

在分布式式系统中,为了分散访问压力,每个模块需要由多个节点组成集群,共同来提供服务,客户端根据一定的负载均衡策略来访问集群的各个节点,由此引入了一些问题,如在访问压力增大的情况需要要增加节点,或是集群其中的一个节点突然挂掉,如何将原有节点上的请求压力重新负载到新的节点集群上. 我们常用的负载均衡策略有随机(加权).轮询,最小连接数.最短响应时间,哈希,以及我们今天要说的一致性hash. 一.一致性hash与其他负载均衡策略的对比 首先我们来分析下一致性hash相对前面几种负载均衡策略的优势, 轮

投票证明:基于投票机制和联盟封锁链的高性能一致性协议

Title:投票证明:基于投票机制和联盟封锁链的高性能一致性协议 Abstract:比特币引入了一种革命性的去中心化共识机制.然而,应用于公共区块链的比特币衍生共识机制不适合新兴联盟区块链的部署场景.我们提出了一种新的共识算法,即投票证明(POV).协商一致由联合体合作伙伴控制的分布式节点协调,这些节点将通过投票进行分散仲裁.关键的想法是为网络参与者建立不同的安全身份,以便在不依赖第三方中介或无法控制的公众意识的情况下,由机构在联盟中的投票决定提交和验证区块.与完全分散的一致性工作证明(POW)

分布式系统中的概念--第一篇 一致性协议、一致性模型、拜占庭问题、租约

1,一致性协议 两阶段提交协议与Raft协议.Paxos协议 ①两阶段提交协议 在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败.当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等).因此,二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与

分布式系统的一致性协议之 2PC 和 3PC

在分布式系统领域,有一个理论,对于分布式系统的设计影响非常大,那就是 CAP 理论,即对于一个分布式系统而言,它是无法同时满足 Consistency(强一致性).Availability(可用性) 和 Partition tolerance(分区容忍性) 这三个条件的,最多只能满足其中两个.但在实际中,由于网络环境是不可信的,所以分区容忍性几乎是必不可选的,设计者基本就是在一致性和可用性之间做选择,当然大部分情况下,大家都会选择牺牲一部分的一致性来保证可用性(可用性较差的系统非常影响用户体验的

一致性哈希算法及其在分布式系统中的应用(转)

原文:http://blog.codinglabs.org/articles/consistent-hashing.html 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题:接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题. 分布式缓存问题 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越

一致性哈希算法及其在分布式系统中的应用 作者 张洋

转 http://blog.codinglabs.org/articles/consistent-hashing.html 摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题:接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题. 分布式缓存问题 假设我们有一个网站,最近发现随着流量增加,服务器压力越

一致性哈希算法及其在分布式系统中的应用

摘要 本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用.首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题:接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题. 分布式缓存问题 假设我们有一个网站,最近发现随着流量增加,服务器压力越来越大,之前直接读写数据库的方式不太给力了,于是我们想引入Memcached作为缓存机制.现在我们一共有三台机器可以作为Me