如何保证数据库分布式事务的强一致性

news2024/11/25 8:18:56

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节
    • 小结

概要

针对分布式数据库,如何保证分布式事务的强一致性,是分布式数据库的关键。分布式事务的强一致性方案这里介绍两种,一种是GTM(global transaction manager),另一种是基于XA协议的两阶段提交(2PC)。注意,本文是基于MySQL数据库的分析,但是思想是数据库通用的。

GTM

全局事务管理器,思想是将原本集中式数据库的MVCC方案拓展到分布式。

要素

  • GXID:全局唯一递增的事务id。
  • Global Snapshot: 全局事务快照,我个人理解为一个全局版的ReadView。

流程:

如图所示:

  1. 分布式事务开启,gate向GTM申请GXID和Global Snapshot,
  2. 各shard, 开启单机事务,把GXID和Snapshot下发执行。
  3. 各shard读取数据时, 会结合GXID和Snapshot来读取全局一致的数据。
  4. 分布式事务提交或者回滚完成之后,Gate向GTM汇报事务状态,使得GTM可以维护所有的全局事务的状态

基于GTM的MySQL分布式事务强一致性方案:

  1. Global Snapshot(全局快照)   
    1.  global_up_limit_id: 当前未提交的全局事务的最小值        
    2. global_low_limit_id:当前已分配的全局事务号+1;(ReadView中 也成为max_id)
    3. global_trx_ids:当前未提交全局事务id列表
  2. 基于Global Snapshot的可见性判断

     

    1. gxid < global_up_limit_id,对于当前global snapshot都是可见的。
    2. gxid >= global_low_limit_id,对于当前global snapshot都是不可见的。
    3. global_trx_ids 中的事务对于当前global snapshot是不可见的
  3. 数据的读取过程
    1. 从最新版本开始,找到第一个对于当前global snapshot都可见的数据版本
  4. 总结:和单机版的MySQL的MVCC版本控制思想一致,不过是将范围扩大到了全局。
  5. 局限性:
    1. 存在性能瓶颈,无法支撑大规模集群。
    2. 扩展性查,无法满足副本的全局一致性读以及备份和恢复需求。

XA

MySQL的XA协议是一个事务协议,用于实现分布式事务。XA协议包含了两个阶段preparecommit。在prepare阶段,事务协调者(Transaction Coordinator)在所有参与者(Participants)上执行prepare操作。如果所有参与者都成功的执行了prepare操作,那么该事务就可以被提交(commit)。如果有一个参与者在prepare阶段失败,则该事务将被回滚。

在MySQL中,XA协议通常用于在多个MySQL实例之间执行分布式事务。通过实现XA协议,多个MySQL实例可以参与到同一个分布式事务中,并保证事务的ACID特性。

在MySQL中,XA协议需要开启事务支持(transaction support),以及使用XID(transaction identifier)来跟踪事务。

两阶段提交(2PC)

第一阶段:

1. 协调者向参与者发出执行请求执行事务的消息

2. 参与者执行事务, 并将undo 和 redo 信息记录在事务日志中,但不commit, 资源已经被锁定。

3. 参与者向协调者发送投票消息,Agree表示事务执行成功,Abort表示执行失败。

第二阶段:

1. 协调者收到所有参与者的投票信息,所有参与者都返回Agreee,协调者向所有参与者发送commit消息。

2. 参与者收到 ‘commit’消息后,执行提交操作,并释放在第一阶段中申请的资源。

3. 如果任何一个参与者返回“否决”消息,协调者将向所有参与者发送“回滚”

4. 参与者收到“回滚”消息,执行回滚操作,并释放第一阶段中申请的所有资源。

总结:

1. 相较于GTM, XA和2PC的实现很复杂,但是可以支持大规模集群,扩展性也很好,可以实现副本的全局一致性读以及全局一致性的备份和恢复。

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

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

相关文章

12道前端知识题目深入浅出下JavaScript

文章目录 1. 原型和原型链2. 作用域和闭包3. 高阶函数和函数式编程4. 异步编程和Promise、async/await5. 正则表达式6. 对象属性描述符和代理7. ES6新特性如模板字符串、解构赋值、箭头函数、let/const等8. 设计模式和架构模式设计模式架构模式 9. 性能优化技巧和调试技巧1. 性…

chatgpt赋能python:Python如何持续保存CSV文件

Python如何持续保存CSV文件 如果你需要不断更新数据并将其保存到CSV文件中&#xff0c;Python语言可以轻松完成这个任务。本文将介绍如何使用Python在代码执行的同时&#xff0c;将数据不断写入CSV文件中&#xff0c;实现持续保存的功能。 CSV文件是什么&#xff1f; CSV代表…

chatgpt赋能python:抓包是什么?

抓包是什么&#xff1f; 当我们在浏览器中访问一个网站时&#xff0c;我们的电脑会向网络服务器发送请求并接收响应。这个过程中&#xff0c;有一些工具可以让我们查看和分析这些请求和响应&#xff0c;其中最常用的就是“抓包”。 抓包就是指截获网络通信过程中的数据包并分…

chatgpt赋能python:Python怎么指定循环次数?

Python怎么指定循环次数&#xff1f; Python是一种广泛应用于编程领域的高级编程语言&#xff0c;它具有简单易学、代码可读性强、语言编写规范等诸多优点。其中&#xff0c;循环是Python语法中的重要一环&#xff0c;而如何指定循环次数则是其中一个重要的问题。 什么是循环…

Linux 检测通信路径上的PMTU(路径最大传输单元)

问题描述 终端设备向云端POST数据&#xff0c;数据量较小的没有问题&#xff0c;数据量大的必然出现丢包。网络很通畅&#xff0c;延迟较低。 分析 后来发现&#xff0c;终端到云端的通信路径上某个路由器节点的MTU小于终端的MTU&#xff0c;当终端发出的IP数据包长度大于该…

力扣题库刷题笔记4--寻找两个正序数组的中位数

1、题目如下&#xff1a; 2、个人Python代码实现如下&#xff1a; 代码如下&#xff1a; class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: nums nums1 nums2 #合并数组 nums.sort() …

java【toString覆写】

笔试题 输出结果&#xff1a;D.func(),num0 解析&#xff1a; 继承的原则&#xff0c;先调用父类的无参构造&#xff0c;因此调用func()函数func() 此方法&#xff0c;new 的是 D 的对象&#xff0c;且被D所重写&#xff0c;触发动态绑定&#xff0c;直接调用D中的func()方法在…

Jupyter Notebook是什么及使用

一、什么是Jupyter Notebook Jupyter项目是一个非盈利的开源项目&#xff0c;源于2014年的python项目&#xff0c; Juptter Notebook&#xff0c;原名IPython Notbook&#xff0c;是IPython的加强网页版&#xff0c;一个开源web应用程序名字源自Julia、Python和R是一款程序员…

CRC校验(1):CRC原理、计算例子和最优多项式的选择

CRC(Cyclic Redundancy Check)&#xff0c;即循环冗余校验&#xff0c;它通过计算生成固定长度的校验码&#xff0c;用于验证数据在传输过程中是否发生了错误或损坏&#xff0c;从而确保数据的完整性。假设我们想把小写字母z发送出去。在Unicode中&#xff0c;z由数字0x7A表示&…

这有可能是国内最有趣的大学生知识交流社区了吧?

WRITE-BUG数字空间&#xff08;http://www.writebug.com&#xff09;内测 WRITE-BUG创建于2019年&#xff0c;创始团队主要来自于清华大学、中国人民大学等国内高校学生。运营至今&#xff0c;已累积100000注册用户&#xff0c;91%是18-24岁在校大学生&#xff0c;覆盖国内绝大…

前端vue基于秋云 ucharts echarts词云图 多重圆弧进度条 弧形进度条

前端vue基于秋云 ucharts echarts词云图 多重圆弧进度条 弧形进度条 进度条 弧形进度条 圆形进度条 词云图&#xff0c; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id13029 效果图如下: #### 使用方法 使用方法 <!-- 关键字 --> &l…

java设计模式之:代理模式

文章目录 简介静态代理动态代理Cglib代理spring中AOP使用代理总结 简介 代理(Proxy)模式是一种结构型设计模式&#xff0c;提供了对目标对象另外的访问方式&#xff1b;即通过代理对象访问目标对象。 这样做的好处是&#xff1a;可以在目标对象实现的基础上&#xff0c;增强额…

注意力机制和Transformer

注意力机制和Transformer 机器翻译是NLP领域中最重要的问题之一&#xff0c;也是Google翻译等工具的基础。传统的RNN方法使用两个循环网络实现序列到序列的转换&#xff0c;其中一个网络&#xff08;编码器&#xff09;将输入序列转换为隐藏状态&#xff0c;而另一个网络&…

【探测器】win10网卡设置巨型帧解决探测器无法成像的问题

【探测器】win10网卡设置巨型帧解决探测器无法成像的问题 1、背景2、解决办法3、补充说明 1、背景 探测器很奇怪的叫法&#xff0c;其实就是相机。 大家在安防领域&#xff0c;智慧工厂&#xff0c;智慧学校、智慧工地等经常会看到海康、大华的网络摄像头&#xff0c; 这些摄像…

软考高级架构师笔记-7信息安全

目录 1. 前言 & 考情分析2. 信息安全1. 信安基础知识2. 信息安全系统的组成框架3. 信息安全技术4. 信息安全的抗攻击技术5. 信息安全的保证体系和评估方法3. 网络安全4. 网络安全协议1. 前言 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记…

集成测试总结

集成测试 基本概念&#xff1a;将软件集成起来后进行测试。集成测试又叫子系统测试、组装测试、部件测试等。集成测试主要是针对软件高层设计进行测试&#xff0c;一般来说是以模块和子系统为单位进行测试。 集成测试包含的层次&#xff1a; 模块内的集成&#xff0c;主要是测…

【编译、链接、装载六】汇编——目标文件

【编译和链接六】汇编——目标文件 一、目标文件_存储格式1、生成目标文件2、目标文件存储格式3、file查看文件格式 二、查看目标文件的内部结构——objdump三、代码段四、 数据段和只读数据段五、 ELF文件结构描述1、头文件2、段表2.1、重定位表2.2、字符串表2.3、查看重定位表…

信号完整性:反射 初步认识

反射是怎么形成的 信号的反射和互连线的阻抗密切相关。反射的最直接原因是互连线的阻抗发生了突然变化&#xff0c;只要互连线的阻抗不连续的点&#xff0c;该处就会发生反射。 信号是以电磁波的形式在走线中传播的&#xff0c;如果从传统的电路理论角度去看&#xff0c;是无…

ZipList(压缩链表)

基本概述 ZipList 是一种特殊的“双端链表” &#xff0c;由一系列特殊编码的连续内存块组成。可以在任意一端进行压入/弹出操作, 并且该操作的时间复杂度为 O(1)。 基本结构&#xff1a; 各部分所占字节、基本介绍&#xff1a; entry&#xff0c;节点占用字节不固定&#xff0…

计算机图形学与opengl C++版 学习笔记 第9章 天空和背景

目录 9.1 天空盒9.2 天空穹顶9.3 实现天空盒9.3.1 从头开始构建天空盒9.3.2 使用OpenGL立方体贴图 9.4 环境贴图补充说明 对于室外3D场景&#xff0c;通常可以通过在地平线上创造一些逼真的效果&#xff0c;来增强其真实感。当我们极目远眺&#xff0c;目光越过附近的建筑和森林…