分布式事务 --- 2PC 和 3PC

文章部分图片来自参考资料,侵删

概述

上一篇我们讲到CAP 理论,分区容错性,一致性,可用性三者不可能同时存在,而分区容错性又是客观存在的,那么为了保证可用性,我们牺牲了一致性,虽然我们保证不了强一致性,但是(Base理论)我们可以保证最终一致性。 而 2pc(两阶段提交) 和 3pc(三阶段提交)都是为了一致性协议,通过这些协议保证一致性。

2pc

2PC协议有两个阶段:Propose和Commit.在没有出错的情况下的2PC协议流程的画风是这样的:

  • Propose阶段:

    • coordinator : "你们准备执行什么什么"

    • voter1/voter2/voter3: "收到!(各个节点写入要执行的动作)"
  • Commit阶段
    • coordinator: "确定执行"

    • voter1/voter2/voter3: "好哒(执行的动作落地)

假如在 Propose 有节点没准备好,那协调者就对本次执行 abort

但是 2pc 存在以下问题 , 例如在准备 commit phase 阶段, coordinator 和 voter3 刚好都 crash 了,那么vote1 和 vote2 就尴尬了,为什么呢? 因为现在存在以下的情况 :

(1)上轮全票通过然后voter3第一个收到了commit的消息并在commit操作之后crash了

(2)上轮voter3反对所以干脆没有通过.

那么 vote1 和 vote2 就会处在不知是否是 commit 还是 abort 的困境。同时 2pc 还存在以下的优缺点 :

缺点 :

  • 同步阻塞,第二阶段执行任务阶段,各节点都需要阻塞执行完成后,协调者才放开锁定的资源
  • 单点问题,协调者要是第二阶段 crash ,部分收到 commit 部分没有收到的话,就会造成数据不一致。

优点 :

  • 简单容易实现

2pc 在 CAP 中 属于 CA ,那么没办法解决 分区容错性的问题,但是它在性能和分区容错方面找到了平衡,使得关系数据库都喜欢使用 2pc 来实现分布式事务。

3pc

简单的说来, 3PC就是把2PC的Commit阶段拆成了PreCommit和Commit两个阶段. 通过进入增加的这一个PreCommit阶段, voter可以得到Propose阶段的投票结果, 但不会commit; 而通过进入Commit阶段, voter可以盘出其他每个voter也都打算commit了, 从而可以放心的commit.

        换言之, 3PC在2PC的Commit阶段里增加了一个barrier(即相当于告诉其他所有voter, 我收到了Propose的结果啦). 在这个barrier之前coordinator掉线的话, 其他voter可以得出结论不是每个voter都收到Propose Phase的结果, 从而放弃或选出新的coordinator; 在这个barrier之后coordinator掉线的话, 每个voter会放心的commit, 因为他们知道其他voter也都做同样的计划.

以下为 3pc 的过程。

下面的是 wiki 上的图 :

但是 3pc 也存在一定的问题 。

  • 网络分区时无法恢复

网络划分(network partition)

网络划分指的是 节点互相不能通信。

假设在PreCommit阶段所有节点被一分为二, 收到preCommit消息的voter在一边, 而没有收到这个消息的在另外一边. 在这种情况下, 两边就可能会选出新的coordinator而做出不同的决定.

情景如下所示

fail-recover

fail-recover 就是失败后过一阵子再恢复过来。

当coordinator收到preCommit的确认前crash, 于是其他某一个voter接替了原coordinator的任务而开始组织所有voter commit. 而与此同时原coordinator重启后又回到了网络中, 开始继续之前的回合---发送abort给各位voter因为它并没有收到preCommit. 此时有可能会出现原coordinator和继任的coordinator给不同节点发送相矛盾的commit和abort指令, 从而出现个节点的状态分歧.

总结

可以看到无论是 2pc 还是 3pc

补充

replication 和  partition

我们运用分布式的时候时常会使用两种手段对数据进行处理。一种是 切分,一种是复制,这两种分别对应于 partition 和 replication . 两者的操作如下 :

先说复制吧,最常见的就是主从复制,优势很明显,可以很好地处理分区容错性,要是主挂了,从的马上就可以顶上。缺点数据的一致性,上面的二阶段提交和三阶段提交都是为了解决一致性的问题。而 partition 可以将多个任务分成一小块一小块,充分发挥并发计算,同时解决数据增长带来的冲击,因为每一块都分出去了,所以计算压力得到了平摊。但是也会存在例如分区之间跨区访问受限,数据增长速度不同等问题,还可能存在著名的 Byzantine_fault_tolerance (拜占庭问题)。

拜占庭问题

拜占庭将军问题是一个协议问题,拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军。问题是这些将军在地理上是分隔开来的,并且将军中存在叛徒。叛徒可以任意行动以达到以下目标:欺骗某些将军采取进攻行动;促成一个不是所有将军都同意的决定,如当将军们不希望进攻时促成进攻行动;或者迷惑某些将军,使他们无法做出决定。如果叛徒达到了这些目的之一,则任何攻击行动的结果都是注定要失败的,只有完全达成一致的努力才能获得胜利。来源 ;百度百科

简单地来说就是协调者发出某个请求,要求各个节点达成共识,共同对外 ,但是内部出现奸细,出现返回来的信息使得大家达不到一致性。

Partition tolerant consensus algorithms

最著名的 partition tolerant consensus 算法就是 Paxos 了,还有 Raft .

network partition

以下的描述很好地解释了 network partition

A network partition is the failure of a network link to one or several nodes. The nodes themselves continue to stay active, and they may even be able to receive requests from clients on their side of the network partition. As we learned earlier

consistency(一致性分类)

Consistency models can be categorized into two types: strong and weak consistency models:

  • Strong consistency models (capable of maintaining a single copy)

    • Linearizable consistency

    • Sequential consistency
  • Weak consistency models (not strong)
    • Client-centric consistency models

    • Causal consistency: strongest model available
    • Eventual consistency models (最终一致性)

其中强一致性包括 Linearizable consistency  和 Sequential consistency ,它们两者的差别在于 :

  • Linearizable consistency: Under linearizable consistency, all operations appear to have executed atomically in an order that is consistent with the global real-time ordering of operations. (Herlihy & Wing, 1991)

  • Sequential consistency: Under sequential consistency, all operations appear to have executed atomically in some order that is consistent with the order seen at individual nodes and that is equal at all nodes. (Lamport, 1979)

参考资料

原文地址:https://www.cnblogs.com/Benjious/p/11306190.html

时间: 2024-10-11 07:21:28

分布式事务 --- 2PC 和 3PC的相关文章

分布式事务(第04篇)分布式事务解决方法-3PC

一 什么三阶段提交协议(3PC) 3PC是2PC的改进版本.主要有以下改进: 增加了一个询问阶段,询问阶段可以确保尽可能早的发现无法执行操作而需要中止的行为,但是它并不能发现所有的这种行为,只会减少这种情况的发生. 增加了等待超时的处理逻辑,如果在询问阶段等待超时,则自动中止:如果在准备阶段之后等待超时,则自动提交.这也是根据概率统计上的正确性最大. 二 3PC工作流程 询问阶段:协调者询问参与者是否可以完成指令,协调者只需要回答是还是不是,而不需要做真正的操作,这个阶段参与者在等待超时后会自动

分布式事务的2PC、3PC和TCC

1.2PC协议 2PC 是二阶段提交(Two-phase Commit)的缩写,顾名思义,这个协议分两阶段完成.第一个阶段是准备阶段,第二个阶段是提交阶段,准备阶段和提交阶段都是由事务管理器(协调者)发起的,协调的对象是资源管理器(参与者).二阶段提交协议的概念来自 X/Open 组织提出的分布式事务的规范 XA 协议,协议主要定义了(全局)事务管理器和(局部)资源管理器之间的接口.XA 接口是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信桥梁.Java 平台上的事务规范 JT

基于2PC和延迟队列的分布式事务实现

背景 分布式多消息事务问题  在消息队列使用场景中,有时需要同时下发多条消息,但现在的消息队列比如kafka只支持单条消息的事务保证,不能保证多条消息,今天说的这个方案就时kafka内部的一个子项目中基于2PC和延迟更新来实现分布式事务 2PC  2PC俗称两阶段提交,通过将一个操作分为两个阶段:准备阶段和提交阶段来尽可能保证操作的原子执行(实际上不可能,大家有个概念先) 延迟更新  延迟更新其实是一个很常用的技术手段,简单来说,当某个操作条件不满足时,通过一定手段将数据暂存,等条件满足时在进行

从银行转账失败到分布式事务:总结与思考

目录 关系型数据库事务 分布式事务 2PC 3PC TCC 基于消息的分布式事务 1PC 思考与总结 references 正文 思考这个问题的初衷,是有一次给朋友转账,结果我的钱被扣了,朋友没收到钱.而我之前一直认为银行转账一定是由事务保证强一致性的,于是学习.总结了一下分布式事务的各种理论.方法. 事务是一个非常广义的词汇,各行各业解读都不一样.对于程序员,事务等价于Transaction,是指一组连续的操作,这些操作组合成一个逻辑的.完整的操作.即这组操作执行前后,系统需要处于一个可预知的

分布式事务解决方案框架(LCN)

事物概念 事物特性(ACID) 原子性(A) 所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样. 一致性(C) 事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元. 隔离性(I) 所谓的隔离性就是说,事务与事务之间不会互相影

从本地事务到分布式事务到微服务下事务

从本地事务到分布式事务到微服务下事务 一.传统本地事务 传统单服务器,单关系型数据库下事务比较简单,完全可用很简单的实现ACID,实际中我们实现一个业务时只需要:开启一个事务-操作数据库-提交/回滚这个事务,这样就完美的实现了一次事务操作,更简单点我们通常会通过spring集成事务直接指定在哪些服务什么样的方法执行什么样的事务即可,更甚至我们业务实现基本都忽略了事务,具体图如下: 二.传统分布式事务 在传统一服务,一个关系数据库架构基础上,随着访问量的增大,单机很明显已满足不了现状,于是我们顺其

三:分布式事务一致性协议2pc和3pc

一:分布式一致性协议--->对于一个分布式系统进行架构设计的过程中,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是就产生了一系列的一致性协议.--->长期探索涌现出一大批经典的一致性协议和算法.其中最著名的就是二阶段提交协议,三阶段提交协议和paxos算法. 二:2PC与3PC--->在分布式系统中,每一个机器节点虽然都能够明确知道自己在进行事务操作过程中的结果是成功或失败,但却无法直接获取到其他分布式节点的操作结果.因此,当一个事务操作需要跨越多个分布式节点的时候,为了保持事

分布式事务之深入理解什么是2PC、3PC及TCC协议?

导读 在上一篇文章<[分布式事务]基于RocketMQ搭建生产级消息集群?>中给大家介绍了基于RocketMQ如何搭建生产级消息集群.因为本系列文章最终的目的是介绍基于RocketMQ的事物消息来解决分布式系统中的数据一致性问题,所以先给大家率先介绍了RocketMQ消息集群的搭建. 原本是想着在这篇文章中直接介绍RocketMQ的事务消息特性,但是在梳理的过程中作者发现对于分布式事务的概念,可能还会有很多同学不理解或者理解得不是很深刻的地方,而跳过这些基本概念直接去学习上层的实践可能并不是一

分布式事务(1)---2PC和3PC理论

分布式事务(1)---2PC和3PC理论 分布式事物基本理论:基本遵循CPA理论,采用柔性事物特征,软状态或者最终一致性特点保证分布式事物一致性问题. 分布式事物常见解决方案: 2PC两段提交协议 3PC三段提交协议(弥补两端提交协议缺点) TCC或者GTS(阿里) 消息中间件最终一致性 使用LCN解决分布式事物,理念"LCN并不生产事务,LCN只是本地事务的搬运工". 一.两阶段提交(2PC) 两阶段提交又称2PC,2PC是一个非常经典的强一致.中心化的原子提交协议. 这里所说的中心