全部产品
阿里云办公

创建 RDS for MySQL 实例间数据实时同步作业

更新时间:2018-11-01 11:23:17

本小节介绍如何使用数据传输服务快速创建两个 RDS for MySQL 实例之间的实时同步作业,实现 RDS for MySQL 增量数据的实时同步。

支持数据源

  1. 支持阿里云账号下两个 RDS for MySQL 实例间的实时同步。
  2. 支持不同阿里云账号下的 RDS for MySQL 实例间的实时同步。
  3. 暂不支持不同阿里云账号下的 RDS for MySQL 实例间的双向同步,具体支持时间将另行通知。

支持同步的SQL操作

对于MySQL->MySQL数据同步,DTS支持同步的SQL操作包括:
Insert、Update、Delete、Replace
ALTER TABLE、ALTER VIEW、ALTER FUNCTION、ALTER PROCEDURE
CREATE DATABASE、CREATE SCHEMA、CREATE INDEX、CREATE TABLE、CREATE PROCEDURE、CREATE FUNCTION、CREATE TRIGGER、CREATE VIEW、CREATE EVENT
DROP FUNCTION、DROP EVENT、DROP INDEX、DROP PROCEDURE、DROP TABLE、DROP TRIGGER、DROP VIEW
RENAME TABLE、TRUNCATE TABLE

注意事项

全量初始化过程中,并发insert导致目标实例的表碎片,全量初始化完成后,目标实例的表空间比源实例的表空间大。

同步限制

数据源

  1. 目前实时同步只能支持 RDS for MySQL 实例,暂不支持其他数据源类型。
  2. 目标实例不支持访问模式为标准模式且只有外网连接地址的 RDS for MySQL 实例。
  3. 不支持香港可用区 A 的 RDS for MySQL 实例的实时同步。
  4. 对于 rename table tbl_name to new_tbl_name、create table tbl_name like new_tbl_name、 create…select…from new_tbl_name、alter table tbl_name rename to new_tbl_name,如果 new_tbl_name 不在指定的同步对象中,则不支持对此 DDL 进行复制。

同步架构

目前数据传输服务提供的实时同步功能支持的同步架构有限,其仅能支持如下架构:

  1. A->B 即两个实例之间的单向同步。且要求实例 B 中同步的对象必须为只读,否则会导致同步链路异常,出现数据不一致的情况。

    单向同步一对一

  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 对应的整个数据库。

准备事项

在配置同步作业前,要确保同步作业的源及目标RDS实例都已经存在。如果不存在,那么请先购买RDS实例 购买 RDS 实例

配置步骤

下面我们详细介绍下创建任意两个 RDS 实例之间的同步链路的具体步骤。

  1. 购买同步链路。

    进入数据传输 DTS 控制台,进入数据同步页面,点击控制台右上角 “创建同步作业” 开始作业配置。

    在链路配置之前需要购买一个同步链路。同步链路目前支持包年包月及按量付费两种付费模式,可以根据需要选择不同的付费模式。

    在购买页面需要配置的参数包括:

    • 源地域

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

    • 目标地域

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

    • 实例规格

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

    • 数量

      数量为一次性购买的同步链路的数量,如果购买的是按量付费实例,一次最多购买 99 条链路。

      数据同步购买

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

  2. 同步链路连接信息配置。

    在这一步主要配置:

    • 同步作业名称

      同步作业名称没有唯一性要求,主要为了更方便识别具体的作业,建议选择一个有业务意义的作业名称,方便后续的链路查找及管理。

    • 同步链路的 RDS 实例 ID

      源跟目标 RDS 实例必须为两个不同的实例,选择 RDS 实例 ID 时,下拉菜单中只列出对应阿里云账号下的 RDS for MySQL 实例。

      同步作业_步骤1

      当这些内容配置完成后,可以点击授权白名单并进入下一步

  3. 授权RDS实例白名单。

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

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

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

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

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

  5. 选择同步对象。

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

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

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

    同步对象选择

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

  6. 同步初始化配置。

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

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

    同步初始化配置

  7. 预检查。

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

    当同步作业配置完成后,数据传输服务会进行限制预检查,当预检查通过后,DTS直接启动同步作业。

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