阿里云数据库迁移神器DTS

阿里云数据传输服务DTS最初诞生于阿里巴巴内部,说一次因为杭州连续高温,为了保障居民用电阿里巴巴的机房也要限电,为了保证支付宝等业务的正常运行机房被迫开启了柴油发电机,但柴油发电机并不适合长时间工作,一旦出现故障可能就要影响一部分支付宝用户的交易。

其实在此之前,阿里巴巴就已经开始考虑将服务运行在其他地方,这样即使杭州出现所有机房全部断电的情况,阿里也依旧能够为全球的用户提供服务,阿里开始了异地多活架构的研发,数据传输服务DTS作为其中重要的服务组件被研发出来。
数据传输服务DTS(Data Transmission Service)支持以数据库为核心的结构化存储产品之间的数据传输,它是一种集数据迁移、数据订阅及实时同步于一体的数据传输服务。

我们知道,阿里巴巴最初开放DTS的目的是要实现异地多活,异地多活架构是这个样子的:

业务会被按照某个维度切分到不同的业务单元进行处理,当流量切分到各个单元后,各个单元的数据层均会有数据写入,通过DTS进行数据层的双向同步,实现数据全局一致。当某个业务单元出现故障时,可以修改流量切分规则将流量切换到其他单元继续提供处理服务,因为可以让分布在异地的多个业务单元同时对外提供服务并实现故障切换,所以这种高可用架构也被称为异地多活。
双向同步都可以,单向的数据同步自然就没有任何问题了,阿里云DTS支持以下数据库之间的数据同步:

可以看到除了阿里云RDS MySQL(特指由阿里托管运维的MySQL服务)之外,其他数据库之间只能进行单向同步。这是只有RDS MySQL到RDS MySQL的复制对应的是在线系统多活的应用场景,而其他场景对应的都是灾备系统或者是分析系统从生产系统的数据复制。
假如,您现在使用的是Oracle数据库,想切换到阿里云的异地多活架构,那么就需要把业务数据从Oracle数据库迁移到RDS MySQL。懂些技术的同学估计要摇头了,因为这种异构数据库迁移是很难实现的。其实这个事情在阿里巴巴看来属于常规操作,还记得当年轰动一时的去IOE运动么?DTS的数据迁移功能不仅支持同构数据库的迁移,还支持异构数据库的迁移。
以下是DTS数据迁移功能的兼容列表:

一般情况下,数据库迁移需要经历三个阶段:

结构迁移、就是把数据库的表结构迁移到目标数据库。

DTS自动的数据类型转换实现多种数据库的异构结构迁移。
以Oracle到MySQL的迁移为例,Oracle的数据类型VARCHAR2自动回应到MySQL的VARCHAR。

全量迁移、将源数据库的当前状态完整的复制到目标数据库,全量复制的时间长短依数据库的大小而定,在进行全量迁移期间源数据库依然可以对外提供服务,目前,全量迁移是免费的。

在全量数据迁移阶段,DTS先将源数据转换为DTS标准格式,再从标准格式写入到目标数据库,学过面向对象编程的都知道,这就是reader/writer抽象接口到不同的对象实现之间的关系。

增量迁移、在启动全量迁移的同时,将开始增量数据的拉取工作,增量数据将被存储,在完成全量迁移后,增量数据将开始回放更新到目标数据库。一段时间之后,增量数据的更新将追平源数据库,此时可以认为源和目标数据库实现了同步,就可以择机进行业务切换,可在一分钟内完成切换。

在增量迁移阶段通过数据库的Log实现增量数据抓取,在写入数据之前先进行过滤、事务冲突处理、同异构类型转换,最后通过并发写入来提高写入性能,减少追平时间。

这三个阶段概括起来所示:

DTS数据迁移功能常见的应用场景包括:

RDS的备份恢复,阿里云RDS建议恢复数据库先恢复到一个临时数据库,在确认数据正确无误后再通过DTS将临时数据库的内容迁移到生产库,在迁移的过程中,临时库已经可以对外提供服务了。

数据库迁移上云、线下IDC运行的数据库可以在尽可能短的停机窗口内切换到云上RDS。

云账号之间的数据库迁移、假如因为各种原因需要将数据库从一个账号迁移到另一个账号,而且想尽可能的缩减停机窗口就可以通过DTS来进行迁移,迁移的过程中业务不受影响,到数据同步状态后就可以选择合适的时机进行切换。

混合云灾备、通过DTS将线下数据库迁移到线上,或者将线上数据库迁移到线下都是可以的,只要不中断迁移过程,两个数据库就可以始终保持同步状态,RPO可以做到1分钟以内。

自建Oracle数据库的高可用、云上利用ECS部署的Oracle数据库默认情况下不支持高可用切换,通过DTS即可实现主被节点之间的同步。

DTS还剩最后一个工作模式是数据订阅,这个让很多人迷惑并选择忽略的功能是干什么用的?
让我举个例子:前两天一个客户找我咨询,想要实现阿里云RDS MySQL的变更自动更新到Redis,我给他的建议就是用数据订阅来实现。

先建立一个数据订阅通道,捕获源数据库的变更操作,然后根据阿里云数据订阅SDK的DEMO程序写一个数据变更服务就可以将数据库的变化实时刷新到Redis中了。
有了DTS,这些看起来很复杂的事情都变成了常规操作。