生产中如何将单表数据迁移到分库分表中

1,389 阅读3分钟

1:项目背景

“ 本文正在参加「金石计划」 ”,在新的项目中,有一个上传数据的功能,数据都是Excel格式的,前期的业务比较少,所以单表存储这些数据并没有什么压力,后面发现有些Excel都是几万,几万的数据,导致二个多月以后,数据已经到达了500多万了,项目才上线半年不到,主要这些数据还是提供了查询功能,如果继续使用单表,那么总有一天会因为数据量太大导致查询效率低下,所以这时候想到了分表处理。

2:单表到多表的演变

经过评审,我们最终决定使用Sharding-jdbc来实现分表。但是这时候就遇到一个问题,如何将老数据迁移到新的表中。一般来说会有二种方案

停服处理

也就是将告诉客户,系统正在升级,让客户过段时间再访问,然后我们在进行数据的迁移,这种方案会简单很多,缺点就是系统有一段时间无法使用

不停服处理

在数据迁移过程中,用户是无感知的,我们在进行数据迁移的过程中,系统可以正常访问,缺点就是方案更加复杂

经过商讨,我们最终选用停服处理

3:迁移方案

整体的实现流程如下

捕获.PNG

4:迁移过程中需要考虑的问题

1:数据是一次性导入还是批量

我们的数据是一次性将全部数据迁移还是分批次迁移。我建议是使用分批次迁移,一次性迁移数据量太大,可能内存不足。

2:某个批次导入失败,怎么知道是哪个批次的数据导入失败了

既然我们是使用分批次导入,那么其中有一个批次的数据导入失败了怎么办,我们又是怎么知道那个批次导入失败了。所以这时候我们会有一张迁移记录表,改表记录了迁移的批次,数据的范围,同步状态等一些信息,后续可以查看这张表,如果有某个批次数据迁移失败,只需再次同步这一次批次的数据即可,这也是为什么我们要使用分批次导入数据的原因,如果你是一次性迁移全部数据,那么如果中途失败了,那么又要重新迁移,浪费资源又浪费时间

3:批量多次导入,如果中途某一个批次导入失败,怎么办

如果某个批次导入失败了,那么我们就重新导入就行了。

4:导入失败之后重新导入,有重复数据怎么办

某个批次导入失败,我们就会重新导入,这个时候新表中可能已经存在这条数据了,所以我们要做好数据校验,已经有的数据就不需要再次导入了

5:怎么校验数据全部导进去了

这个也是最重要的,我们要检验数据的准确性,是否有多导入的数据,或者少导入了数据

6:验证线上分库分表逻辑

这个就是在将数据从单表迁移到多表之后,我们要验证线上服务是否正常,数据是否正常

5:总结

停服处理相对来说还是会简单些,之所以采用这种方案也是因为简单,只需要在数据迁移完成之后验证数据准确就可以了