【问题】分布式事务的场景下如何保证读写分离的数据一致性
我的理解这个题目可以获得以下关键字:分布式处理、读写分离、数据一致性
那么就从”读写分离“做切入口吧,按我的理解其实就是在保证数据一致性的前提下两个(或以上)的数据库分别肩负不同的数据处理任务。太过久远的就不说了,最近几年其实都用的 MySQL 比较多。那么就基于 MySQL 我用到过的读写分离技术主要有:
- MySQL 主从热备机制
- Alibaba Canal 组件
- Apache Shardingsphere 中间件
总体来说应该可以归纳为一下这些优缺点(纯粹个人感受):
技术 | 机制 | 总结 |
---|---|---|
MySQL | 利用MySQL自身的日志复制机制,通过Binlog日志将主库的写操作同步到从库,实现数据备份和读写分离 | 优点: 1. 简单易用,不需要额外的中间件和组件; 2. 原生技术成熟; 3. 与业务代码解耦; 缺点: 1. 数据同步是异步的,只能保证最终一致性不能达到强一致性,这将导致高并发下数据不能保证读写一致; 2. 数据同步依赖网络和磁盘稳定性,会有数据不完整或丢失的风险(大大的教训有机会给各位分享); 3. 跨平台会存在兼容性问题; |
Alibaba Canal | 基于MySQL Binlog的增量订阅和消费组件,可以实时捕获MySQL的增量日志并消费。 | 优点: 1. 可实现数据库对应多产品的数据同步(如 kafka、redis、elasticsearch 等等); 缺点: 1. 额外的 Canal 服务同时需要增加维护和监控功能; 2. 高并发下存在性能问题; 3. 采用与 MySQL 相同的 binlog 复制机制只能保证最终一致性; |
Apache Shardingsphere | 开源的分布式数据库中间件解决方案,支持读写分离、分库分表等功能 | 优点: 1. 可直接在应用中通过配置路由实现 2. 多种协议数据同步模式,适合复杂的分布式场景,如: - XA 协议:基于两阶段提交和三阶段提交协议实现分布式事务管理。 - BASE 协议:基于最终一致性理念实现分布式事务管理。 - TCC 协议:基于补偿型事务理念实现分布式事务管理。 - Saga 协议:基于长事务理念实现分布式事务管理。 缺点: 1. 配置较为复杂会增加学习成本; |
其实之前还有用过 MyCAT 并且也有调研过 Google 的 Vitess。
MyCAT不是说它不好,只能说谁用谁知道。虽然接入成本低且性能上还可以,但功能相对单一且对分布式事务的支持也不是太好。
而 Vitess 又太过于庞大,若你有超大型的 MySQL 集群 Vitess 是一个不错的选择,但对于中小型企业来说选择较为灵活且通用的 Shardingsphere 无疑是更好的选择。
回到问题中,经上表比较,如果不需要强一致性且项目较小的情况下使用 MySQL 的主从热备保证最终一致性就可以了。但也有例外的情况,譬如我曾经有遇到过一个项目它的部分业务场景需要用到 Federated 引擎做跨服务数据映射,这种情况下就会影响到原来的主从热备,具体表现为从库同步会时不时停掉(这个说起来可以另起一篇文章有机会再给各位分享吧)。这种方式看情况使用吧,一般来说没用到哪些”古灵精怪“的数据库引擎的情况下是个不错的低成本解决方案。
至于 Alibaba Canal 已经是业界比较成熟的数据同步解决方案了,用它来将 MySQL 数据同步到 Redis 或者 MQ 就用过,但从 MySQL 同步到另一个 MySQL 就没有尝试过。众所周知 Alibaba Canal 也是通过 binlog 进行数据复写从而实现数据同步,那么如果要 MySQL 同步 MySQL,那么直接原生主从热备就可以了,还有你 Alibaba Canal 什么事儿吗?所以跨产品吧 Alibaba Canal是个不错的选择,但数据同步嘛,不至于,不至于…
所以,到目前为止我这边最终是选择使用 Apache Shardingsphere (以下简称”A-SS“)做分布式事务读写分离的这个事儿。
A-SS 已经被我加入到公司开发框架里面,考虑到公司项目一般都是”读多写少“的情况,A-SS 主要用在读写分离里的”写“操作,而”读“操作将直接使用 HikariCP 数据库连接池进行读取。
因为 A-SS 本来就支持多种分布式事务场景,所以只要你读懂了 A-SS 的配置文档,基本上就能够解决大部分的分布式事务事情了,剩下的可以完全托管给 A-SS 就可以了… 但话虽如此一些基本的概念还是要搞清楚的,由于我用的就是 XA 协议的二阶段提交,这里就以 XA 协议作为例子进行解释吧。
首先,A-SS 的 XA 协议二阶段提交是一种基于 X/Open 分布式事务处理(DTP)模型实现的数据同步技术,它可以保证跨多个数据库实例或服务的事务的强一致性。原理简单点理解就是:
- 当一个分布式事务需要提交时,A-SS 的事务管理器会先向所有参与该事务的数据库实例发送准备提交的命令;
- 每个数据库实例如果成功执行了事务中的SQL,则会响应准备提交成功的消息,表示该实例可以执行提交操作。如果任一实例失败,则响应 abort 消息;
- A-SS 收到所有数据库实例的准备提交成功响应后,会向所有实例发送正式提交事务的命令;
- 每个实例收到提交命令后,会正式提交事务,并响应提交成功至此事务完成;
- 如果在准备提交阶段任意一个实例失败,事务管理器会向所有实例发送回滚事务的命令然后整个事务回滚;
通过这样的两阶段提交过程,可以保证分布式事务要么全部分库都成功提交,要么全部分库都失败回滚。这样就能保证跨多个数据库实例的分布式事务的强一致性。
当然了,A-SS 也不是万能的它会存在很多使用限制(具体可以查看官方文档),在使用的时候也要多加小心。但就目前来看除了压测时的写入性能有点低之外(也有可能是压测的脚本有问题),暂时还没有发现什么太大的问题。
相关文章:
【问题】分布式事务的场景下如何保证读写分离的数据一致性
我的理解这个题目可以获得以下关键字:分布式处理、读写分离、数据一致性 那么就从”读写分离“做切入口吧,按我的理解其实就是在保证数据一致性的前提下两个(或以上)的数据库分别肩负不同的数据处理任务。太过久远的就不说了&…...

常见的Web安全漏洞有哪些,Web安全漏洞常用测试方法介绍
Web安全漏洞是指在Web应用程序中存在的可能被攻击者利用的漏洞,正确认识和了解这些漏洞对于Web应用程序的开发和测试至关重要。 一、常见的Web安全漏洞类型: 1、跨站脚本攻击(Cross-Site Scripting,XSS):攻击者通过向Web页面注入…...

随机微分方程
应用随机过程|第7章 随机微分方程 见知乎:https://zhuanlan.zhihu.com/p/348366892?utm_sourceqq&utm_mediumsocial&utm_oi1315073218793488384...

下载安装并使用小乌龟TortoiseGit
1、下载TortoiseGit安装包 官网:Download – TortoiseGit – Windows Shell Interface to Githttps://tortoisegit.org/download/ 2、小乌龟汉化包 在官网的下面就有官方提供的下载包 3、安装...
npm ERR!Cannot read properties of null(reading ‘pickAlgorithm’)报错问题解决
当在使用npm包管理器或执行npm命令时,有时候会遇到“npm ERR!Cannot read properties of null(reading ‘pickAlgorithm’)”这个错误提示,这是一个常见的npm错误。 这个错误提示通常说明在使用npm包管理器时,执行了某个npm命令,…...

web前端tips:js继承——组合继承
上篇文章给大家分享了 js继承中的借用构造函数继承 web前端tips:js继承——借用构造函数继承 在借用构造函数继承中,我提到了它的缺点 无法继承父类原型链上的方法和属性,只能继承父类构造函数中的属性和方法 父类的方法无法复用࿰…...

(7)(7.3) 自动任务中的相机控制
文章目录 前言 7.3.1 概述 7.3.2 自动任务类型 7.3.3 创建合成图像 前言 本文介绍 ArduPilot 的相机和云台命令,并说明如何在 Mission Planner 中使用这些命令来定义相机勘测任务。这些说明假定已经连接并配置了相机触发器和云台(camera trigger and gimbal hav…...
Python 爬虫小练
Python 爬虫小练 获取贝壳网数据 使用到的模块 标准库 Python3 标准库列表 os 模块:os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。math 模块:math 模块提供了数学函数…...
vue3 事件处理 @click
在Vue 3中,事件处理可以通过click指令来实现。click指令用于监听元素的点击事件,并在触发时执行相应的处理函数。 下面是一个简单的示例,展示了如何在Vue 3中处理点击事件: <template><button click"handleClick&…...

【第三阶段】kotlin语言使用replace完成加解密操作
fun main() {val password"ASDAFWEFWVWGEGSDFWEFEWGFS"println("原始密码:$password")//加密操作,就是把字符替换成数字,打乱加密var newPsdpassword.replace(Regex("[ADWF]")){when(it.value){//it.value 这里的每一个字…...

springBoot是如何实现自动装配的
目录 1 什么是自动装配 2 Spring自动装配原理 2.1 SpringBootConfiguration 编辑 2.2 EnableAutoConfiguration 2.2.1 AutoConfigurationPackage 2.2.2 Import({AutoConfigurationImportSelector.class}) 2.3 ComponentScan 1 什么是自动装配 自动装配就是将官方写好的的…...

基于python+MobileNetV2算法模型实现一个图像识别分类系统
一、目录 算法模型介绍模型使用训练模型评估项目扩展 二、算法模型介绍 图像识别是计算机视觉领域的重要研究方向,它在人脸识别、物体检测、图像分类等领域有着广泛的应用。随着移动设备的普及和计算资源的限制,设计高效的图像识别算法变得尤为重要。…...
管理类联考——逻辑——真题篇——按知识分类——汇总篇——二、论证逻辑——归纳评价——归纳谬误
文章目录 第一节 归纳谬误题-归纳评价-归纳谬误题-归纳评论-归纳谬误-比率→数量,从基数找问题真题(2019-39)-归纳评论-归纳谬误-先归纳题干错误-诉诸人身分成:①诉诸权威:某人在某方面很权威,他做什么都是对的。②人身攻击:因为过往履历有问题,所以做什么都是错的。③…...
C++适配器模式
1 简介: 适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端所期望的另一个接口。适配器模式允许不兼容的类能够协同工作,通过适配器类来实现接口的转换和适配。 2 实现步骤: 以下是使用C实现适配器模式的步骤&…...
cocos creator 设置精灵镜像翻转效果
在 Cocos Creator 中,你可以通过代码来设置精灵节点的镜像翻转效果。具体来说,你可以使用精灵节点的 setScale 方法来实现这一点。以下是在代码中设置水平镜像翻转和垂直镜像翻转的示例: // 获取精灵节点的引用 let spriteNode cc.find(&qu…...

kafka的位移
文章目录 概要消费位移__consumer_offsets主题位移提交 概要 本文主要总结kafka的位移是如何管理的,在broker端如何通过命令行查看到位移信息,并从代码层面总结了位移的提交方式。 消费位移 对于 Kafka 中的分区而言,它的每条消息都有唯一…...

大数据平台运维实训室建设方案
一、概况 本实训室的主要目的是培养大数据平台运维项目的实践能力,以数据计算、分析、挖掘和可视化的案例训练为辅助。同时,实训室也承担相关考评员与讲师培训考试、学生认证培训考试、社会人员认证培训考试、大数据技能大赛训练、大数据专业课程改革等多项任务。 实训室旨在培…...

dll调用nodejs的回调函数
nodejs使用ffi调用dll。dll中有回调函数调用js中的方法。 c语言中cdll.h文件 extern "C" {typedef void(*JsCall)(int index); //这个就是要传入的类型结构extern __declspec(dllimport) int Add(int a, int b);extern __declspec(dllexport) void CallBackTest(Js…...

网络安全--linux下Nginx安装以及docker验证标签漏洞
目录 一、Nginx安装 二、docker验证标签漏洞 一、Nginx安装 1.首先创建Nginx的目录并进入: mkdir /soft && mkdir /soft/nginx/cd /soft/nginx/ 2.下载Nginx的安装包,可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包…...

多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测
多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 多维时序 | MATLAB实现WOA-CNN-BiGRU-Attention多变量时间序列预测 1.程…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...