2PC/3PC到底是啥
讨论
提到2PC/3PC首先想到的是它是一致性协议,而且经常把它和Paxos协议放在一起比较,并且经常看到这样的说法"世上只有一种一致性算法,那就是Paxos",2PC/3PC并不是严格意义上的一致性协议,很少被用在处理一致性上;但另一方面又经常看到2PC/3PC和分布式事务放在一起讨论,并且大部分的关系型数据库通过两阶段提交(2 Phase Commit 2PC)算法来完成分布式事务。
先大致了解一下分布式事务和一致性
分布式事务
分布式事务:是指会涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。
两类一致性
说到一致性大家更多的应该想到的是CAP里面的A表示的一致性(一个数据分片的多个副本之间的数据一致性)就是数据一致性;但我觉得还可以有另外一种理解就是ACID中的A(一个事务在执行之前和执行之后,数据库都必须处于一致性状态)就是状态一致性或者叫操作原子性。
其实这里说的状态一致性或者叫操作原子性就是分布式事务,大范围来讲,其实一致性其实是包含分布式事务的,只不过我们提到一致性更多情况下讲的就是数据一致性。
2PC/3PC由来:XA规范
X/Open 组织(即现在的 Open Group )定义了分布式事务处理模型。 X/Open DTP 模型( 1994 )包括应用程序( AP )、事务管理器( TM )、资源管理器( RM )、通信资源管理器( CRM )四部分。一般,常见的事务管理器( TM )是交易中间件,常见的资源管理器( RM )是数据库,常见的通信资源管理器( CRM )是消息中间件。
XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。 XA 接口函数由数据库厂商提供。
二阶提交协议和三阶提交协议就是根据这一思想衍生出来的。可以说二阶段提交其实就是实现XA分布式事务的关键(确切地说:两阶段提交主要保证了分布式事务的原子性:即所有结点要么全做要么全不做)。
所以大部分的关系型数据库通过两阶段提交(2 Phase Commit 2PC)算法来完成分布式事务就不足为奇了。
讨论总结
2PC/3PC提交其实就是实现XA分布式事务的关键,而分布式事务从广义上来讲也是一致性的一种表现,所以2PC/3PC也可以叫一致性协议;其实在表示数据一致性的环境下,2PC/3PC代表的含义:要么所有备份数据同时更改某个值,要么都不更改,以此来达到数据的强一致性。在真实的应用中,尽管有系统使用2PC/3PC协议来作为数据一致性协议,但是比较少见,更多的是作为实现数据更新原子性手段出现。
为什么2PC/3PC没有被广泛用在保证数据的一致性上,主要原因应该还是它本身的缺陷,所有经常看到这句话:there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos. 意即世上只有一种一致性算法,那就是Paxos。
下面大概介绍一下2PC/3PC
2PC/3PC
2PC/3PC全称:Two/Three Phase Commit,中文名叫叫两阶段/三阶段提交;为了使基于分布式系统架构下的所有节点在进行事务处理的过程中能够ACID特性而设计的一种算法,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交两阶段提交的算法如下:
第一阶段:提交事务阶段(投票阶段)
1.事务询问:协调者会问所有的参与者结点,是否可以执行提交操作
2.执行事务:各个参与者执行事务操作 如:资源上锁,将Undo和Redo信息记入事务日志中
3.参与者向协调者反馈事务询问的响应:如果参与者成功执行了事务操作,反馈给协调者Yes响应,否则No响应
第二阶段:执行事务提交(执行阶段)
假如协调者从所有的参与者获得的反馈都是Yes响应,那么就会执行事务提交
1.发送提交请求:协调者向参与者发送Commit请求
2.事务提交:参与者接受到Commit请求后,会正式执行事务提交操作,并在完成提交之后释放事务资源
3.反馈事务提交结果:参与者在完成事务提交之后,向协调者发送Ack消息
4.完成事务:协调者接受到所有参与者反馈的Ack消息后,完成事务
假如任何一个参与者向协调者反馈了No响应,或者在等待超时之后,协调者尚无接收到所有参与者的反馈信息,那么就会中断事务
1.发送回滚请求:协调者向参与者发送Rollback请求
2.事务回滚:参与者利用Undo信息来执行事务回滚,并释放事务资源
3.反馈事务回滚结果:参与者在完成事务回滚之后,向协调者发送Ack消息
4.中断事务:协调者接收到所有参与者反馈的Ack消息之后,中断事务
网上看来的西方教堂结婚一个桥段很好的描述了2PC协议:
1.牧师分别问新郎和新娘:你是否愿意……不管生老病死……(投票阶段)
2.当新郎和新娘都回答愿意后(锁定一生的资源),牧师就会说:我宣布你们……(执行阶段)
2PC存在的问题
1.阻塞问题
二阶段提交的第一阶段中,协调者需要等待参与者的响应,如果没有接收到任意参与者的响应,这时候进入等待状态,而其他正常发送响应的参与者,将进入阻塞状态,将无法进行其他任何操作,只有等待超时中断事务,极大的限制了系统的性能。
2.单点问题
协调者处于一个中心的位置,一旦出现问题,那么整个二阶段提交将无法运转,更为严重的是,如果协调者在阶段二中出现问题的话,那么其他参与者将会一直处于锁定事务资源的状态中,将无法继续完成操作
以上提到的2个问题都在3PC中得到了解决
1.解决阻塞问题:将2PC中的第一阶段一分为二,提供了一个CanCommit阶段,此阶段并不锁定资源,这样可以大幅降低了阻塞概率
2.解决单点问题:在参与者这边也引入了超时机制
3PC
3PC是2PC的改进版本,将2PC的第一阶段:提交事务阶段一分为二,形成了CanCommit、PreCommit和doCommit三个阶段组成的事务处理协议,具体看一张流程图(来源网上):
三段提交的核心理念是:在询问的时候并不锁定资源,除非所有人都同意了,才开始锁资源。
3PC具体的流程步骤就不在描述了,在二阶段的基础上加了事务询问的过程(CanCommit)
3PC虽然解决了2PC存在的2个问题,但是不管是2PC还是3PC都存在数据一致性的问题:
2PC:比如协调者在只给部分参与者发送了Commit请求,那就会出现部分参与者执行了Commit,部分没有提交,出现不一致问题。
3PC:一旦参与者无法及时收到来自协调者的信息之后,他会默认执行commit。而不会一直持有事务资源并处于阻塞状态,但是这种机制也会导致数据一致性问题。
总结
2PC/3PC用来处理分布式事务: 能够很好的提供强一致性和强事务性,但相对来说延迟比较高,比较适合传统的单体应用,在同一个方法中存在跨库操作的情况,不适合高并发和高性能要求的场景。
2PC/3PC用来处理数据一致性:很少使用,更多的是Paxos或者基于Paxos的变体。
转载:ksfzhaohui
2PC/3PC到底是啥的更多相关文章
- 分布式:2PC,3PC,Paxos,Raft,ISR [转]
本文主要讲述2PC及3PC,以及Paxos以及Raft协议. 两类一致性(操作原子性与副本一致性) 2PC协议用于保证属于多个数据分片上的操作的原子性.这些数据分片可能分布在不同的服务器上,2PC协议 ...
- 2PC/3PC/Paxos
在分布式系统中,一个事务可能涉及到集群中的多个节点.单个节点很容易知道自己执行的事务成功还是失败,但因为网络不可靠难以了解其它节点的执行状态(可能事务执行成功但网络访问超时). 若部分节点事务执行失败 ...
- 分布式系统一致性协议--2PC,3PC
分布式系统中最重要的一块,一致性协议,其中就包括了大名鼎鼎的Paxos算法. 2PC与3PC 在分布式系统中,每一个机器节点虽然能够明确知道自己在进行事务操作过程中的结果是成功或是失败,但是却无法直接 ...
- 2PC&3PC
在分布式系统中,每一个机器节点虽然都能够明确地知道自己在进行实物操作过程中的结果是成功或失败,但却无法直接获取到其他分布式节点的操作结果.为了保持实物处理的ACID特性,就需要引入一个称为" ...
- 分布式一致性算法 2PC 3PC Paxos
分布式一致性算法的目的是为了解决分布式系统 一致性算法可以通过共享内存(需要锁)或者消息传递实现,本文讨论后者实现的一致性算法,不仅仅是分布式系统中,凡是多个过程需要达成某种一致的场合都可以使用. 本 ...
- ZAB协议和Paxos算法
前言在上一篇文章Paxos算法浅析中主要介绍了Paxos一致性算法应用的场景,以及对协议本身的介绍:Google Chubby是一个分布式锁服务,其底层一致性实现就是以Paxos算法为基础的:但这篇文 ...
- Paxos算法浅析
前言在文章2PC/3PC到底是啥中介绍了2PC这种一致性协议,从文中了解到2PC更多的被用在了状态一致性上(分布式事务),在数据一致性中很少被使用:而Paxos正是在数据一致性中被广泛使用,在过去十年 ...
- 分布式理论系列(二)一致性算法:2PC 到 3PC 到 Paxos 到 Raft 到 Zab
分布式理论系列(二)一致性算法:2PC 到 3PC 到 Paxos 到 Raft 到 Zab 本文介绍一致性算法: 2PC 到 3PC 到 Paxos 到 Raft 到 Zab 两类一致性算法(操作原 ...
- 分布式事务 --- 2PC 和 3PC
文章部分图片来自参考资料,侵删 概述 上一篇我们讲到CAP 理论,分区容错性,一致性,可用性三者不可能同时存在,而分区容错性又是客观存在的,那么为了保证可用性,我们牺牲了一致性,虽然我们保证不了强一致 ...
随机推荐
- EJB Remote/Local 绑定和JNDI Lookup
从同事那里学到一种方便的注解SessionBean的方式.代码我放到github去了 https://github.com/EdisonXu/Test/commit/703d49123dca9e666 ...
- 解决MySQL5.6中的Slave延迟问题的基本教程
一.原因分析一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在sla ...
- 转:sql语句优化
性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化. 为了获得稳定的执行性能,SQL语句越简单越好.对复杂的SQL语句,要设 ...
- 动态修改css文件中,具体的class中的个别属性值。
function setStyleSheetObjCssClassProperty(pStyleSheetObj, pSelectorText, pProperty, pValue) { var pS ...
- IE 出现stack overflow 报错的原因归纳
1. 重定义了系统的触发事件名称作为自定义函数名如: onclick / onsubmit ... 都是系统保留的事件名称,不允许作为重定义函数名称: 2. IE缓存满了,无法写入.解决办法:清空 ...
- 怎样在 fedora 28 上 打开 .jnlp 文件
最近使用 iDrac 和 iLO 总是会使用到 .jnlp 文件, 为了方便,今天把设置过程记录下来. JNLP 文件,全名为 Java Network Launching Protocol 文件, ...
- 【转】Java学习---线程间的通信
[原文]https://www.toutiao.com/i6572378564534993415/ 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: 这里主要 ...
- C++设计模式 ==> 策略模式与简单工厂模式结合
简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...
- SDN第五次上机作业--基于组表的简单负载均衡
0.作业链接 http://www.cnblogs.com/easteast/p/8125383.html 1.实验目的 1.搭建如下拓扑并连接控制器 2.下发相关流表和组表实现负载均衡 3.抓包分析 ...
- java多重转型问题
我们来看一个简单的问题,下面的代码会打印出什么? public class hello { public static void main(String[] args){ System.out.pri ...