请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

分库分表

通常来讲我们在对数据库进行分库分表时,可以根据数值型的不重复ID进行HASH取模定位到不同的库和不同的表,也可以根据时间字段按照时间范围来进行。
当使用时间来分库分表时,好处是,可以不停机进行数据扩容,坏处在于可能导致某个时间的数据特别多,某些时间的数据少,也就是分布不够均匀。
使用ID来进行分库分表,可以做到尽可能均匀,但是如果涉及到我需要增加库和表,就会涉及到要对数据全部rehash操作,这很有可能需要停机来进行数据迁移,这显然坏处也是足够明显。
我的问题是,在使用类似ID来进行分库分表,怎么样可以做到不停机的数据迁移?或者说有什么好的方式动态扩容?

正在回答

1回答

七十亿兄你好:

    你这里所说的关于分库分表的两个点特别好(分库分表是根据业务数据场景来分的,不是按照理论划分的,一定要搞清楚自己的数据怎样分才是合适的):

    1. 按照时间来划分(也就是针对于表来做水平分割),但是,如果单位时间内的数据并不均匀,这样分出来的表也会不均匀,解决不了热点数据的问题

    2. 使用 id 分库分表是大多数业务场景都会采取的方案,但是,通常不会按照 id,而是类似于 user_id 这样的字段去做 hash 分库分表


    其实,不论怎样分库分表,只要你想做到不停机的数据迁移,那么,最好也是最常见的办法就是“数据双写”,所谓双写,就是两套 MySQL 系统,一套是原来的单库单表,一套是分好的多库多表:

    1. 业务代码需要做修改,新的数据同时写入两套 MySQL 系统中,但是,业务读数据还是从老的单库单表去读

    2. 老库的“旧数据”在新库里面是没有的,需要有一个定时的导出机制,从老库里面读出数据,往新库里面去灌,直到两个库的数据完全一致

    3. 再次修改业务代码,从新库里面读数据,但是,写数据仍然往两套 MySQL 里面去写。此时,注意,由于切换了读库,需要你有监控的任务,验证系统没有出现问题

    4. 保持系统运行和监控,等到业务系统稳定了之后,就可以下掉原来的老库,以此就完成了不间断的数据迁移工作了


    数据双写的思路听起来很麻烦,但是,实现起来还是没有很大难度的,我个人完成过两次这样的工作,总的来说,问题不大。


    我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!

4 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信