19

Shardingsphere 整合 Atomikos 对 XA 分布式事务的支持(1)

 3 years ago
source link: https://www.infoq.cn/article/WaRodyAmfWiIiZP5abgJ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

ShardingSphere 已于 2020 年 4 月 16 日成为 Apache 软件基金会的顶级项目。

分布式系统 CAP 理论

eei2uu.png!mobile

一致性(Consistency)

  • 一致性指 all nodes see the same data at the same time ,即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,不能存在中间状态。

  • 关于一致性,如果用户时刻看到的数据都是一致的,那么称之为强一致性。如果允许存在中间状态,只要求经过一段时间后,数据最终是一致的,则称之为最终一致性。此外,如果允许存在部分数据不一致,那么就称之为弱一致性

可用性(Availability)

  • 可用性是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。 有限的时间内是指 :对于用户的一个操作请求,系统必须能够在指定的时间内返回对应的处理结果,如果超过了这个时间范围,那么系统就被认为是不可用的。

  • 返回结果 是可用性的另一个非常重要的指标,它要求系统在完成对用户请求的处理后,返回一个正常的响应结果,不论这个结果是成功还是失败。

分区容错性(Partition tolerance )

  • 布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。

X/Open DTP 模型与 XA 规范

X/Open,即现在的 open group,是一个独立的组织,主要负责制定各种行业技术标准。官网地址: http://www.opengroup.org/ 。X/Open 组织主要由各大知名公司或者厂商进行支持,这些组织不光遵循 X/Open 组织定义的行业技术标准,也参与到标准的制定。下图展示了 open group 目前主要成员(官网截图):

M3aMbq.png!mobile

DTP 模型

BnmiUnf.png!mobile
  • 应用程序(Application Program ,简称AP):用于定义事务边界(即定义事务的开始和结束),并且在事务边界内对资源进行操作。

  • 资源管理器(Resource Manager,简称RM,一般也称为事务参与者):如数据库、文件系统等,并提供访问资源的方式。

  • 事务管理器(Transaction Manager ,简称TM,一般也称为事务协调者):负责分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚等。

XA 规范

vQR3Afy.png!mobile

这里的接口规范特别多,我们只要来讲讲几个最重要的。

  • xa_start : 在 RM 端调用此接口开启一个 XA 事务,后面需要接上 XID 作为参数。

  • xa_end : 取消当前线程与事务的关联, 与 xa_start 是配对使用。

  • xa_prepare : 询问 RM 是否已经准备好了提交事务。

  • xa_commit : 通知 RM 提交事务分支。

  • xa_rollback : 通知 RM 提交回滚事务分支。

XA 二阶段提交

  • 阶段一 :TM通知各个RM准备提交它们的事务分支。如果RM判断自己进行的工作可以被提交,那就就对工作内容进行持久化,再给TM肯定答复;要是发生了其他情况,那给TM的都是否定答复。在发送了否定答复并回滚了已经的工作后,RM就可以丢弃这个事务分支信息。

  • 阶段二 :TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。

MySQL 对 XA 协议的支持

MySQL5.0.3 开始支持 XA 分布式事务,且只有 InnoDB 存储引擎支持 XA 事务。

MySQLDTP 模型中也是属于资源管理器 RM

MySQL XA 事务的 SQL 语法

XA START xid //开启XA事务,xid是一个唯一值,表示事务分支标识符

XA END xid //结束一个XA事务,

XA PREPARE xid 准备提交

XA COMMIT xid [ONE PHASE] //提交事务。两阶段提交协议中,如果只有一个RM参与,那么可以优化为一阶段提交

XA ROLLBACK xid //回滚

XA RECOVER [CONVERT XID] //列出所有处于PREPARE阶段的XA事务

复制代码

MySQL xid 详解

mysql 中使用 xid 来作为一个事务分支的标识符。通过 C 语言进行描述,如下:

/∗

∗ Transaction branch identification: XID and NULLXID:

∗/

#define XIDDATASIZE 128 /∗ size in bytes ∗/

#define MAXGTRIDSIZE 64 /∗ maximum size in bytes of gtrid ∗/

#define MAXBQUALSIZE 64 /∗ maximum size in bytes of bqual ∗/

struct xid_t {

long formatID; /* format identifier */

long gtrid_length; /* value 1-64 */

long bqual_length; /* value 1-64 */

char data[XIDDATASIZE];

};

/∗

∗ A value of -1 in formatID means that the XID is null.

∗/

typedef struct xid_t XID;

/∗

∗ Declarations of routines by which RMs call TMs:

∗/

extern int ax_reg(int, XID ∗, long);

extern int ax_unreg(int, long);

复制代码

  • gtrid :全局事务标识符(global transaction identifier),最大不能超过64字节。

  • bqual :分支限定符(branch qualifier),最大不能超过64字节。

  • formatId :记录gtrid、bqual的格式,类似于memcached中flags字段的作用。

  • data :xid的值,其是 gtrid和bqual拼接后的内容。

MySQL XA 事务状态

nMRRjiR.png!mobile

JTA 规范


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK