一种不停机的亿级数据迁徙方案

需求背景

数据是一个互联网公司最大的财富,大部分公司一开始使用oracle或者sqlserver等商业数据库来存储数据,随着公司业务的发展,数据量越来越大,数据增长速度越来越快。传统oracle和sqlserver不仅成本高昂,而且不易于横向扩展,无法满足大数据量的存储和读写。

这时公司会倾向于选择免费的mysql数据库,免费并且稳定。可以很方便的进行分库分表以处理大规模数据。如何把原有的千万级甚至亿级,有价值的oracle或者sqlserver数据库中的数据迁徙到mysql中,是必须要面对的问题。在迁徙的过程中,不能影响线上客户;数据一定要正确,不能接受任何数据异常。

传统技术的技术方案

传统方案一般由DBA来做,DBA先停止数据库的使用,然后书写迁徙脚本把数据导出到一个中间文件。然后再书写导入脚本,导入目标库。

传统方案的缺点

  • 数据库会停止服务几小时甚至几天,应用程序无法使用,在一些行业应用中基本不可接受。

  • 不能满足异构数据的迁徙,如果oralce或sqlservcer和mysql的数据结构不一样,有着比较复杂的映射关系,需要做数据转换,不能满足迁徙。

本技术方案的详细阐述

1 本方案所要解决的技术问题(目的)

本方案规范化了迁徙的整个流程,流程的每一步都可验证,可回滚,有效保护了公司重要数据资产在迁徙中绝对不丢失,并且支持数据异构的迁徙。

2 本方案提供的完整技术方案

本方案的迁徙流程,以sqlserver数据迁徙到mysql做为示例说明

1)统一接管所有数据的读的写,为切读或者写做好准备。

2)数据写中间件开启数据变更日志记录功能,sqlserver库数据变更时,记录变更数据到变更表中。

3)制作sqlserver离线库,使用全量迁徙程序把sqlserver数据迁徙到mysql库中。

4)使用全量检验程序检验全量迁徙的正确性。如果有问题,可回滚到第1步重做。

5)使用增量迁徙程序开始迁徙增量数据。

6)开启增量检验程序来检验增量迁徙数据,如果有问题可回滚到第5步或第1步。

7)开启监控报警程序来实时监控增量的迁徙情况。

8)把线上读流量按比例切到mysql库,利用读流量来验证mysql数据是否正常。如果有问题,可回滚至读sqlserver库。

9)选一个增量数据比较少的时间点,切写数据到mysql,完成迁徙。切写流量的时候,在mysql中记录增量数据变化。并同时开启回写程序,把mysql中的数据回写到sqlserver中。如果第8步有问题,可以通过回滚到写sqlserver库。

附图:

数据迁徙流程.png

本方案包括如下几个模块和服务:

1、全量迁徙检验模块。负责把源数据库中的数据全部迁徙到目标数据库,以及检验源数据库中的数据和目标数据库是否一致。本模块程序自主开发,使用离线库进行迁徙避免影响线上应用。注:需要满足幂等性(insertOrUpdate),可以重复执行迁徙过程。

2、增量数据迁徙检验模块。负责读取源数据库中的增量数据,并把增量数据迁徙到目标数据库中;以及检验源数据库中的增量数据是否和目标数据库一致。本模块程序自主开发,通过迁徙后,检验程序做字段级验证保证数据正确。注:需要满足幂等性(insertOrUpdate),可以重复执行迁徙过程。

参考实现方式:通过接收数据库binlog(可使用canal框架),把变更数据同步到新库,推荐只接收变化的ID,再反查数据写入,防止接收消息延迟。

3、回写数据迁徙检验模块。负责把目标数据库中变化的数据同步到源数据库,并检验两边数据是否一致,达到完成切换后,如果发现问题可回滚的目的。本模块程序自主开发,和增量程序一样是做字段级检验。

4、监控模块。

监控增量数据迁徙,以及回写迁徙中数据的处理情况,如果发现在数据异常,进行短信和邮件报警关系人,进行处理。本模块程序自主开发,保证有异常数据出现的时候,可以及时得到通知并加以处理。

实现方式:对比过程中需要记录迁徙任务状态,找出不断对比反复出现差异的数据;如果对比有差异,重复对比无差异,有可能是从库数据延迟等原因造成。

附:增量及检验程序的状态转换图

状态转化流程图.png

性能调优

迁徙的性能瓶颈,根据木桶原理,迁徙的应用服务器可以水平扩展,最终的瓶颈一定是双方的数据库。程序的优化的目的就是把应用迁徙服务器做到通过多线程扩展迁徙能力。下图是通过获取迁徙范围和实际迁徙两个线程池调优来优化的,把获取要迁徙的数据和处理迁徙通过两个线程池处理,通过队列来形成生产消费者模式,生产者如果太快,超出队列长度,会阻塞等待处理。

附:效率调优的线程协作图

迁徙线程协作方式.png

实际使用中根据情况,可以统一使用一个线程池来分配,也可以达到相同的扩展能力。更简化的线程模型如下,比如我们要迁徙一个亿的数据,那么我们可以出动10个线程,每个线程处理1千万数据就可以。在能满足需求的前提下,尽可能使用简单的模型,下面的简化线程模型是更推荐的模型,上面的复杂模型在特定场景会更优。

数据迁徙线程简化.png

1)本技术方案带来的有益效果

本发明提供的方案,能够为企业数据迁徙提供标准化方案,可做到无风险,不影响线上,并且不影响客户体验。

2)本方案的关键点

本发明中迁徙标准化流程为本方案的重点,现提供了数据迁徙流程的一个标准化实现方案,具体的数据迁徙需求可以在此基础上适当调整。

常见问题FAQ

1)使用从库对比差异误报怎么解决?

可以间隔一段时间连续跟进几次或延时对比.

2)切写需要回滚方案吗?

如果要满足切写可回滚,需要加入过程6回写数据到老库,并且要想办法保证回写的正确,成本会比较高,根据实际情况决定是否要回写。

3)有哪些简化方案

比如使用业务双写代替增量迁徙过程;如果数据很少,全量迁徙速度很快,可以省去增量迁徙程序,只保留全量迁徙程序。