分布式理论(三) - 2PC协议

前言

因为BASE理论须要在一致性和可用性方面作出权衡,所以涌现了不少关于一致性的算法和协议。其中比较著名的有二阶提交协议(2 Phase Commitment Protocol),三阶提交协议(3 Phase Commitment Protocol)和Paxos算法。算法

本文要介绍的2PC协议,分为两个阶段提交一个事务。并经过协调者和各个参与者的配合,实现分布式一致性。数据库

两个阶段事务提交协议,由协调者和参与者共同完成。编程

角色 XA概念 做用
协调者 事务管理器 协调各个参与者,对分布式事务进行提交或回滚
参与者 资源管理器 分布式集群中的节点

正文

1. 分布式事务

分布式事务是指会涉及到操做多个数据库的事务,其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。后端

分布式事务处理的关键是:缓存

  1. 须要记录事务在任何节点所作的全部动做;
  2. 事务进行的全部操做要么所有提交,要么所有回滚。

2. XA规范

2.1. XA规范的组成

XA规范是由 X/Open组织(即如今的 Open Group )定义的分布式事务处理模型。 X/Open DTP 模型( 1994 )包括:网络

  • 应用程序( AP )
  • 事务管理器( TM ):交易中间件等
  • 资源管理器( RM ):关系型数据库等
  • 通讯资源管理器( CRM ):消息中间件等

2.2. XA规范的定义

XA规范定义了交易中间件与数据库之间的接口规范(即接口函数),交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。而XA接口函数由数据库厂商提供。多线程

二阶提交协议和三阶提交协议就是基于XA规范提出的其中,二阶段提交就是实现XA分布式事务的关键。架构

2.3. XA规范编程规范

  1. 配置TM,给TM注册RM做为数据源。其中,一个TM能够注册多个RM。框架

  2. AP向TM发起一个全局事务。这时,TM会发送一个XID(全局事务ID)通知各个RM。异步

  3. AP从TM获取资源管理器的代理(例如:使用JTA接口,从TM管理的上下文中,获取出这个TM所管理的RM的JDBC链接或JMS链接)。

  4. AP经过从TM中获取的链接,间接操做RM进行业务操做。TM在每次AP操做时把XID传递给RM,RM正是经过这个XID关联来操做和事务的关系的。

  5. AP结束全局事务时,TM会通知RM全局事务结束。开始二段提交,也就是prepare - commit的过程。

XA规范的流程,大体如图所示:

3. 二阶段提交(2PC)

3.1. 二阶段提交的定义

二阶段提交的算法思路能够归纳为:每一个参与者将操做成败通知协调者,再由协调者根据全部参与者的反馈情报,决定各参与者是否要提交操做仍是停止操做。

所谓的两个阶段分别是:

  • 第一阶段:准备阶段(投票阶段)
  • 第二阶段:提交阶段(执行阶段)

3.1.1. 准备阶段

准备阶段分为三个步骤:

a. 事务询问

协调者向全部的参与者询问,是否准备好了执行事务,并开始等待各参与者的响应。

b. 执行事务

各参与者节点执行事务操做。若是本地事务成功,将Undo和Redo信息记入事务日志中,但不提交;不然,直接返回失败,退出执行。

c. 各参与者向协调者反馈事务询问的响应

若是参与者成功执行了事务操做,那么就反馈给协调者 Yes响应,表示事务能够执行提交;若是参与者没有成功执行事务,就返回No给协调者,表示事务不能够执行提交。

3.1.2. 提交阶段

在提交阶段中,会根据准备阶段的投票结果执行2种操做:执行事务提交,中断事务。

提交事务过程以下:

a. 发送提交请求

协调者向全部参与者发出commit请求。

b. 事务提交

参与者收到commit请求后,会正式执行事务提交操做,并在完成提交以后,释放整个事务执行期间占用的事务资源。

c. 反馈事务提交结果

参与者在完成事务提交以后,向协调者发送Ack信息。

d. 事务提交确认

协调者接收到全部参与者反馈的Ack信息后,完成事务。

中断事务过程以下:

a. 发送回滚请求

协调者向全部参与者发出Rollback请求。

b. 事务回滚

参与者接收到Rollback请求后,会利用其在提交阶段种记录的Undo信息,来执行事务回滚操做。在完成回滚以后,释放在整个事务执行期间占用的资源。

c. 反馈事务回滚结果

参与者在完成事务回滚以后,想协调者发送Ack信息。

d. 事务中断确认

协调者接收到全部参与者反馈的Ack信息后,完成事务中断。

3.1. 二阶段提交的优缺点

  • 优势:原理简单,实现方便。
  • 缺点:同步阻塞,单点问题,数据不一致,容错性很差。

同步阻塞

在二阶段提交的过程当中,全部的节点都在等待其余节点的响应,没法进行其余操做。这种同步阻塞极大的限制了分布式系统的性能。

单点问题

协调者在整个二阶段提交过程当中很重要,若是协调者在提交阶段出现问题,那么整个流程将没法运转。更重要的是,其余参与者将会处于一直锁定事务资源的状态中,而没法继续完成事务操做。

数据不一致

假设当协调者向全部的参与者发送commit请求以后,发生了局部网络异常,或者是协调者在还没有发送完全部 commit请求以前自身发生了崩溃,致使最终只有部分参与者收到了commit请求。这将致使严重的数据不一致问题。

容错性很差

若是在二阶段提交的提交询问阶段中,参与者出现故障,致使协调者始终没法获取到全部参与者的确认信息,这时协调者只能依靠其自身的超时机制,判断是否须要中断事务。显然,这种策略过于保守。换句话说,二阶段提交协议没有设计较为完善的容错机制,任意一个节点是失败都会致使整个事务的失败。

小结

对于2PC协议存在的同步阻塞、单点问题,将在下一篇文章的3PC协议中引入解决方案。

相关连接

  1. 分布式理论(一) - CAP定理
  2. 分布式理论(二) - BASE理论
  3. 分布式理论(三) - 2PC协议
  4. 分布式理论(四) - 3PC协议
  5. 分布式理论(五) - 一致性算法Paxos
  6. 分布式理论(六) - 一致性协议Raft

欢迎扫码关注公众号:零壹技术栈

image

本账号将持续分享后端技术干货,包括虚拟机基础,多线程编程,高性能框架,异步、缓存和消息中间件,分布式和微服务,架构学习和进阶等学习资料和文章。

相关文章
相关标签/搜索