背景

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

数据库示意图

php实现mysql数据迁移手把手教你若何一直机将海量数据从DB2全量数据迁徙到MySQL Vue.js

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

此外,作为范例的收费数据库,DB2 的利用本钱和掩护本钱,随着数据量的增加,也是十分高昂的。

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

利用 MySQL 数据库更换 DB2数据库横向扩展

该系统作为核心的原子做事系统,是要做到 724 小时无间断运行的,因此我们要做到一直机的迁移和扩展。
这是数据迁移的条件条件。

常规双库方案

要利用 MySQL 数据库更换 DB2,且做事不中断,则需担保业务系统一段韶光内,同时支持新、老数据库操作。

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

代码实现双库切换

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

苏宁双库方案

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

MyCat 路由

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

路由方案实现

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

schema.xml: 包括逻辑表与物理表映射关系;数据库信息;通过一个大节点下包含多个虚拟节点办法,将 DB2 库和 MySQL 库的表整合在一起;rule.xml: 逻辑表映射到物理表的规则文件。
这里根据我们业务的分库分表规则,定制开拓了路由规则类;partition.txt: 路由规则,配置符合条件的 SQL 路由到 schema 中的哪个虚拟节点;server.xml: MyCat 做事的端口、账号等信息配置;此配置为系统级配置,与业务无关。

MyCat 解析 SQL 的示意图:

MyCat 解析 SQL 简图

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

数据迁移常规方法

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

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

数据迁移常规方案

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

苏宁数据迁移方法

终极数据迁移办理方案是通过 CDC+RDRS+MyCat 协同办法实现。

关于 CDC 和 RDRS 工具的大略解释:CDC,是 IBM 公司供应的付费工具,可以 1 比 1 实现 DB2 数据库数据到 MySQL 数据库的数据迁移。

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

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

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

苏宁 CDC+RDRS+MyCat 数据迁移方法

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

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

同步效率如何如何比对同步结果

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

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

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

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

终极系统现状

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

系统关系图

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

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

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

小结

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

数据迁移问题:CDC+RDRS 办理N:M 数据规整:RDRS+MyCat+MyCat 实现流量分阶段切换处理:MyCat 配置实现

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

这样,我们办理问题的思路也就清晰了:将一个繁芜目标拆解成多个大略问题,再逐个办理大略问题,终极实现繁芜目标。

作者:毛小勇

简介:2009 年毕业于安徽大学打算机科技专业,苏宁易购中台研发中央高等技能经理,紧张卖力平台库存、开拓管理事情,经历和见证了苏宁易购电商平台的演进进程,对电商中后台业务逻辑有较深入的理解。
对系统大数据、高并发、低延时等的办理方案有较丰富的履历。

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