MySQL之分库分表后带来的“副作用”你是怎么解决的?
目录标题
- 一、垂直分表后带来的隐患
- 二、水平分表后带来的问题
- 1.多表联查问题
- 2.增删改数据问题
- 3.聚合操作问题
- 三、垂直分库后产生的问题
- 1.跨库join问题
- 2.分布式事务问题
- 3.部分业务库依然存在的性能问题
- 四、水平分库后需要解决的问题
- 1.聚合操作和连表问题
- 2.数据分页问题
- 3.ID主键的唯一性问题
- 4.流量迁移、容量规划、节点扩容
一、垂直分表后带来的隐患
垂直分表后当试图读取一条完整数据时,需要连接多个表来获取,对于这个问题只要在切分时,设置好映射的外键字段即可。当增、删、改数据时,往往需要同时操作多张表,并且要保证操作的原子性,也就是得手动开启事务来保证,否则会出现数据不一致的问题。
这里可以看到,垂直分表虽然会有后患问题,但带来的问题本质上也不算大问题,就是读写数据的操作会相对麻烦一些,下面来看看其他的分库分表方案,接下来是真正的重头戏
二、水平分表后带来的问题
水平分表就是将一张大表的数据,按照一定的规则划分成不同的小表,当原本的一张表变为多张表时,虽然提升了性能,但问题随之也来了~
1.多表联查问题
- 全局表:对于一些不经常更新但需要频繁联查的小表,可以将其设置为全局表,每个分片都有一份完整的副本。这样在进行联查时,可以直接使用本地的全局表数据。
- 中间件支持:使用如ShardingSphere这样的分布式数据库中间件,它们能够智能地解析SQL语句,并在必要时从多个分片获取数据,然后在中间件层合并结果。
- 预聚合与缓存:对于一些固定模式的联查,可以在后台定期执行并存储结果到缓存或专门的汇总表中!
- 放入第三方中间件中,然后依赖于第三方中间件完成,如ES。一些大企业选用的方案。
2.增删改数据问题
- 分片键策略定位具体库表
3.聚合操作问题
- 放入第三方中间件中,然后依赖于第三方中间件完成,如ES。一些大企业选用的方案。
三、垂直分库后产生的问题
垂直分库是按照业务属性的不同,直接将一个综合大库拆分成多个功能单一的独享库,分库之后能够让性能提升N倍,但随之而来的是需要解决更多的问题,而且问题会比单库分表更复杂!
1.跨库join问题
- Java系统中组装数据,通过调用对方服务接口的形式获取数据,然后在程序中组装后返回。
2.分布式事务问题
分布式事务应该是分布式系统中最核心的一个问题,这个问题绝对不能出现,一般都要求零容忍,也就是所有分布式系统都必须要解决分布式事务问题,否则就有可能造成数据不一致性。
- ①Best Efforts 1PC模式。
- ②XA 2PC、3PC模式。
- ③TTC事务补偿模式。(柔性事务)
- ④MQ最终一致性事务模式。(常用)
3.部分业务库依然存在的性能问题
- 再做水平分库即可
四、水平分库后需要解决的问题
1.聚合操作和连表问题
- 放入第三方中间件中,然后依赖于第三方中间件完成,如ES。一些大企业选用的方案。
2.数据分页问题
- 放入第三方中间件中,然后依赖于第三方中间件完成,如ES。一些大企业选用的方案。
3.ID主键的唯一性问题
- 在业务系统中,利用特殊算法生成有序的分布式ID,比如雪花算法、Snowflake算法等。
4.流量迁移、容量规划、节点扩容
线上环境从单库切换到分库分表模式,数据该如何迁移才能保证线上业务不受影响,对于这个问题来说,首先得写脚本将老库的数据同步到分库分表后的各个节点中,然后条件允许的情况下先上灰度发布,划分一部分流量过来做运营测试。
如果没有搭建完善的灰度环境,那先再本地再三测试确保没有问题后,采用最简单的方案,先挂一个公告:“今日凌晨两点后服务器会进入维护阶段,预计明日早晨八点会恢复正常运转”!然后停机更新,但前提工作做好,如:Java代码从单库到分库分表要改进完善、数据迁移要做好、程序调试一切无误后再切换,同时一定要做好版本回滚支持,如果迁移流量后出现问题,可以快捷切换回之前的老库。
根据实际情况先做垂直分库,然后再对于核心库做水平分库,水平分库的节点数量要保证的是2的整倍数,方便后续扩容。
扩容一般是指水平分库,也就是当一个业务库无法承载流量压力时,需要对相应的业务的节点数量,但扩容时必须要考虑本次增加节点会不会影响之前的业务,因为很多情况下,当节点的数量发生改变时,可能会影响数据分片的路由规则,这时就要考虑扩容是否会影响原本的路由规则。
扩容一般都是基于水平分库的基础上,进一步对水平库做节点扩容,目前业内有两种主流做法:水平双倍扩容法、异步双写扩容法。
水平双倍扩容法
想要使用双倍扩容法对节点进行扩容,首先必须要求原先节点数为2的整数倍,同时路由规则必须要为数值取模法、或Hash取模法,否则依旧会造成扩容难度直线提升。同时双倍扩容法还有一种进阶做法,被称之为从库升级法,也就是给原本每个节点都配置一个从库,然后同步主节点的所有数据,当需要扩容时仅需将从库升级为主节点即可,过程如下:
二倍扩容!!
如果你在的公司财大气粗,我推荐从库升级法,因为从库升级法不仅仅能够避免数据迁移,而且还能保证高可用,当主节点宕机时可以让从节点直接上线顶替,再配合Keepalived+VIP做重启,基本上能够让数据库真正达到7x24小时不间断运行。
异步双写扩容法(常用)
前面聊到的水平双倍扩容法,仅仅只是扩容时的一种方案,除此之外还有另一种方案称之为异步双写扩容法,大体示意图如下:
对于需要扩容时的情况,首先依旧把新的数据写入到老库中,然后写完之后同步给MQ一份,后续再由MQ的消费者去将新数据写到新库中,同时新库在这期间,会去同步老库中原有的数据,这个动作持续到所有旧数据全部同步完成后,再以老库作为校验基准,核对数据无误后,再将模式切换为扩容后的分库模式
稍微总结一下整个流程,如下:
- 第一步:修改应用服务代码,加上MQ双写方案,配置新库同步老库数据,然后部署。
- 第二步:等待新库同步复制老库中所有老数据,期间新写入的数据也会通过MQ写入新库。
- 第三步:老库中的所有老数据全部同步完成后,以老库作为校验基准,校对新库中的数据。
- 第四步:校对新老库之间的数据无误后,修改应用配置和代码,将双写改为路由分片,再次部署。
其实异步双写方案,也可以用来做后续的节点扩容,但会相对来说比较麻烦一些。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们处理,核实后本网站将在24小时内删除侵权内容。
相关文章:

MySQL之分库分表后带来的“副作用”你是怎么解决的?
目录标题 一、垂直分表后带来的隐患二、水平分表后带来的问题1.多表联查问题2.增删改数据问题3.聚合操作问题 三、垂直分库后产生的问题1.跨库join问题2.分布式事务问题3.部分业务库依然存在的性能问题 四、水平分库后需要解决的问题1.聚合操作和连表问题2.数据分页问题3.ID主键…...

【Python】Python-JOSE:Python 中的 JSON Web Token 处理库
Python-JOSE 是一个用于处理 JSON Web Token (JWT) 和 JOSE (JSON Object Signing and Encryption) 标准的 Python 库。它支持对 JWT 进行签名、加密、解密和验证等操作,是处理基于 OAuth 2.0 和 OpenID Connect 协议的身份验证和授权任务的理想选择。Python-JOSE 实…...

SpringBoot3+Druid YAML配置
背景 Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。现在已经SpringBoot3,Druid的配置也需要随…...

【c语言——指针详解(3)】
文章目录 一、字符指针变量二、数组指针变量1、 数组指针变量是什么?2、 数组指针变量怎么初始化 三、⼆维数组传参的本质四、函数指针变量1、函数指针变量的创建2、函数指针变量的使⽤3、两段有趣的代码1)typedef 关键字2)typedef和define的…...

QT系统学习篇(2)- Qt跨平台GUI原理机制
一、Qt工程管理 1、新建项目: 我们程序员新建项目对话框所有5类项目模板 Application: Qt的应用程序,包含Qt Quick和普通窗口程序。 Library: 它可以创建动态库、静态库、Qt Creator自身插件、Qt Quick扩展插件。 其他项目: 创建单元测试项目、子目录项…...
运用MinIO技术服务器实现文件上传——在Linux系统上安装和启动(一)
# MinIO 单机版环境搭建详解 ## 1. 简介 随着大数据时代的到来,数据存储的需求日益增大,如何有效地存储和管理大规模的非结构化数据成为许多企业和开发者面临的挑战。MinIO 作为一个高性能、分布式对象存储系统,致力于为用户提供简单、快速…...
Python技术深度探索:从基础到进阶的实践之旅(第一篇)
Python技术深度探索:从基础到进阶的实践之旅(第一篇) 在编程的世界里,Python以其简洁的语法、强大的库支持和广泛的应用领域,成为了无数开发者心中的“瑞士军刀”。无论是数据分析、机器学习、Web开发,还是…...

利士策分享,旅游是否要舟车劳顿才能尽兴?
利士策分享,旅游是否要舟车劳顿才能尽兴? 国庆假期,当夜幕降临,城市灯火阑珊,一场关于美食与等待的较量悄然上演。 李女士在北京天坛公园附近餐厅的等位经历——前方1053桌的壮观景象,不仅让人咋舌…...

C++入门——类的默认成员函数(取地址运算符重载)
文章目录 一、const成员函数二、取地址运算符重载总结 一、const成员函数 1.将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后⾯。2.const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进…...

学习记录:js算法(四十九):二叉树的层序遍历
文章目录 二叉树的层序遍历网上思路队列循环 总结 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的层序遍历 。 (即逐层地,从左到右访问所有节点)。 图一: 示例 1:如图一 输入:roo…...

【PCB工艺】表面贴装技术中常见错误
系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 1、什么是SMT和SMD2、表面贴装技术的优势是什么?3、通孔和表面贴装技术之间的区别是什么?4、焊…...

3.使用条件语句编写存储过程(3/10)
引言 在现代数据库管理系统中,存储过程扮演着至关重要的角色。它们是一组为了执行特定任务而编写的SQL语句,这些语句被保存在数据库中,可以被重复调用。存储过程不仅可以提高数据库操作的效率,还可以增强数据的安全性和一致性。此…...
Effective C++中文版学习记录(三)
Effective C中文版学习记录(三) 章节三:资源管理 进度:17/55 文章目录 Effective C中文版学习记录(三)条款13、以对象管理资源条款14、在资源管理类中小心copying行为条款15、在资源管理类中提供对原始资…...
VBA学习(76):文件合并神器/代码
1.定义变量 Dim savePath As String Dim SaveFile As String Dim dataFolder As String Dim FileSystem As Object Dim folder As Object Dim FileExtn As String Dim t As Integer Dim blnCkb As Boolean 2.自定保存文件名、选择待合并文件所在文件夹 Private Sub CkbName_…...

非农就业数据超预期,美联储降息步伐或放缓?
KlipC报道:当地时间10月4日,美国劳工部发布了最新的非农就业数据。数据显示,9月非农就业人数增加25.4万人,远超市场预期。失业率为4.1%,比上月略降0.1个百分点。平均时薪环比增长0.4%,亦高于市场预期。此外…...

每日OJ题_牛客_乒乓球筐_哈希_C++_Java
目录 牛客_乒乓球筐_哈希 题目解析 C代码 Java代码 牛客_乒乓球筐_哈希 乒乓球筐__牛客网 (nowcoder.com) 描述: nowcoder有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类&#…...

基于SpringBoot+Vue的酒店客房管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...

检索增强思考 RAT(RAG+COT):提升 AI 推理能力的强大组合
在人工智能领域,大型语言模型(LLMs)已经取得了显著的进展,能够生成类似人类的文本并回答各种问题。然而,它们在推理过程中仍面临一些挑战,例如缺乏对事实的准确把握以及难以处理复杂的多步骤问题。为了解决…...

python脚本实现Redis未授权访问漏洞利用
之前介绍过Redis未授权访问漏洞,本文使用python实现Redis未授权访问检测以及对应三种getshell。 1 测试环境准备 CentOS 7(192.168.198.66/24):安装 Redis 服务器并用 root 权限开启服务,关闭保护模式;安…...
简单线性回归分析-基于R语言
本题中,在不含截距的简单线性回归中,用零假设对统计量进行假设检验。首先,我们使用下面方法生成预测变量x和响应变量y。 set.seed(1) x <- rnorm(100) y <- 2*xrnorm(100) (a)不含截距的线性回归模型构建。 &…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...