MySQL数据库分库分表方案

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL数据库分库分表方案

MySQL数据库分库分表方案

前言

随着项目不断迭代,使用人数的不断增加。数据库中某些表数据正在逐步膨胀,往单表千万迅速靠拢。所以最近领导也在考虑做一下分库分表,写此文章记录下来。

一、什么是分库分表?

分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。

分表:从单张表拆分成多张表的过程,将数据散落在多张表内。

二、为什么分库分表?

随着平台的业务发展,数据可能会越来越多,甚至达到亿级。以MySQL为例,单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而明显降低。单表的数据量超过1000w,性能也会下降严重。这就会导致查询一次所花的时间变长,并发操作达到一定量时可能会卡死,甚至把系统给拖垮。

三、怎么选择分库分表策略?

切分方案 解决的问题
只分库不分表 数据库读?写QPS过高,数据库连接数不足
只分表不分库 单表数据过大,存储性能遇到瓶颈
即分库又分表 连接数不足+数据量过大引起的存储性能瓶颈

四、分库分表方式及带来的问题?

分库分表有效的缓解了大数据、高并发带来的性能和压力,也能突破网络IO、硬件资源、连接数的瓶颈,但同时也带来了一些问题。

4.1、事务一致性问题

由于分库分表把数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题,我们需要额外编程解决该问题。

4.2、跨节点join

在没有进行分库分表前,我们检索商品时可以通过以下SQL对店铺信息进行关联查询:


SELECT p.*,s.[店铺名称],s.[信誉]
FROM [商品信息] p 
LEFT JOIN [店铺信息] s ON p.id = s.[所属店铺]
WHERE...ORDER BY...LIMIT...

但经过分库分表后,[商品信息]和[店铺信息]不在一个数据库或一个表中,甚至不在一台服务器上,无法通过sql语句进行关联查询,我们需要额外编程解决该问题。

4.3、跨节点分页、排序和聚合函数

跨节点多库进行查询时,limit分页、order by排序以及聚合函数等问题,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序。例如,进行水平分库后的商品库,按ID倒序排序分页,取第一页:

以上流程是取第一页的数据,性能影响不大,但由于商品信息的分布在各数据库的数据可能是随机的,如果是取第N页,需要将所有节点前N页数据都取出来合并,再进行整体的排序,操作效率可想而知,所以请求页数越大,系统的性能也会越差。

在使用Max、Min、Sum、Count之类的函数进行计算的时候,与排序分页同理,也需要先在每个分片上执行相应的函数,然后将各个分片的结果集进行汇总和再次计算,最终将结果返回。

4.4、主键避重

在分库分表环境中,由于表中数据同时存在不同数据库中,主键值平时使用的自增长将无用武之地,某个分区数据库生成的ID无法保证全局唯一。因此需要单独设计全局主键,以避免跨库主键重复问题。

image.png

由于分库分表之后,数据被分散在不同的服务器、数据库和表中。因此,对数据的操作也就无法通过常规方式完成,并且它还带来了一系列的问题。我们在开发过程中需要通过一些中间件解决这些问题,市面上有很多中间件可供我们选择,其中Sharding-JDBC和mycat较为流行。

五、使用分库分表组件帮我们解决一些问题

分库分表的技术方案总体上来讲分为两大类:应用层依赖类中间件、中间层代理类中间件。

我们选择技术方案时主要考虑的是,开源、开发成本、学习成本、技术复杂度,技术使用人数,参考资料的多少等方面。

由于我本人也不是每样技术都有用过。所以在这里只是在能力范围内做一个初步了解,并进行选型。目前这些组件对于分库分表的一些主要问题都有相对完善的解决方案,区别的只是一些细节的问题。又结合目前项目所在只需要轻量级的分库分表。所以我还是比较偏向成本较低,复杂度较低的方案。

目前市面上使用较多的是,mycat及sharding-jdbc。mycat属于中间层代理类中间件、sharding-jdbc属于应用层依赖类中间件

5.1. Atlas

奇虎360

关键词:分库分表 Atlas

百度为您找到相关结果约707,000个

中间层代理类中间件

github.com/Qihoo360/At…

github上最后维护时间为4年前

  • 优点
  1. 实现了读写分离(并通过hint/master/可强制⾛主库,并且加⼊了权重配置可进⾏读的负载均衡
  2. ⾃⾝维护了⼀套连接池,减少了创建连接带来的性能消耗
  3. ⽀持DB动态上下线,⽅便横向扩展
  4. ⽀持ip过滤,实现了简单的权限控制
  5. 可记录所有sql,实现了简单的审计功能
  • 缺点
  1. 使⽤atlas⽐直连DB,性能损耗⼤概是30%-35%左右
  2. 使⽤atlas⽐直连DB,响应时间⼤概是直连DB的1.5~2倍
  3. 对分表的⽀持不是太好,不支持不同库间分表
  4. atlas配置暂时不⽀持配置参数的动态加载,如果修改了配置需要重启atlas,这可能会对业务有⼀点的影响(不过⼀般可以做ha或者业务低峰进⾏重启,这个问题不是特别迫切)总的来说作为⼀款开源mysql proxy,atlas总体表现还是不错的,持续压测3天都⽐较稳定,只是对分表的⽀持不是太好(⽐如不⽀持基于时间的分表模式),⼀般没有太⾼并发和对响应时间严格要求的业务可以考虑尝试使⽤

5.2. Cobar

阿里

关键词:分库分表 Cobar

百度为您找到相关结果约936,000个

中间层代理类中间件

github.com/alibaba/cob…

github上最后维护时间为3年前

槽点貌似很多,讲不完哈哈

www.modb.pro/db/175242

5.3. TDDL

阿里 关键词:分库分表 TDDL 百度为您找到相关结果约1,080,000个 应用层依赖类中间件

github.com/alibaba/tb_…

github上TDDL处于停滞状态,应该是部分功能不开源了吧。

TDDL 必须要依赖 diamond 配置中心( diamond 是淘宝内部使用的一个管理持久配置的系统,目前淘宝内部绝大多数系统的配置)

5.4. heisenberg

百度

关键词:分库分表 heisenberg

百度为您找到相关结果约74,900个

中间层代理类中间件

资料少之又少,不考虑。

5.5. Oceanus

58同城

关键词:分库分表 Oceanus

百度为您找到相关结果约118,000个

github.com/wuba/Oceanu…

github上最后维护时间为3年前

资料较少,不考虑。

5.6. OneProxy

原支付宝首席架构师楼方鑫开发

关键词:分库分表 OneProxy

百度为您找到相关结果约139,000个

应该是不开源的

5.7. vitess

YouTube

关键词:分库分表 vitess

百度为您找到相关结果约177,000个

中间层代理类中间件

github.com/vitessio/vi…

github当前活跃

Vitess是一个用于部署、扩展和管理大型MySQL实例集群的数据库解决方案。是开源的,在github上有很多星星,但是国内的应用较少,资料不多。技术架构复杂,这位更是重量级。

5.8. TSharding

蘑菇街

关键词:分库分表 TSharding

百度为您找到相关结果约100,000个

github.com/baihui212/t…

github上最后维护时间为5年前

应该也是不开源了

资料少之又少,不考虑

5.9. dal

携程

关键词:分库分表 dal

百度为您找到相关结果约315,000个

应用层依赖类中间件

github.com/ctripcorp/d…

github当前活跃,提供部分教程及demo(需要科学上网)

开源范围包括代码生成器,Java客户端和C#客户端。

国内资料少,需要科学上网。

5.10. zdal

支付宝

关键词:分库分表 zdal

百度为您找到相关结果约30,600个

中间层代理类中间件

国内资料少,应该不开源。

5.11.MyCat

基于cobar社区开源

关键词:分库分表 MyCat

百度为您找到相关结果约9,030,000个

中间层代理类中间件

mycatone.top/

社区当前活跃,无需科学上网

资料很多也开源,可以考虑。

5.11.1不支持项

  • DDL语句
  • 不支持修改拆分键
  • 支持物理库的视图视为普通表来使用
  • 仅普通表支持外键
  • DML语句
  • DELETE语句
  • 不支持涉及分布式运算的子查询。
  • 不支持多表delete。
  • UPDATE语句
  • 不支持涉及分布式运算的子查询。
  • 不支持多表update。
  • SELECT语句
  • 对于for update语句会把sql中出现的表都加锁。
  • 具体是行锁还是表锁要看sql语句。
  • 不支持SELECT INTO OUTFILE。
  • SET语句
  • 支持SET SESSION级别的变量,但是不能被预处理语句引用变量,只有autocommit变量具有正确语义
  • 不支持SET GLOBAL级别的变量
  • 不支持SET USER级别的变量
  • SHOW语句
  • 所有SHOW语句都视为兼容性SQL进行处理,发往prototype节点处理,所以不具备分布式语义高级功能
  • 不支持用户自定义数据类型(改代码), 自定义函数(改代码)
  • 支持物理视图,但是不支持Mycat中的逻辑视图
  • 有限支持存储过程
  • 不支持游标
  • 不支持触发器

5.12.Sharding-jdbc

当当开源,已加入apache豪华套餐

关键词:分库分表 Sharding-jdbc

百度为您找到相关结果约4,240,000个

应用层依赖类中间件

shardingsphere.apache.org/

社区当前活跃,无需科学上网

资料很多也开源,可以考虑。

更多参考之前写的:分库分表 Sharding-JDBC

5.12.1不支持项

  • DataSource 接口
  • 不支持 timeout 相关操作。
  • Connection 接口
  • 不支持存储过程,函数,游标的操作;
  • 不支持执行 native SQL;
  • 不支持 savepoint 相关操作;
  • 不支持 Schema/Catalog 的操作;
  • 不支持自定义类型映射。
  • Statement 和 PreparedStatement 接口
  • 不支持返回多结果集的语句(即存储过程,非 SELECT 多条数据);
  • 不支持国际化字符的操作。
  • ResultSet 接口
  • 不支持对于结果集指针位置判断;
  • 不支持通过非 next 方法改变结果指针位置;
  • 不支持修改结果集内容;
  • 不支持获取国际化字符;
  • 不支持获取 Array。
  • JDBC 4.1
  • 不支持 JDBC 4.1 接口新功能。

六、详细比较

主要指标 Sharding-jdbc Mycat
ORM支持 适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC 任意
事务 自带XA、两(三)阶段事务、柔性事务BASE(最终一致) XA事务
分库 支持 支持
分表 支持 支持
开发 集成springboot较好,代码入侵中(需要写些配置类等) 开发成本小,代码入侵小
所属公司 当当网开源,加入apache 基于阿里Cobar二次开发,社区维护
数据库支持 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使用 JDBC 访问的数据库 Mysql、Oracle、 SQL Server、DB2、mongodb
活跃度 活跃度高 社区活跃度很高,一些公司已在使用
监控
读写分离 支持 支持
资料 资料少、github、官网、网上讨论贴 资料多,github、官网、Q群、书籍
运维 维护成本低 维护成本高
限制 部分JDBC方法不支持、SQL语句限制 SQL语句限制
连接池 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等 无要求
配置难度 一般 复杂

总结

挑选了两个使用最多的进行了比较,综合来看的话感觉还是Sharding-jdbc更省事一些,无需部署中间件,只通过引入jar包进行分库分表操作,省去一些事情。而且多一个中间件的话系统稳定性也会降低了。对与目前来说,只需要轻量级的分库分表,功能不需要太多,所以还是选择Sharding-jdbc合适些。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
15天前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
34 9
|
1月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
86 9
|
2月前
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
61 22
|
2月前
|
Java 关系型数据库 MySQL
MySQL 分库分表方案
本文总结了数据库分库分表的相关概念和实践,针对单张表数据量过大及增长迅速的问题,介绍了垂直和水平切分的方式及其适用场景。文章分析了分库分表后可能面临的事务支持、多库结果集合并、跨库join等问题,并列举了几种常见的开源分库分表中间件。最后强调了不建议水平分库分表的原因,帮助读者在规划时规避潜在问题。
281 20
|
2月前
|
关系型数据库 MySQL 中间件
MySQL 中如何实现分库分表?常见的分库分表策略有哪些?
在MySQL中,分库分表(Sharding)通过将数据分散到多个数据库或表中,以应对大量数据带来的性能和扩展性问题。常见策略包括:哈希分片(分布均匀,查询效率高)、范围分片(适合范围查询)、列表分片(适用于特定值查询)、复合分片(灵活性高)和动态分片(灵活应对负载变化)。每种策略各有优劣,需根据业务需求选择。常用工具如MyCAT、ShardingSphere和TDDL可简化实现过程。
|
21天前
|
SQL 关系型数据库 数据库
【YashanDB 知识库】OM 仲裁节点故障后手工切换方案和 yasom 仲裁重新部署后重新纳管数据库集群方案
本文介绍了一主一备数据库集群的部署步骤。首先在OM节点上传并解压软件包至指定路径,随后通过调整安装参数、执行安装和集群部署完成数据库设置。接着,在主备节点分别配置环境变量,并查看数据库状态以确认安装成功。最后,针对OM仲裁故障提供了手动切换方案,包括构造故障场景、关闭自动切换开关及使用SQL命令进行主备切换,确保系统高可用性。
|
3月前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
2月前
|
存储 缓存 NoSQL
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
|
3月前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。