分布式与一致性协议之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.mzph.cn/pingmian/9837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm无法链接服务器环境(host is unresponsived)

困扰了很久的一个问题,一开始是在服务器ubuntu20.04上安装pycharm community,直接运行服务器上的pycharm community就识别不了anaconda中的环境 后来改用pycharm professional也无法远程连接上服务器的环境,识别不了服务器上的环境&#xff…

【Web后端】web后端开发简介_Servlet简介

1.web后端开发简介 Java企业级开发,也就是学习]avaEE(Enterprise Edition)版本,是一种结构和一套标准。在应用中开发的标准就是Servlet、jsp和JavaBean技术。jsp技术现在已基本处于淘汰状态,简单了解即可web后端开发,基于B/S模式的开发体系。…

雷蛇笔记本数据丢失怎么恢复?提供详细指南

在数字化时代,笔记本电脑已成为我们日常生活和工作中不可或缺的一部分。然而,尽管技术不断进步,数据丢失的风险仍然存在。雷蛇(Razer)作为一家知名的电脑硬件制造商,其笔记本电脑也难免会遇到这样的问题。当…

【数学】泰勒公式

目录 引言 一、泰勒公式 1.泰勒公式及推导 (1)推导 (2)公式 2.泰勒中值定理 (1)定理1(佩亚诺余项) (2)定理2(拉格朗日余项) …

接口自动化框架篇:使用python连接数据库 - PySQL介绍!

PySQL介绍:使用Python连接数据库的接口自动化框架 在接口自动化测试中,经常需要使用数据库来操作测试数据,验证接口返回的数据是否正确。Python是一种功能强大的编程语言,可以轻松地连接数据库,并进行各种数据库操作。…

每天五分钟深度学习:数学中的极值

本文重点 在数学领域中,极值是一个极其重要的概念,它不仅在纯数学理论研究中占据核心地位,而且在工程、物理、经济等实际应用领域也发挥着不可替代的作用。极值问题涉及函数的最大值和最小值,是微积分学中的一个基本问题。本文旨在详细介绍数学中的极值概念、性质、求解方…

【Vulhub靶场】Nginx 中间件漏洞复现

【Vulhub靶场】Nginx 中间件漏洞复现 一、Nginx 文件名逻辑漏洞(CVE-2013-4547)1. 影响版本2. 漏洞原理3. 漏洞复现 二、Nginx越界读取缓存漏洞(CVE-2017-7529)1. 漏洞详情2. 影响版本3. 漏洞复现 三、Nginx 配置错误导致漏洞&…

Spring JdbcTemplate实现自定义动态sql拼接功能

需求描述: sql 需要能满足支持动态拼接,包含 查询字段、查询表、关联表、查询条件、关联表的查询条件、排序、分组、去重等 实现步骤: 1,创建表及导入测试数据 CREATE TABLE YES_DEV.T11 (ID BINARY_BIGINT NOT NULL,NAME VARCH…

非模块化 Vue 开发的 bus 总线通信

个人感觉,JavaScript 非模块开发更适合新人上手,不需要安装配置一大堆软件环境,不需要编译,适合于中小项目开发,只需要一个代码编辑器即可开发,例如 vsCode。网页 html 文件通过 script 标签引入 JavaScrip…

使用Matplotlib绘制正弦和余弦函数曲线

前言 在数据可视化领域,Matplotlib是一个功能强大的Python库,它允许用户创建各种静态、交互式和动画图形。本文将引导您通过一个简单的示例,学习如何使用Matplotlib绘制正弦和余弦函数曲线。 第一步:导入必要的库: …

【漫画版】指挥官的排序战术:快速排序算法解密

作者介绍:10年大厂数据\经营分析经验,现任字节跳动数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python,欢迎探讨交流 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题…

基于自我对弈框架的偏好优化算法SPPO

传统的从人类反馈中进行强化学习(RLHF)的方法仰赖如Bradley-Terry模型等参数模型,但这样的模型难以充分捕捉人类偏好中的非递移性和非理性。最新的研究进展显示,直接使用偏好机率可以更准确地反映人类偏好,从而实现更灵活、更精确的语言模型对齐。本文提…

教你解决PUBG绝地求生登不进去 无法进入游戏 启动很慢的问题

尽管《绝地求生》(PUBG)以它那扣人心弦的战术竞技和逼真模拟的战场氛围风靡全球,揽获无数玩家的喜爱,但一些玩家在经历了一场血脉喷张的生存较量后,却不得不面对一个不那么愉悦的后续:游戏在结算阶段后出现…

YOLOv5改进 | 注意力机制 | 理解全局和局部信息的SE注意力机制

在深度学习目标检测领域,YOLOv5成为了备受关注的模型之一。本文给大家带来的是能够理解全局和局部信息的SE注意力机制。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方…

C语言/数据结构——每日一题(分割链表)

一.前言 今天在LeetCode觉得很不错,想和大家们一起分享这道链表题——分割链表:https://leetcode.cn/problems/partition-list-lcci废话不多说,让我们直接进入正题吧。 二.正文 1.1题目描述 1.2题目分析 大致思路:我们可以通过…

从头开始的建材类电商小程序开发指南

在当今数字化时代,小程序已经成为了许多企业推广和销售的重要渠道。对于建筑材料行业来说,开发一个属于自己的小程序商城不仅可以提升产品曝光度,还可以提供更好的用户购物体验。下面,我们将逐步教你如何开发建筑材料行业小程序。…

文章分享:《肿瘤DNA甲基化标志物检测及临床应用专家共识(2024版)》

本文摘自于《肿瘤DNA甲基化标志物检测及临床应用专家共识(2024版)》 目录 1. DNA甲基化标志物概述 2 DNA甲基化标志物的临床检测 2.1 临床样本前处理注意事项 2.2 DNA甲基化标志物检测技术方法 2.2.1 DNA提取与纯化 2.2.2 DNA转化 2.2.3 DNA 甲基…

翻工第二次 Ant Design Pro 下载,发现问题,电脑网络配置有误,魔法了

一、相关网址链接 鱼皮的用户中心项目 (前端Ant Design Pro构建) 语雀 ## 没有选择umi版本这一步 Issue #11144 ant-design/ant-design-pro GitHub 关于umi ui图标未显示问题_umi ui不出现-CSDN博客 二、存在问题 导致下载速度慢 本人镜像代码写…

AI实景模型无人自动直播助手.减少商家在短视频线上卖货的成本,开启无人直播新时代!

在互联网时代,直播已经成为信息传播的主流方式,尤其是在年轻人中,直播更是备受追捧。然而,对于许多想要尝试直播的人来说,缺乏合适的主播可能成为一大障碍。那么,面对这一难题,如何实现手机无人…

C++ 常量

常量是指在程序运行过程中,其值不能被改变的量。 如:i255;arearr3.14; 在程序中直接使用数值有两个问题: 可读性差; 可维护差; 一 符号常量 C语言符号常量的顶用形式如下: 二 C99的const常量 C 语言co…