为什么要分库分表?
随着业务量不断上涨,数据量和请求量会变的越来越大,凭借单个数据库和单个表扛不住暴增的数据量和请求量。
分表
以mysql为例,一旦数据量达到千万级别,就会极大影响你的 sql的性能,无论是新增还是查询数据都会变的很慢。一般来说,一旦单表数据量到六、七百万的时候,就需要开始考虑分表了。
分表可以以月份为纬度,每月数据分表。也可以以用户纬度分表,对于用户id取模或hash等方式分表,也可以根据地区为纬度分表。
分库
每个数据库的连接数是有限的,最多支撑到并发 2000(最好保持在1000 一下)。可以将一个库的数据拆分到多个库中,分散请求量。
如何分库分表?
Sharding-jdbc
当当开源的,属于 client 层方案,支持分库分表、读写分离、分布式 id 生成(支持snowflake)、柔性事务(最大努力送达型事务、TCC 事务)。不用部署,运维成本低,不需要代理层的二次转发请求,性能很高,但是如果遇到升级啥的需要各个系统都重新升级版本再发布,各个系统都需要耦合 Sharding-jdbc 的依赖。
Mycat
基于 Cobar 改造的,属于 proxy 层方案,支持的功能非常完善,而且目前应该是非常火的而且不断流行的数据库中间件,社区很活跃,也有一些公司开始在用了。不需要部署,自己运维一套中间件,运维成本高,但是对于各个项目是透明的,如果遇到升级之类的都是自己中间件那里搞就行了。
如何迁移数据?
1)停服数据迁移,会影响正常业务,不建议
2)数据双写,上线后同时忘两个库写数据,然后将历史数据导入新库,需要修改线上代码,不建议
3)使用阿里canal同步mysql binlog,写入新库,不影响线上逻辑