数据库分库分表

当访问量越来越大,mysql的访问压力也随之增大,当mysql的访问量超过1000QPS的时候还没什么问题,当超过2000QPS的时候或者当数据表条目超过500万条(全是数据类型的表单最好不要超过800万条记录, 有字符型的单表最好不要超过500万记录)的时候也就要分库分表了,合理的分库分表可以减少数据库的压力,提高吞吐量,减少响应时间。

1、分库分表方式

proxy层:独立部署的中间件,通过中间件确定请求到那个数据库那个表
client层:在客户端就确定请求到那个数据库那个表

2、代表的分库分表框架

Sharding-Sphere(前身是sharding-jdbc):目前比较火热的框架,为关系型数据库中间件,由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款相互独立的产品组成,它们都提供了标准化的数据分片、读写分离、柔性事务和数据治理功能
TDDL:proxy层,淘宝开发的,支持带权重的读写分离,支持主从模式
Mycat:proxy层,支持事务、ACID、可以替代Mysql的加强版数据库,可以视为“Mysql”集群的企业级数据库。

3、分库分表后的ID主键方案

(1)、利用UUID作为主键,本地生成,没有网络消耗,但是UUID使用字符串存储而且是无序的占用存储空间较大、影响查询性能,并且不利于索引
(2)、利用时间戳
(3)、利用Redis的单线程的天生保证原子性,用redis生成id
(4)、雪花算法(SnowFlake):SnowFlake生成ID能够按照时间有序生成的,生成id的结果是一个64bit大小的整数,为一个Long型,而且生成id不重复,利于存储利于查询
数据库分库分表

4、数据库迁移方案

由于业务扩展,单库单表的数据库需要迁移到分库分表的数据库,那么就要利用到以下方案。
1)、停机迁移
(1)、准备好分库分表后的数据库
(2)、 准备好迁移代码
(3)、首先发布告示系统停止开始维护
(4)、利用写好的数据库迁移代码将老的单库单表的数据迁移到新的分库分表的数据库中
(5)、 启用新的系统(支持新的数据库)连接到新的数据库表
数据库分库分表

2)、不停机迁移
(1)、先不停机,修改系统代码同时支持新老数据库,向老数据库写的数据同时也写入新数据库,并对写到型数据库的数据做好标记
(2)、编写迁移代码,迁移数据库
(3)、反复轮询检查新老数据库是否一致
(4)、修改系统代码删除对老数据库的支持,完全支持新数据库库
数据库分库分表