MySQL分库分表下实现异构业务关系绑定

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL分库分表下实现异构业务关系绑定

业务背景


在业务量初期,数据量很小,大多数开发人员都选择了采用单库单表进行研发方案设计和构建。单库单表的好处是开发快,业务模型构建与库表映射简单,便于理解和沟通。随着业务增长,伴随单库单表而来的是查询瓶颈问题,首先在单表突破百万甚至千万,在已有索引的前提下查询优化空间并不多,而且数据变更往往要小心翼翼,一旦有大事务会直接拖慢整个数据库的查询性能,连锁雪崩效应带来的后果不堪设想,往往我们会对单库单表进行垂直和水平拆分以达到优化查询的目的。


问题描述


在水平拆分的过程中,通常都是以一个字段作为切分键对数据进行拆分,一般我们会使用用户ID等业务互通的字段。在水平拆分后,这里引申出一个问题,那就是当单表时,任何字段的检索都可以通过一条SELECT语句完成;在拆分后,由于切分键字段负责路由数据归属哪个库哪张表,在水平拆分数据之后切分键数据变成了必填字段,无论查询什么都需要至少或包含切分键字段参与,但是实际业务场景外部仅仅知道非切分键字段进行查询,需要对该场景进行解决。


切分键路由问题


单库单表、分库分表对比如下,水平拆分后业务字段中只有切分键字段可路由到数据,也即任何查询都要携带切分键信息才可以,要么通过切分键查询数据,要么通过切分键+任何业务字段进行查询。

表结构

字段定义

分库分表切分键字段

单库单表

字段A,字段B

不需要

分库分表

字段A,字段B

业务字段A


如下图是单库单表做水平拆分,这里切分键是使用的userId,根据不同的userId进行数据库表归属。单表数据被拆分到多库表中,降低了数据量集中在单表,但是只能通过userId或userId+业务字段进行查询,无法单独通过userName、certificateNo等非切分键字段独立查询。


解决方案


表结构设计


当数据库表水平拆分后,设计表结构如下

核心字段定义

分库分表切分键字段

业务表

业务字段A,业务字段B

业务字段A

绑定关系表

绑定字段,被绑定字段

被绑定字段(这里是业务表未路由字段,即业务字段A之外的字段)


以用户信息表举例,如下

业务字段定义

分库分表切分键字段

用户信息表

用户ID,姓名,身份证

用户ID

绑定关系表

身份证(绑定字段),用户ID(被绑定字段)

身份证(绑定字段)


  • 1.业务表正常水平拆分,以通用的核心业务字段做切分键进行数据路由
  • 2.增加绑定关系表,与业务表同等进行水平拆分,以被绑定关系的业务字段作为切分键进行数据路由


流程设计


sequenceDiagram

业务请求-->> 数据库: 数据持久化

Note right of 数据库: 1.持久化数据<br>2.初始化绑定标志位

数据库-->> 异步消息: 绑定MQ

Note right of 异步消息: 数据库事务:<br>1.数据库持久化<br/>2.异步MQ

异步消息-->> 数据库: 变更标志位

Note right of 异步消息: 完成绑定标志位

补偿任务-->> 数据库:数据补偿

Note right of 补偿任务: 扫描初始化绑定标志位

数据库-->> 异步消息: 绑定MQ

Note right of 异步消息: 补偿处理

异步消息-->> 数据库: 变更标志位

Note right of 异步消息: 完成绑定标志位,数据最终一致


  • 1.业务请求发起后通过数据库事务进行数据持久化和绑定MQ发送这两部操作,这部操作是依赖数据库的事务原子性来包装数据正常持久化和绑定MQ的发送的
  • 2.在数据持久化时,对绑定字段进行标志位初始化,表示业务数据持久化成功,但绑定字段未持久化完成,这里是一个中间态,如果绑定数据出现异常,补偿任务也可通过该标志位进行数据补偿
  • 3.异步消息负责处理绑定数据。由于业务表、绑定关系表路由字段不同,数据会路由到不同库表,因此无法通过数据库事务进行操作,这里通过异步绑定方式进行绑定关系持久化,实现最终一致
  • 4.补偿任务会定时轮询业务数据的标志位,在一定时间内未完成绑定业务的数据会进行补偿,重发MQ,数据最终一致


其他方案



常见的解决方案之一是可以通过MySQL的binlog日志汇总到第三方数据作业平台,通过HBase+ElasticSearch等手段进行数据聚合,这里不对该方式进行介绍,仅谈论利用纯关系型数据库解决异构场景的方法。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
关系型数据库 MySQL 数据库
第十四章 演示MYSQL自定义values.yaml绑定PV和PVC和数据库用户密码
第十四章 演示MYSQL自定义values.yaml绑定PV和PVC和数据库用户密码
69 0
|
4月前
|
存储 SQL 关系型数据库
MySQL分库分表
MySQL分库分表
63 0
|
4月前
|
关系型数据库 MySQL Java
MySQL单表膨胀优化之MyCat分库分表
MySQL单表膨胀优化之MyCat分库分表
111 0
|
4月前
|
SQL 关系型数据库 MySQL
②⑩① 【MySQL】什么是分库分表?拆分策略有什么?什么是MyCat?
②⑩① 【MySQL】什么是分库分表?拆分策略有什么?什么是MyCat?
91 0
|
4月前
|
SQL 存储 关系型数据库
Mysql系列-5.Mysql分库分表(中)
Mysql系列-5.Mysql分库分表
60 0
|
1月前
|
存储 算法 关系型数据库
(二十二)全解MySQL之分库分表后带来的“副作用”一站式解决方案!
上篇《分库分表的正确姿势》中已经将分库分表的方法论全面阐述清楚了,总体看下来用一个字形容,那就是爽!尤其是分库分表技术能够让数据存储层真正成为三高架构,但前面爽是爽了,接着一起来看看分库分表后产生一系列的后患问题,注意我这里的用词,是一系列而不是几个,也就是分库分表虽然好,但你要解决的问题是海量的。
164 3
|
14天前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
4月前
|
NoSQL 关系型数据库 MySQL
实时计算 Flink版操作报错之同步MySQL分库分表500张表报连接超时,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
SQL 算法 Java
(二十六)MySQL分库篇:Sharding-Sphere分库分表框架的保姆级教学!
前面《MySQL主从原理篇》、《MySQL主从实践篇》两章中聊明白了MySQL主备读写分离、多主多写热备等方案,但如果这些高可用架构依旧无法满足业务规模,或业务增长的需要,此时就需要考虑选用分库分表架构。
1577 2
|
1月前
|
存储 SQL 关系型数据库
(二十一)MySQL之高并发大流量情况下海量数据分库分表的正确姿势
从最初开设《全解MySQL专栏》到现在,共计撰写了二十个大章节详细讲到了MySQL各方面的进阶技术点,从最初的数据库架构开始,到SQL执行流程、库表设计范式、索引机制与原理、事务与锁机制剖析、日志与内存详解、常用命令与高级特性、线上调优与故障排查.....,似乎涉及到了MySQL的方方面面。但到此为止就黔驴技穷了吗?答案并非如此,以《MySQL特性篇》为分割线,整个MySQL专栏从此会进入“高可用”阶段的分析,即从上篇之后会开启MySQL的新内容,主要讲述分布式、高可用、高性能方面的讲解。
121 1