全部产品
阿里云办公

配置ECS自建数据库跟RDS实例间的数据实时同步

更新时间:2018-08-09 10:17:49

数据传输服务 DTS支持ECS实例上的自建数据库跟RDS实例间的数据同步。本小节以ECS上的自建 MySQL 跟 RDS for MySQL 实例间的数据实时同步为例,介绍如何通过 DTS 进行ECS上的自建数据库跟RDS实例间数据同步作业的配置。如果要配置RDS->ECS上的自建DB 的反向同步,只要调换下源跟目标实例的实例类型,其他配置类似。

同步限制

同步架构

目前数据传输服务提供的实时同步功能支持的同步架构有限,其仅能支持如下两种架构:
1. A->B 即两个实例之间的单向同步
即支持1对1的单向同步,要求实例 B 中同步的对象必须为只读,否则会导致同步链路异常,出现数据不一致的情况。

  1. ![单向同步一对一](//docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/cn/dts/0.0.41/assets/%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8/1%E5%AF%B91%E5%8D%95%E5%90%91%E5%90%8C%E6%AD%A5.jpg)

2. A->B/C/D 即一对多的分发式同步架构

这个架构对目标 RDS for MySQL 实例个数没有限制,但是要求目标实例中的同步对象必须为只读,否则会导致同步链路异常,出现数据不一致的情况。

单向同步一对多

3. B/C/D->A 即多对一的数据汇总架构对于这种多对一的同步架构,为了保证同步数据一致性,要求每条同步链路同步的对象不相同。

单向同步多对一

4. A->B->C 即级联架构

单向同步级联

5. A->B->A 即实例A和实例B之间的双向同步架构

双向同步

注意:如果需要使用双向同步,需要在购买同步链路时,选择双向同步,并在 数据传输 DTS 控制台 中根据指引进行配置。

如果用户配置同步链路过程中,配置不在上述支持范围内的的同步架构,那么预检查中的复杂拓扑检查项会检查失败。

功能限制

  • 不兼容触发器

    如果同步对象为整个库且这个库中包含了会更新同步表内容的触发器,会导致同步数据不一致。

    例如同步库为A,这个库中存在了两个表 A, B。表 A 上有一个触发器,触发器内容为在 insert 一条数据到表 A 之后,在表 B 中插入一条数据。这种情况下,在同步过程中,如果源实例有表 A 上的 insert 操作,就会导致表 B 在源实例跟目标实例数据不一致。

    为了解决这个问题,只能将目标实例中的对应触发器删除掉。表 B 的数据由源实例同步过去。具体解决方案详见最佳实践中的,触发器存在情况下如何配置同步链路

  • rename table 限制

    rename table 操作需要满足限制条件方可正常同步,否则会导致同步数据不一致。例如同步对象只包含表 A,不包含表 B,如果同步过程中源实例执行了 rename A to B 的操作,那么改名后的表 B 的操作不会被同步到目标库。为了解决这个问题,可以选择同步表 A、B 对应的整个数据库。

同步实例配置

下面详细介绍使用 DTS 配置本地的 MySQL 跟 RDS for MySQL 之间数据同步的详细流程。

RDS 实例数据库创建

在数据同步过程中,如果待同步的数据库在目标 RDS 实例中不存在,那么 DTS 自动会创建。但是如果源数据库名称不符合规范,那么用户需要在配置同步实例之前,手动创建符合RDS规范的数据库名,具体创建方法 参考RDS 数据库创建流程

其他准备工作

如果需要进行数据同步,那么需要确认源库的 binlog 是否开启,格式是否满足要求。具体确认项如下。
1. 确认源库的 binlog 是否开启

确认源库开启 binlog

如果这里面查询出来的 log_bin=OFF,那么说明源库没有开启 binlog,这个时候如果需要使用增量迁移的话,需要修改本地 MySQL 的 binlog 配置,打开 binlog 日志。
(1) 开启二进制日志 binlog,修改 log_bin=mysql_bin。
(2) 设置 binlog 模式为row,修改 binlog_format=row。
(3) 配置 server_id 大于 1,即 server_id=某一个大于 1 的整数。
(4) 如果版本为 5.6,修改 binlog_row_image=full。
(5) 修改完成后,重启 MySQL 进程。

2. 确认源库的 binlog 格式为 row 模式

确认源库 binlog 格式为 row 模式

使用上面的命令确认本地 MySQL 的 binlog 格式是否为 row,如果查询出来的结果不为 row 的话,那么通过如下的参数设置命令将模式修改为 row。

修改源库 binlog 格式为 row

当修改完成后,最好将已经连接到 MySQL 实例的连接 KILL 掉重连,否则可能出现其他的连接依然使用 statement 格式记录 binlog 日志。

3. 当本地 MySQL 版本大等于 5.6.2 时,确认源库的 binlog_row_image=full

确认源库 binlog_row_image

如果查询出来的结果不为 full 的话,那么通过如下的参数设置命令将其修改为 full。

修改源库 binlog_row_image 为 full

同步实例配置

当数据库创建完成后,就可以开始配置同步实例了。下面详细介绍下具体的配置步骤。

1. 购买实例

进入数据传输 DTS 控制台,单击右上角的创建同步作业,购买同步实例。
同步实例目前支持包年包月及按量付费两种付费模式,可以根据需要选择不同的付费模式。购买同步实例需要配置的主要信息如下:

  • 源地域

    源地域选择ECS实例所在的区域。

  • 源实例
    源实例为源实例类型,目前只支持MySQL。

  • 目标地域

    目标地域为同步链路目标实例所在地域。

  • 目标实例

    目标实例为目标实例类型,目前支持MySQL、MaxCompute、Datahub及分析型数据库。这里选择MySQL。

  • 实例规格

    实例规格影响了链路的同步性能,实例规格跟性能之间的对应关系详见 数据同步规格说明

当购买完同步实例,返回数据传输控制台,点击新购链路右侧的“配置同步作业” 开始链路配置。

2. 填写本地 MySQL 及目标 RDS for MySQL 实例连接信息配置

在这个步骤中,主要配置同步实例名称,同步源实例及目标实例连接信息。其中:

  • 任务名称

默认情况下,DTS 为每个任务自动生成一个任务名称。任务名称没有唯一性要求,您可以修改这个名称,为任务配置一个具有业务意义的名称,便于后续的任务识别。

  • 源实例连接信息

    • 实例类型:选择 ECS上的自建数据库
    • ECS实例ID: 配置ECS实例的实例ID
    • 端口:本地 MySQL 实例监听端口
    • 数据库账号:本地 MySQL 实例访问账号
    • 数据库密码:上面指定的 MySQL 访问账号对应的密码
  • 目标RDS实例连接信息

    • 实例类型:选择 RDS 实例
    • RDS 实例 ID: 配置迁移的目标 RDS for MySQL 实例的实例 ID。 DTS 支持经典网络和 VPC 网络的 RDS for MySQL 实例
    • 数据库账号:RDS for MySQL 实例的连接账号
    • 数据库密码:上面指定的数据库账号对应的密码

配置连接信息

3. 授权实例白名单

这个步骤,主要是将数据传输服务器 IP 添加到同步 RDS 实例的白名单和ECS实例的安全组中。避免因为 RDS/ECS设置了白名单,数据传输服务器连接不上实例导致同步作业创建失败。

为了保证同步作业的稳定性,在同步过程中,请勿将这些服务器 IP 从 RDS/ECS 实例的白名单/安全组中删除。

当白名单授权后,点击下一步,进入同步账号创建。

4. 创建目标库上的同步账号

这个步骤主要是在目标 RDS 实例上创建一个同步账号,账号名字为:dtssyncwriter,在同步过程中,不能删除这个账号,否则会导致同步链路中断。

5. 选择同步对象

当创建完目标 RDS 实例的同步账号后,即进入同步对象的选择步骤。实时同步的同步对象的选择粒度可以支持到表级别,即用户可以选择同步某些库或是同步某几张表。

如果选择的同步对象为整个库,那么这个库中所有对象的结构变更操作(例如 create table,drop view 等),都会同步到目标库。

如果选择的某张表,那么只有这个表的 drop/alter/truncate/rename table,create/drop index 的操作会同步到目标库。

同步对象选择

当配置完同步对象后,进入同步初始化配置。

6. 同步初始化配置

同步初始化配置,初始化是同步链路启动的第一步,它会将源实例中已经存在同步对象的结构及数据在目标实例中初始化,作为后续增量同步数据的基线数据。

同步初始化类型细分为:结构初始化,全量数据初始化。默认情况下,需要选择结构初始化及全量初始化。

同步初始化配置

7. 预检查

当上面所有选项配置完成后,即进入启动之前的预检查。

当同步作业配置完成后,数据传输服务会进行限制预检查,当预检查通过后,可以点击 启动 按钮,启动同步作业。

当同步作业启动之后,即进入同步作业列表。此时刚启动的作业处于同步初始化状态。初始化的时间长度依赖于源实例中同步对象的数据量大小。当初始化完成后同步链路即进入同步中的状态,此时源跟目标实例的同步链路才真正建立完成。