mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(1)

背景

苏宁易购某原子服务系统,因历史原因,使用的是 DB2 数据库。当时的设计:业务表分 2 个库、100 分表模式。如图:

mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(2)

数据库示意图

随着业务的发展,该系统数据量由百万级到千万级,再到亿级别,单个分表的数据量已经达到百万级。这样的数据库分表策略已经难以满足业务发展的需求。

此外,作为典型的收费数据库,DB2 的使用成本和维护成本,随着数据量的增加,也是十分高昂的。

对此,系统面临两个紧迫的诉求:

该系统作为核心的原子服务系统,是要做到 7*24 小时无间断运行的,因此我们要做到不停机的迁移和扩展。这是数据迁移的前提条件。

常规双库方案

要使用 MySQL 数据库替换 DB2,且服务不中断,则需保证业务系统一段时间内,同时支持新、老数据库操作。

最简单的做法是同时配置两种数据库连接,业务代码判断、控制走 DB2 还是 MySQL 库。我们可以在代码中增加路由模块,根据路由关键字判断使用 DB2 数据库的连接,还是使用 MySQL 数据库连接。如图示:

mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(3)

代码实现双库切换

这种方法实现简单,但是代码耦合度太高,业务代码包含了很多与业务无关的内容,当迁移完成后,还要清理无关功能代码,有一定风险。

苏宁双库方案

另外一种思路,就是把路由功能抽取出来,让某个单独的组件去做。这里使用的中间件是 MyCat。如图:

mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(4)

MyCat 路由

这样,极大的减少了业务侵入性。我们这里使用的 MyCat,是我司中间件开发小组,根据业务需求,在开源 MyCat 基础上做了定制开发(例如具体的分库分表算法实现等)。路由规则通过配置文件 SQL 解析实现。

路由方案实现

我们先了解下 MyCat 几个核心的配置文件:

MyCat 解析 SQL 的示意图:

mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(5)

MyCat 解析 SQL 简图

由图可见,路由是通过配置文件控制的。当 DB2 和 MySQL 并存时,可以通过调整配置文件的方式,实现单个商品、批量商品(例如取余或者固定尾号等)的路由规则动态切换到 MySQL。

数据迁移常规方法

双库路由方案确定好后,第二个要解决的问题是 DB2 数据库数据迁移到 MySQL 库。

常规数据割接,可以通过将数据导出再导入的方式实现。如图:

mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(6)

数据迁移常规方案

此方案是数据割接的常规方案,适用数据量较小,且一比一的数据迁移。但是需要业务停机、数据静默一段时间,而且作为数据量 10 亿级的在线系统。这两点对于我们这个大数据量核心系统来说,都是不可接受的。

苏宁数据迁移方法

最终数据迁移解决方案是通过 CDC RDRS MyCat 协同方式实现。

关于 CDC 和 RDRS 工具的简单说明:CDC,是 IBM 公司提供的付费工具,可以 1 比 1 实现 DB2 数据库数据到 MySQL 数据库的数据迁移。

RDRS,是我司开发的一款,支持实时数据订阅及数据实时复制等,多种数据传输能力的工具。

MyCat,在 RDRS 做数据传输的过程中,实现数据重新路由到指定分库、分表的功能。

总体数据迁移示意图如下:

mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(7)

苏宁 CDC RDRS MyCat 数据迁移方法

注:1) 这里的 MyCat 是将中间库数据规整、分发到目标库上的,与上面提及的业务使用的 MyCat 用途不一样。2) DB2 的数据变化会同步到 MySQL,MySQL 数据变化不会同步到 DB2(避免数据回路问题)。

在这个阶段,我们关注的两个问题:

关于效率问题,一方面通过精简数据同步规模方式,只同步必要的业务数据;另一方面,多开几个并发任务的方式,提高效率。

具体的实现方案包括:取消日志表、归档表数据的迁移;在不影响业务库磁盘 IO 和网络带宽的情况下,适当提升并发任务数。

为了进一步降低数据同步对业务的影响,也可考虑在夜间业务量较小的时段进行,若一个晚上时间不够,还可以将任务拆成多段,分多个晚上执行。

数据对比的问题,一方面 CDC 和 RDRS 各自保证自己关联的两端数据准确性(即,DB2 到中间库的对比,以及中间库到目标 MySQL 的对比),另一方面,我们通过我司大数据平台,写 Spark 程序实现两边业务数据库数据的比对。

最终系统现状

经过各个部门协同奋战,我们于 5 月份上线。上线后的系统关系图如下:

mysql表数据如何迁移(手把手教你如何不停机将海量数据从DB2全量数据迁移到MySQL)(8)

系统关系图

刚上线时,所有流量在 DB2 侧,确认系统稳定、业务正常后,开始数据复制迁移工作。我们花了 3 个晚上,将 DB2 全量数据迁移到 MySQL,之后增量任务持续进行。

数据迁移之后,经过一段时间的对比工作,确认迁移无误。接下来通过 MyCat 路由切换配置文件,逐步将业务流量切到 MySQL 端。

最终,经过半个月的切换,所有流量均已切到 MySQL,DB2 数据库顺利下线,退出历史舞台。

小结

回顾这次数据迁移规整,解决的核心问题可以拆解为:

可见,MyCat 适用数据规整,及多数据库平滑过渡的场景。CDC 适用 DB2 数据到其他数据库 1:1 迁移的场景。RDRS MyCat 可实现 MySQL 数据库间的 N:M 迁移。

这样,我们解决问题的思路也就清晰了:将一个复杂目标拆解成多个简单问题,再逐个解决简单问题,最终实现复杂目标。

作者:毛小勇

简介:2009 年毕业于安徽大学计算机科技专业,苏宁易购中台研发中心高级技术经理,主要负责平台库存、开发管理工作,经历和见证了苏宁易购电商平台的演进历程,对电商中后台业务逻辑有较深入的理解。对系统大数据、高并发、低延时等的解决方案有较丰富的经验。

【51CTO原创稿件,合作站点转载请注明原文作者和出处为51CTO.com】

,