一张表100w,按ID(分库字段)除以10取摸,分到10个库。1号库id最后位总是1,2号库id最后位是2,以此类推。不同的表尽量创建到不同的机器上,别10张表都在一个机器上,甚至一个数据库上,这样意义不大,实际操作时,可以分到5台服务器上,每台机器2个库,不同数据库上,表的结构是一样的。Mycat可以连oracle或者mysql。只把个人大数据量表拆分。
比如把百万规模的order表分到10个库上,分库字段是id。在schema,xml中配置10个数据库地址。在rule.xml里定义待分库的表order,分库字段id和分库算法,比如根据取模10,再对应到具体的表上。
在mybatis中,连接到mycat,把sql语句传给mycat,由于mycat路由到对应的数据库上,也就是说,分库分表对业务层是透明的。
再进一步,在rule.xml里定义多个分库字段,比如同时按id,流水号等分库,但是针对不同分库字段,应能对应到同一个库。
实现分库分表前,排查改写sql:
尽可能去掉group by,连接等全表操作的语句,遇到此类语句,或者改写,或者放到业务层实现。尽可能去掉事务,尤其去掉分布式事务。
排查所有的select, insert, delete和update语句里的where子句,看里面的字段,尽可能全加入分库字段。比如有根据客户编号查,可以也加入分库字段。
在测试环境里充分测试,并充分用jmeter和zabbix压测。找个访问量少的时候上线,比如10月1日凌晨,发上线公告。上线前,比如9月30号,把之前所有全局数据,拆分到分库上。上线代码,上线阶段,同时操作原来的数据表和分表,上代码时,或许有业务数据丢失,如果不重要不用管,重要数据根据日志恢复。做好上线测试和回退预案,比如该跑哪些案例确认上线成功,如果要回退,该如何回退代码和配置文件。
问题:
数据量,并发量,确认是否需要分库。
问分库规则,确认你是否真的用过,你可以结合业务讲,但不用讲用什么xml属性分库,就讲根据id,流水号除以10取模分库。
遇到group by等需要全表执行的sql怎么办?要么改写,要么再放个全局表,对分库的操作用kafka等队列同步到全局表上。
引入mycat后,如果出现全表查,或者无法根据查询条件定位到具体表,会出错。
如果依然需要全表查,那就建个全局库。
10个分库,外带一个全局库,如果没分库字段,就到全局表差。
把任何10个分库的增删改查操作写入队列,异步修改全局表。全局表里的所有数据都略微有数据延迟,要充分考虑,但是大多数场景影响不大。
依然需要尽可能保证大多数操作是针对分库的。假设有10个表,但是就这4个数据量大,就对这4个分库分表。重新考虑分库表的索引,尤其是复合索引。
总结:展示mycat分库分表
1.先讲场景,大数据量,大并发量,且穷尽了单机版的优化手段。
2.讲述基本情况:比如针对订单流水表,客户访问记录等分了10个库,分库字段是id和流水号。
3.大致实现方式,在schema.xml里定义分库分表地址,在rule,xml中定义分库规则。
4.分库前需要重构sql语句和索引,必要时加入全局表。
5.最后将测试和上线实时要点,比如压测,数据迁移流程,上线检查点和回退预案。