分库分表
一、为什么要分库分表
单机mysql带来的问题:
1、mysql单机,扛不住并发
2、mysql单机磁盘容量快满
3、mysql单表数据量太大,sql执行越跑越慢
利用分库分表将单机拆分成多机,带来的好处。
1、可承受的并发增加数倍;
2、磁盘容量增加数倍,使用率降低;
3、单表数据量缩小,sql语句执行速度加快。
二、分库分表的中间件
数据库中间件:用来做数据的分发。
有两种:proxy类和client类
cobar、TDDL、sharding-jdbc、atlas、mycat。
cobar :阿里开源,代理中间件,不支持读写分离,存储过程、跨库join和分页等,已经没啥人用了。
TDDL:淘宝,client。不支持join、多表查询,只支持curd,读写分离,用的人不多。
atlas:360开园,proxy。用的人不多。
sharding-jdbc:当当开源 client。sql语法支持的多,支持分库分表、读写分离、分布式id生成等等。大部分公司的选择。不要部署,运维成本低,但是各个系统都要耦合sharding-jdbc依赖。
mycat:proxy方案。势头很猛。
二、垂直拆分和水平拆分
水平拆分:一个表的数据分到多个库的多个表里去,表结构相同,数据不同。
垂直拆分:把一个表的字段拆成多个表。每个库表结构都不一样。
根据主键拆分,根据时间拆分等。
三、单库单表 -> 多库多表 如何迁移?
(1)、长时间停机分库分表
第一步,停掉系统,拒绝访问,如晚上12点到凌晨3点进行维护,无法访问。
第二步,启动后台临时程序,从旧的数据库里读取数据,基于分库分表中间件,将数据分离到其他库表中去。
第三步,修改系统配置,通过数据库中间件,将数据写入到新库中。
缺点:
1、一定会停机几个小时。
2、时间很赶,如果失败,回滚代码。
(2)、不停机双写方案
第一步,修改系统中写库代码,同时写入到老库和新的分库分表。
第二步,编写一个后台迁移工具,从老的库里读数据,写入到新库中去
第三步,迁移完成之后,去比较一下新旧库表的数据,如果一模一样,则迁移完成,否则继续执行迁移。
第四步,新旧库表数据无差异之后,将代码中写入旧的数据库代码删掉,只写新库。