文档章节

2PC/3PC到底是啥

ksfzhaohui
 ksfzhaohui
发布于 2016/12/06 22:00
字数 2387
阅读 1396
收藏 33
点赞 2
评论 3

讨论
提到2PC/3PC首先想到的是它是一致性协议,而且经常把它和Paxos协议放在一起比较,并且经常看到这样的说法"世上只有一种一致性算法,那就是Paxos",2PC/3PC并不是严格意义上的一致性协议,很少被用在处理一致性上;但另一方面又经常看到2PC/3PC和分布式事务放在一起讨论,并且大部分的关系型数据库通过两阶段提交(2 Phase Commit 2PC)算法来完成分布式事务。

先大致了解一下分布式事务和一致性

分布式事务

分布式事务:是指会涉及到操作多个数据库的事务。其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作,提交或回滚事务的决定必须产生统一的结果(全部提交或全部回滚)。

两类一致性

说到一致性大家更多的应该想到的是CAP里面的C表示的一致性(一个数据分片的多个副本之间的数据一致性)就是数据一致性;但我觉得还可以有另外一种理解就是ACID中的C(一个事务在执行之前和执行之后,数据库都必须处于一致性状态)就是状态一致性或者叫操作原子性。

其实这里说的状态一致性或者叫操作原子性就是分布式事务,大范围来讲,其实一致性其实是包含分布式事务的,只不过我们提到一致性更多情况下讲的就是数据一致性。

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的变体。

个人博客:codingo.xyz

© 著作权归作者所有

共有 人打赏支持
ksfzhaohui

ksfzhaohui

粉丝 302
博文 128
码字总数 158547
作品 3
南京
高级程序员
加载中

评论(3)

ksfzhaohui
ksfzhaohui

引用来自“搜云库”的评论

两类一致性

说到一致性大家更多的应该想到的是CAP里面的A表示的一致性
--------------------------------------------------------------------------------------------
A 是 Availability(可用性)
多谢提醒,2处写错了
搜云库
搜云库
两类一致性

说到一致性大家更多的应该想到的是CAP里面的A表示的一致性
--------------------------------------------------------------------------------------------
A 是 Availability(可用性)
海浪77
海浪77
很好的文章, 解决了我目前对分布式事务, 分布式一致性的大量疑问.
zookeeper入门系列 : 分布式事务

原文出处:笨狐狸 上一章我们了解了zookeeper到底是什么,这一章重点来看zookeeper当初到底面临什么问题?而zookeeper又是如何解决这些问题的? 实际上zookeeper主要就是解决分布式环境下的一...

笨狐狸
03/31
0
0
3PC是如何降低协调者与参与者之间的阻塞范围?

网上介绍2PC和3PC的博客都有一句话(估计都是互相转载抄袭) 优点:相对于2PC,3PC最大的优点是降低了协调者与参与者之间的阻塞范围,并且能够在出现单点故障之后,继续达成一致。 问题是都没...

爱吃大肉包
06/06
0
0
分布式一致性算法2PC和3PC

  为了解决分布式一致性问题,产生了不少经典的分布式一致性算法,本文将介绍其中的2PC和3PC。2PC即Two-Phase Commit,译为二阶段提交协议。3PC即Three-Phase Commit,译为三阶段提交协议。...

莫名2013
06/26
0
0
分布式系统的一致性协议之 2PC 和 3PC

在分布式系统领域,有一个理论,对于分布式系统的设计影响非常大,那就是 CAP 理论,即对于一个分布式系统而言,它是无法同时满足 Consistency(强一致性)、Availability(可用性) 和 Partitio...

sunsky303
07/10
0
0
三阶段提交(Three-phase commit)

一、什么是三阶段提交协议? 三阶段提交(Three-phase commit),也叫三阶段提交协议(Three-phase commit protocol),是二阶段提交(2PC)的改进版本。 与两阶段提交不同的是,三阶段提交有...

harries
05/22
0
0
Zookeeper概念学习系列之分布式事务

分布式事务   我们首先考虑一致性的特殊情况,即分布式事务的情况。分布式事务对于一致性的要求是强一致性,因此对于我们后续讨论有一定的借鉴意义。   这里我们用到一个经典的例子:bob...

技术小哥哥
2017/02/26
0
0
TiDB分布式事务一致性问题

@goroutine 你好,想跟你请教个问题:TiDB的分布式事物也是基于2PC或者3PC的吗?如果最终commit的时候其中一台机器commit失败,TiDB如何保证这种场景下的数据一致性?...

xtaetg2
2016/08/16
928
2
三:分布式事务一致性协议2pc和3pc

一:分布式一致性协议 --->对于一个分布式系统进行架构设计的过程中,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是就产生了一系列的一致性协议。 --->长期探索涌现出一大批经典...

无信不立
2016/02/17
0
0
关于分布式事务、两阶段提交协议、三阶提交协议

来源: 伯乐在线 - HollisChuang 链接:http://blog.jobbole.com/95632/ 随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显...

数通畅联
2015/12/17
80
0
关于分布式系统的思考(二)

对于数据库来说,可能关心的最多的就是数据的一致性了,由此衍生出了不同场景下的算法和策略。 在上一篇末尾提及了两种集群结构:中心化和去中心化。 中心化 一种是中心化的,由中心节点去存...

力谱宿云
2017/01/11
448
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

数据结构与算法2

一个数组的例子,实现查找,显示和删除的功能。 public class array {public static void main(String[] args){long[] arr;arr = new long[100];int nElems = 0;int j;...

沉迷于编程的小菜菜
15分钟前
0
0
Python3 基于 requests 批量下载图片

Python3 基于 requests 批量下载图片 import requestsheaders = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encod......

leeyi
16分钟前
0
0
Sparkstreaming and Kafka

简介 Kafka 0.10的Spark Streaming集成设计与0.8 Direct Stream方法类似。 它提供了简单的并行性,Kafka分区和Spark分区之间的1:1对应关系,以及对偏移量和元数据的访问。 但是,由于较新的...

刺猬一号
20分钟前
0
0
java获取当前时间所在一周的周一和周日日期

/** * 当前时间所在一周的周一和周日时间 * @param time 当前时间 * @return */ public static Map getWeekDate(String time) { Map map = new HashedMap(); SimpleDateFormat sdf = new Si......

小弱鸡
48分钟前
0
0
Redis数据的导出和导入(dump和load方式)

网上有些文章已经不再适用,本人也是踩了些坑,在此记录下。 迁移redis数据一般有如下3种方式: 第三方工具redis-dump,redis-load aof机制,需要开启aof功能 rdb存储机制 这里介绍第一种方式...

iplusx
53分钟前
1
0
ElasticSearch 高亮显示大文档搜索结果

2016年12月,我们开始研究Ambar——一个文档搜索系统。Ambar使用ElasticSearch作为核心搜索引擎。 在Ambar开发的过程中,我们处理了很多与ES相关的问题,我们想分享我们得到的宝贵经验。让我...

九州暮云
今天
1
0
Python 使用 pywifi 模块 破解wifi密码

git https://github.com/awkman/pywifi 常见常量 from pywifi import const# Define interface status.IFACE_DISCONNECTED = 0IFACE_SCANNING = 1IFACE_INACTIVE = 2IFACE_CONNEC......

阿豪boy
今天
2
0
phpstorm使用Iedis

phpstorm的redis插件Iedis是真好用 看了网上挺多的文章,但是由于我系统还是ubuntu,就有点尴尬了,现在破解之后,留个笔记,即使自己之后有需要也可以很快翻阅 先下载资源 资源下载 zip压缩...

贤郎--均灵
今天
0
0
第三章 spring-bean之FactoryBeanRegistrySupport(4)

前言 从FactoryBeanRegistrySupport类的名字可以看出FactoryBeanRegistrySupport负责FactoryBean的注册与支持。如果想知道FactoryBean相关的资料,请阅读spring-bean中关于FactoryBean的解读...

鸟菜啊
今天
0
0
CentOS “Destination Host Unreachable”问题解决办法

挑战极速安装CentOS时遇到局域网主机不能通信的情况: [root@zjd network-scripts]# ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=1 ttl=......

wffger
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部