互联网发展至今,各个公司企业的数据量都大幅增长,分库分表越来越多的被我们用到,那么我们应该如何针对我们自己的业务场景,对数据进行合理的划分,用最小的代价解决掉性能瓶颈。
1 分库分表的介绍
1.1 什么是分库分表?
分库分表其实是两个词
分库: 将一个库里的数据,分开放在多个库里
分表: 将一张表里的数据,分开放在多张表里
1.2 为什么要分库分表?
至于为什么要分库分表?肯定是单个库或者是单个表不足以满足我们的业务需要,不论是从性能角度出发,还是从数据库存储能力的角度出发,每一种类型的数据库当数据量到达一定程度后,都会出现瓶颈。这时候我们就要通过分库分表,提升数据库的存储能力以及性能。
一般而言,我们数据库出现性能问题,我们都会优先去做数据库的主从复制,读写分离。
主从复制带来的问题:
- 写入无法扩展
- 复制延时
- 锁表率上升
- 表变大,缓存率下降
分库分表同时也是解决主从复制带来的一些问题。
总结一句话,数据库顶不住了!!!
1.3 怎样分库分表?
对于Java项目来讲,分库分表一般分为两个阶段
-
数据库重新设计,合理切分数据
-
引入分库分表的工具,帮助我们做数据库操作
- Sharding-sphere(当当):jar,前身是Sharding-jdbc;
- Cobar(阿里巴巴)
- Mycat(基于Cobar):中间件
2 分库分表的设计
2.1 分库分表的方案
-
只分库
分库能够解决的问题是,数据库读写QPS过高,数据库连接数不足
-
只分表
分表能够解决的问题是,单表数据量过大,查询、存储性能遇到瓶颈
-
即分库又分表
解决上述两种问题
我们应该更据自己系统遇到的问题,灵活的选择分库分表的方案,如果没有性能问题,切记过度设计。
2.2 分库方案
分库主要能够解决读写QPS过高,以及数据库连接不足的问题,我们就从这一点下手。
先分析我们平时业务的QPS峰值,再考虑当大促,或者活动,这种流量暴增情况的峰值,这样的话分库就变成了一道简单的除法题
公式:流量峰值/单个库的承载力=分库的数量。
微服务场景会按照服务拆分,进行数据库的拆分。
2.3 分表方案
分表相对于分库来说更为麻烦,也更为常用。因为一些大数据量的表常常出现,致使数据库的性能瓶颈频繁出现。
分表一般都会进行数据量的增长做出预估。然后根据系统的使用年限,单表数据量做出预估分多少张表。
预估数据时,我们要适当扩大留有足够的空间。