分布式与一致性协议之MySQL XA协议

MySQL XA协议

概述

相信很多人都知道MySQL支持单机事务,那么在分布式系统中,涉及多个节点,MySQL又是怎样实现分布式事务的呢?
举个例子,一个业务系统需要接收来自外部的指令,然后访问多个内部其他系统来执行指令,但执行完指令后,需要同时更新多个内部MySQL数据库中的值(比如MySQL数据库A、B、C).由于业务敏感,所以系统必须处于一个一致性状态(也就是说,MySQL数据库A、B、C中的值要么同时更新成功,要么全部不更新),否则会出现有的系统显示指令执行成功,而有的系统显示指令尚未被执行的情况,导致多部门对指令执行结果理解混乱。
那么如何实现多个MySQL数据库更新的一致性呢?答案就是采用MySQL XA.

在我看来,MySQL通过支持XA规范的二阶段提交协议,不仅实现了多个MySQL数据库操作的事务,还能实现MySQL、Oracle、SQL Server等支持XA规范的数据库操作的事务。
通常,理解MySQL XA,不仅要能理解数据层分布式事务的原理,还要能在实际系统中更加深刻地理解二阶段提交协议,这样当你在实际工作中遇到多个MySQL数据库的事务需求时,你就知道如何通过MySQL XA来处理了。

老规矩,咱们先来看一道思考题。
假设有两个MySQL数据A、B(位于不同的服务器节点上),我们需要实现多个数据库更新(比如,UPDATE executed_table SET status=true WHERE id = 100)和插入操作(比如,INSERT INTO operation_table SET id = 100,op=‘get-cdn-log’)的事务,如图所示,那么在MySQL中如何实现呢?
MySQL是通过XA规范实现分布式事务的,所以我们有必要先来了解一下XA规范
在这里插入图片描述

什么是XA规范

提到XA规范,就不得不说DTP(Distributed Transaction Processing, 分布式事务处理)模型,因为XA规范约定的是DTP模型中的两个模块(事务管理其和资源管理器)的通信方式,如图所示。https://cdn.processon.com/userId2-663e15c8166b8c6ceb4340a7?e=1715348440&token=trhI0BY8QfVrIGn9nENop6JAc6l5nZuxhjQ62UfM:m5HMjar0byN2-MqjwQM3_VOZ1sA=

为了更好地理解DTP模型,我来解释下DTP各模块的作用。

  • 1.AP:应用程序(Application Program),一般是指事务的发起者(比如数据库客户端或者访问数据库的程序),定义事务对应的操作(比如更新操作
    UPDATE executed_table SET status = true WHERE id = 100)
  • 2.RM:资源管理器(Resource Manager),管理共享资源,并提供访问接口外部程序来访问共享资源,比如数据库。RM还应该具有事务提交或回滚的能力
  • 3.TM:事务管理器(Transaction Manager),一般指分布式事务的协调者。TM与每个RM进行通信,协调并完成事务的处理。

你是不是觉得这个模型看起来很复杂?其实在我看来,你可以这样理解DTP模型:应用程序访问、使用资源管器的资源,并通过事务管理器的事务接口(TX interface)定义需要执行的事务操作,然后事务管理器和资源管理器会基于XA规范执行二阶段提交协议。

那么XA规范是什么呢?它约定了事务管理器和资源管理器之间双向通信的接口规范,并实现了二阶段提交协议,如图所示。在这里插入图片描述

为了更好地理解这个过程,我们一起走一遍实现流程,以加深印象:

  • 1.AP(应用程序)联系TM(事务管理器)发起全局事务
  • 2.TM调用xa_open()建立与资源管理器的会话
  • 3.TM调用xa_start()标记事务分支(Transaction Branch)的开头
  • 4.AP访问RM(资源管理器)并定义具体事务分值的操作,比如更新一条数据记录(UPDATE executed_table SET status=true WHERE id = 100)和插入一条数据记录(INSERT INTO operation_table SET id =100, op=‘get-cdb-log’);
  • 5.TM调用xa_end()标记事务分支的结尾
  • 6.TM调用xa_prepare()通知RM做好事务分支提交的准备工作,比如锁定相关资源,也就是执行二阶段提交协议的提交执行阶段
  • 7.TM调用xa_commit()通知RM提交事务分支(xa_rollback()通知RM回滚事务),也就是执行二阶段提交协议的提交执行阶段
  • 8.TM调用xa_close()关闭与RM的会话。

整个过程也许有些复杂,不过你可以这样理解xa_start()和xa_end()在准备和标记事务分支的内容,然后调用xa_prepare()和xa_commit()(或者xa_rollback())执行二阶段提交协议,实现操作的原子性。注意,这些接口需要按照一定顺序执行,比如xa_start()必须在xa_end()之前执行。
另外,事务管理器对资源管理器调用的xa_start()和xa_end()这对组合,一般用于标记事务分支(就像上面的更新一条数据记录和插入一条数据记录)的开头和结尾。需要注意的是:

  • 1.对于同一个资源管理器,根据全局事务的要求,可以前后执行多个操作组合,比如,先标记一个插入操作,再标记一个更新操作;
  • 2.事务管理器只是标记事务,并不执行事务,最终是由应用程序通知资源管理器来执行事务操作的。

另外,XA规范还约定了如何向事务管理器注册和取消资源管理器的API接口(也就是ax_reg()和ax_unreg()接口)。这里需要注意的是,这两个接口是以ax_开头的,而不是像xa_start()那样以xa_开头,我们该如何通过MySQL XA实现分布式事务呢?

如何通过MySQL XA实现分布式事务

首先,你需要创建一个唯一的事务id(比如xid)来唯一标识事务,并调用XA START和XA END来定义事务分支对应的操作(比如
INSERT INTO operation_table SET id = 100, op = ‘get-cdn-log’),如图所示。在这里插入图片描述

接着,你需要调用XA PREPARE来执行二阶段提交协议的提交请求阶段,如图所示在这里插入图片描述

最后,你需要调用XA COMMIT 来提交事务(或者第哦啊用XA ROLLBACK来回滚事务),如图所示在这里插入图片描述
,至此,你就实现了全局事务的一致性
从上图所示的流程中可以看到,客户端在扮演事务管理器的角色,而MySQL数据库在扮演资源管理器的角色。但是这压力需要注意,上面流程中的xid必须是唯一值。
另外补充的是,如果你要开启MySQL的XA功能,则必须设置存储引擎为InnoDB,也就是说,在MySQL中,只有InnoDB引擎支持XA规范。d当然,可能有些人对MySQL XA有这样的疑问,能否将XA END和XA PREPARE合并到一起呢?答案是不能,因为在XA END之后,我们是可以直接执行XA COMMIT命令的,也就是一阶段提交(比如当共享资源变更只涉及一个RM时)。最后,我强调一下,MySQL XA性能不高,适合在并发性能要求不高的场景中使用,而我之所以需要采用MySQL XA实现分布式事务,是因为整个系统对并发性能要求不高,而且底层架构是多个第三方的,没办法改造。

注意

XA规范保证了全局事务的一致性,实现成本较低,而且得到了包括MySQL在内的主流数据库的支持。但是因为XA规范是基于二阶段提交协议实现的,所以它也存在二阶段提交协议的局限,列举如下:

  • 1.首先,XA规范存在单点问题,也就是说,因为事务管理器在整个流程中扮演的角色很关键,如果其宕机,比如第一阶段已经完成了,在第二阶段正准备提交的时候,事务管理器宕机了,那么相关的资源会被锁定,无法访问。
  • 2.其次,XA规范存在资源锁定的问题,也就是说,在进入准备阶段后,资源管理器中的资源将处于锁定状态,知道提交完成或者回滚完成才能解锁

思维拓展

虽然MySQL XA能解决数据库操作的一致性问题,但它的性能不高,适用于对并发性能要求不高的场景。那么,在MySQL XA不能满足并发需求是,我们应该如何重新涉及底层数据系统,来避免采用分布式事务呢?为什么呢?
当MySQL XA(即MySQL的分布式事务支持)无法满足并发性能需求时,可以考虑一下集中方法来重新设计底层数据系统,
以避免使用分布式事务并提高性能:

  • 1.业务逻辑分解
    1.1.将复杂的分布式事务分解为多个小的事务,每个事务在单个数据库上执行。通常在业务逻辑层面保证一致性,
    可以避免使用分布式事务
    1.2 使用最终一致性模型,如通过事件队列、发布/订阅机制等异步处理数据一致性问题

  • 2.数据分区。
    2.1.将数据水平分区到不同的数据库实例中,减少每个数据库实例上的并发访问压力
    2.2.通过分库分表来提高单个数据库实例的性能

  • 3.服务拆分
    3.1 采用微服务架构,将系统拆分为多个小的、松耦合的服务,每个服务对应一个数据库实例,从而减少分布式事务的使用
    3.2 各服务之间通过异步消息或者补偿事务来维持数据的一致性

  • 4.缓存机制
    4.1 使用缓存(如Redis)来减少对数据库的读写压力,提高并发性能
    4.2 通过缓存来处理读多写少的场景,减少对数据库的访问

  • 5.读写分离
    5.1 实施读写分离,将数据库的读操作和写操作分离到不同的数据库实例,以提高并发读取性能
    5.2 写操作仍然保证事务性,而读操作可以不参与事务,从而提高整体性能

  • 6.使用NoSQL数据库
    6.1 对于不需要强一致性的部分,可以考虑使用NoSQL数据库,如MongoDB、Cassandra等,它们通常提供更高的并发性能

  • 7.业务流程优化
    7.1 优化业务流程,减少事务性操作的一来。例如,通过业务上的妥协,允许一定程度的最终一致性

  • 8.性能优化
    8.1 对现有数据库进行性能优化,包括但不限于索引优化、查询优化、硬件升级等

  • 9.避免长事务
    9.1 长事务会占用大量资源并可能导致锁定问题,通过涉及更短的事务来减少对系统资源的占用

  • 10.分布式数据库
    10.1 考虑使用分布式数据库系统,如Google Spanner 、CockroachDB等,它们在涉及时就考虑了分布式事务的性能

避免使用分布式事务的原因主要包括:

  • 1.性能开销:分布式事务通常涉及多个节点,需要额外的通信和协调,这回增加延迟并降低性能
  • 2.复杂性:分布式事务的管理和调试更加复杂,可能导致难以追踪的问题
  • 3.可用性问题:在分布式系统中,任何节点的故障都可能影响到整个事务,降低了系统的可用性。
    因此,在涉及底层数据系统时,应根据业务需求和系统特点,选择合适的策略来避免分布式事务,同时确保系统的高性能和高可用性

重点总结

  • 1.XA规范是个标准的规范,也就是说,无论是否相同的数据库,只要这些数据库(比如MySQL、Oracle、SQL Server)支持XA规范,那么它们就能实现分布式事务,也就是能保证全局事务的一致性
  • 2.相比商业数据库对XA规范的支持,MySQL XA性能不高,所以,我不推荐在高并发的性能至上的场景中使用MySQL XA.
  • 3.在实际开发中,为了降低单点压力,我们通常会根据业务情况进行分库分表,即将表分布在不同的库中,那么在这种情况下,如果后续需要保证全局事务的一致性,则也需要实现分布式事务。

虽然MySQL XA能实现数据层的分布式事务,但会面临这样一个问题:在接收到外部的指令后,需要访问多个内部系统,执行指令约定的操作,而且,必须保证指令执行的原子性,也就是说,要么全部成功,要么全部失败,此时应该怎么做呢?答案是TCC

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611145.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenBayes 一周速览|Apple 开源大模型 OpenELM 上线;字节发布 COCONut 首个全景图像分割数据集,入选 CVPR2024

公共资源速递 This Weekly Snapshots ! 5 个数据集: * COCONut 大规模图像分割数据集 * THUCNews 新闻数据集 * DuConv 对话数据集 * 安徽电信知道问答数据集 * Sentiment Analysis 中文情感分析数据集 2 个模型: * OpenELM-3B-Inst…

三、配置带HybridCLR的ARCore开发环境

预告 本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。 专栏: Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可更多地关注Unity场景内容的制作。 “EnvInstaller…”支…

【前端基础】CSS样式+Vue中绘制时间轴

深度选择器 在 Vue.js 中,/deep/、>>>、:deep 和 ::v-deep 这些都是深度选择器,用于修改子组件的样式。它们主要用于解决作用域样式和组件样式之间的冲突问题。 1. /deep/ 或 >>> /deep/ 和 >>> 是相同的选择器,…

rider自定义代码片段(以C#为例)

1.先看效果 2.在哪设置 File→Settings→Editor→Live Templates→C#3.咋定义 代码片段中的变量用$$包围,而且我们可以自定义变量名称,如CName。选择我们自定义的变量名称我们可以修改变量是否可以被修改以及变量将自动匹配的值。 比如将CName自动填充…

123. SQL优化技巧汇总

文章目录 1 避免使用select *2 用union all代替union3 小表驱动大表4 批量操作5 多用limit6 in中值太多7 增量查询8 高效的分页9 用连接查询代替子查询10 join的表不宜过多11 join时要注意12 控制索引的数量13 选择合理的字段类型14 提升group by的效率15 索引优化 sql优化是一…

07_Flutter使用NestedScrollView+TabBarView滚动位置共享问题修复

07_Flutter使用NestedScrollViewTabBarView滚动位置共享问题修复 一.案发现场 可以看到,上图中三个列表的滑动位置共享了,滑动其中一个列表,会影响到另外两个,这显然不符合要求,先来看下布局,再说明产生这个…

Nginx rewrite项目练习

Nginx rewrite练习 1、访问ip/xcz,返回400状态码,要求用rewrite匹配/xcz a、访问/xcz返回400 b、访问/hello时正常访问xcz.html页面server {listen 192.168.99.137:80;server_name 192.168.99.137;charset utf-8;root /var/www/html;location / {root …

TDN: Temporal Difference Networks for Efficient Action Recognition 论文阅读

TDN: Temporal Difference Networks for Efficient Action Recognition 论文阅读 Abstract1. Introduction2. Related work3. Temporal Difference Networks3.1. Overview3.2. Short-term TDM3.3. Long-term TDM3.4. Exemplar: TDN-ResNet 4. ExperimentsAblation studiesCompa…

智能创作时代:AI引领下的内容生产革命与效率提升

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

部署xwiki服务需要配置 hibernate.cfg.xml如何配置?

1. 定位 hibernate.cfg.xml 文件 首先,确保您可以在 Tomcat 的 XWiki 部署目录中找到 hibernate.cfg.xml 文件: cd /opt/tomcat/latest/webapps/xwiki/WEB-INF ls -l hibernate.cfg.xml如果文件存在,您可以继续编辑它。如果不存在&#xff…

梅兰日兰NSJ400N断路器NSJ400N可议价

梅兰日兰 NSJ400N 3 极 400 安培 600 伏交流电 紧凑型断路器 制造商的原始标签 脱扣单元:LS 功能 –(长时间和短时间) 负载侧凸耳 中断额定值:65kA 240 Vac 35kA 480 伏交流电压 18kA 600 伏交流电压 (外观可能与照…

中国地面基本气象逐小时数据获取方式

环境气象数据服务平台提供了全国大约2100个点位,2023年1月1日至今的小时级数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF ERA5-Land Hourly陆面再分析资料和中国地面基本气象观测逐三小时数据,使用机器学习模型加工所得,对比…

【17-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

一文彻底读懂信息安全等级保护:包含等保标准、等保概念、等保对象、等保流程及等保方案(附:等保相关标准文档)

1. 什么是等级保护? 1.1. 概念 信息安全等级保护是指根据我国《信息安全等级保护管理办法》的规定,对各类信息系统按照其重要程度和保密需求进行分级,并制定相应的技术和管理措施,确保信息系统的安全性、完整性、可用性。根据等…

[C++][数据结构]哈希2:开散列/哈希桶的介绍和简单实现

前言 接着上一篇文章,我们知道了闭散列的弊端是空间利用率比较低,希望今天学习的开散列可以帮我们解决这个问题 引入 开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址**,具有相同地址的关键码归于同一子…

数据库表自增主键超过代码Integer长度问题

数据库自增主键是 int(10) unsigned类型的字段,int(M) 中 M指示最大显示宽度,不代表存储长度,实际int(1)也是可以存储21.47亿长度的数字,如果是无符号类型的,那么可以从0~42.94亿。 我们的表主键自增到21.47亿后&#…

英语学习笔记3——Sorry, sir.

Sorry, sir. 对不起,先生。 词汇 Vocabulary umbrella n. 伞,保护伞 注意读音 [ʌm’brelə] 英国人离不开雨伞。 please 请 特殊用法:让路(升调)      用餐礼仪(平调)      求求你…

大数据信用和征信报告的区别和联系,一定不要搞混了!

在当今数据驱动的社会,大数据的应用已经深入到各个领域。其中,大数据信用和征信报告成为金融、经济等领域中两个重要的概念。那么,大数据信用和征信报告有什么区别和联系呢? 一、定义与区别 1、大数据信用 大数据信用是指利用大数据技术&…

鸿蒙OpenHarmony技术:【Docker编译环境】

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境,以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下: 独立Docker环境:适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

数学:人工智能领域的基石与灵魂

在科技日新月异的今天,人工智能(AI)已经渗透到了我们生活的方方面面,从智能家居、智能医疗到自动驾驶、智能客服,AI无处不在。然而,当我们赞叹于AI的神奇时,却往往忽视了其背后的推动力——数学…
最新文章