背景
随着业务发展单库单表也越来越不能满足业务了,那么分库分表就势在必行了。
方案
hash取模方案
通过hash取模数据可以均分的分散到4张表中,不会出现热点问题,但是如果后面业务量增加4张表也不能满足业务了,需要额外拓展4张表,那么问题就来了,hash取模数就变成8,之前的历史数据就不能通过这个算法了,那么这个时候就需要进行数据迁移了,数据迁移带来的工作量使我们不想看到的。
range范围方案
range方案就是根据id返回,把数据放到对应的表中,因为id都是递增的那么新数据都会集中到一张表中,这样就会带来热点问题,单表的压力过大
group分组方案
1、首先id根据取值范围找到属于哪一个分组
2、找到分组之后,id通过跟表数量进行取模运算,定位到了对应的表
这种方案的好处就是可以进行横向扩展而不用进行数据迁移,也避免了热点问题,如果业务量继续增加需要额外增加4张表,那么我们只需要重新增加一个分组,维护好分组跟路由信息就可以了。
分库分表改造数据动态迁移
分库分表肯定要涉及数据迁移,数据迁移必定涉及一个全量和增量的数据,全量数据迁移可以借助数据迁移工具基于分库分表的路由规则进行迁移,在迁移之前做好数据备份
动态读写切换改造
由于是动态迁移,不停服迁移,肯定不能通过发布程序来切换数据源,所以,在程序层面进行改造,进行动态读写切换改造。
大致的思路:在程序里面手动去指定双数据源,预先在程序里面应该加载两个db的数据源,通过配置预先设定开关,然后动态进行读写切换。
为了实现可监控、可灰度、可回滚,还需要进行灰度。从配置的维度来说,不仅仅是 切换的开关需要配置化,而且 需要保证灰度过程中切换比例,可以通过配置进行调控