如何创建 RDS 实例之间的双向同步-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

如何创建 RDS 实例之间的双向同步


本小节介绍如何使用数据传输 DTS(以下简称 DTS)快速创建两个 RDS for MySQL 实例之间的双向同步作业,以实现异地多活(单元化),数据容灾等多种应用场景。

支持功能



支持数据源

  • 支持同一个阿里云账号下的两个 RDS for MySQL 实例间的双向同步,包括 VPC 网络 RDS 实例和经典网络 RDS 实例。
  • 支持不同阿里云账号下的 RDS for MySQL 实例间的双向同步。


支持同步语法


双向同步支持 RDS for MySQL 所有 DML (Insert/Update/Delete) 和部分 DDL 语法的同步,对 DDL 语法同步支持的具体信息请参考 创建 RDS 实例间数据实时同步作业 中的信息。同时,为了保证双向同步链路的稳定性,对于同一张表的 DDL 更新只能在其中一个同步方向进行同步。例如:对于 A->B,B->A 同步,用户需要配置在 [backcolor=transparent]A->B 或者 B->A 方向上进行 DDL 同步。一旦某个同步方向配置了 DDL 同步,则在反方向上不支持 DDL 同步,只进行 DML 同步。

冲突检测


[backcolor=transparent]为了保证同步数据的一致性,用户需要保证同一个主键/业务主键/唯一键的记录只在双向同步的某个节点进行更新。
如果用户业务发生误操作或其他原因,对于同一个主键/业务主键/唯一键在双向同步的两个节点均进行了更新,那么会出现同步冲突,为了最大程度维护双向同步实例的稳定性,DTS 支持冲突检测和修复。
[backcolor=transparent]注意:由于数据双向同步过程中可能存在两端系统时间上的差异,以及同步存在延时等多种因素,DTS 无法完全保证其冲突检测机制能够完全防止数据的冲突,用户在使用双向同步时,需要在业务层面配合进行相应的改造,保证同一个主键/业务主键/唯一键的记录只在双向同步的某个节点进行更新。
下面介绍 DTS 支持的冲突类型和修复方法。

支持冲突类型


目前 DTS 支持进行检测的冲突类型包括:
  • [backcolor=transparent]Insert 导致的唯一性冲突

Insert 导致的唯一性冲突是指当同步 Insert 语句时违背了唯一性约束。例如双向同步的两个节点同时(或者在极为接近的时间前后分别) Insert 一条主键值一样的记录,那么同步到对端时,会因为已经存在相同主键值的记录,导致 Insert 同步失败。
  • [backcolor=transparent]Update 更新的记录不完全匹配

Update 同步冲突主要包括两种:(1) Update 要更新的记录在同步目标实例中不存在。(2) Update 要更新的记录除了主键/唯一键外,其他字段值不完全匹配。
  • [backcolor=transparent]Delete 对应的记录不存在

Delete 同步冲突是指要 Delete 的记录在同步的目标实例中不存在。出现这种冲突的原因可能是目标实例自身的业务对这条记录进行了主键更新或删除了这条记录,导致同步过来的 Delete 操作命中不了记录。

支持冲突修复策略


对于上面的同步冲突,DTS 提供了如下几种修复策略,用户可以在配置双向同步时,选择任意一种冲突修复策略。
  • [backcolor=transparent]TaskFailed (遇到冲突,任务报错退出)

这种冲突修复策略是指当同步遇到上面的冲突类型时,同步任务直接报错并退出,同步任务进入失败状态,需要用户介入修复任务。这种冲突修复方法为默认的冲突修复策略
  • [backcolor=transparent]Ignore (遇到冲突,直接使用目标实例中的冲突记录)

这种冲突修复策略是指当同步遇到上面的冲突类型时,直接跳过当前同步语句,继续往下执行,选择使用目标实例中的冲突记录。
  • [backcolor=transparent]Overwrite (遇到冲突,直接覆盖目标实例中的冲突记录)

这种冲突修复策略是指当同步遇到上面的冲突类型时,直接覆盖目标实例中的冲突记录。

同步限制



数据源

  1. 目前只有 RDS for MySQL 实例间支持双向同步,其他异构数据源间暂不支持双向同步。
  2. 目标实例不支持访问模式为标准模式且只有外网连接地址的 RDS 实例。


同步架构


目前数据传输服务提供的双向同步功能只支持两个 RDS for MySQL 实例之间的双向同步,暂不支持多实例之间的双向同步,即其能支持如下架构:


功能限制


  • 不兼容触发器
    如果同步对象为整个库且这个库中包含了会更新同步表内容的触发器,那么可能导致同步数据不一致。
    例如同步库为 A,这个库中存在了两个表 a, b。表 a 上有一个触发器,触发器内容为在 insert 一条数据到 表 a 之后,在表 b 中插入一条数据。这种情况下,在同步过程中,如果源实例有表 a 上的 insert 操作,就会导致表 b 在源实例跟目标实例数据不一致。
    为了解决这个问题,只能将目标实例中的对应触发器删除掉。表 b 的数据由源实例同步过去。具体解决方案详见最佳实践中的,[backcolor=transparent]触发器存在情况下如何配置同步链路。

  • rename table 限制
    rename table 操作可能导致同步数据不一致。例如同步对象只包含表A,不包含表B,如果同步过程中源实例执行了 [backcolor=transparent]rename a to b 的操作,那么改名后的表 b 的操作不会被同步到目标库。为了解决这个问题,可以选择同步表 a、b 对应的整个数据库。

  • DDL 语法同步方向限制
    为了保证双向同步链路的稳定性,对于同一张表的 DDL 更新只能在其中一个同步方向进行同步。例如:对于 A->B,B->A 同步,用户需要配置在 [backcolor=transparent]A->B 或者 B->A 方向上进行 DDL 同步。一旦在某个同步方向配置了 DDL 同步,则在反方向上不支持 DDL 同步。


准备事项


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

配置步骤


下面我们详细介绍下创建任意两个RDS实例之间的双向同步实例的具体步骤。
[backcolor=transparent]1. 购买同步链路
进入 数据传输 DTS 控制台,进入数据同步页面,点击控制台右上角“创建同步作业” 开始作业配置。
在链路配置之前需要购买一个双向同步实例。双向同步实例目前支持包年包月及按量付费两种付费模式,可以根据需要选择不同的付费模式。
在购买页面需要配置的参数包括:
  • 源实例

源实例选择 [backcolor=transparent]RDS For MySQL。
  • 源地域

源地域为双向同步实例的某个 RDS 实例所在的地域。
  • 目标实例

目标实例选择 [backcolor=transparent]RDS for MySQL。
  • 目标地域

目标地域为双向同步实例的另外一个 RDS 实例所在地域。
  • 同步拓扑

同步拓扑选择:双向同步
  • 网络类型

网络类型是指跨地域同步数据使用的网络模式,目前只支持私网。
  • 实例规格

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

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

当购买完同步实例,返回数据传输 DTS 控制台。此时,刚购买的同步实例处于未配置状态,它包含了两个同步任务,可以进行两个方向的同步任务的配置。

此时,可以点击同步作业右侧的“配置同步链路” 开始某个方向的同步任务的配置。下面详细介绍某个方向的同步任务的配置流程。
[backcolor=transparent]2. 同步链路连接信息配置
在这一步主要配置:
  • 同步作业名称

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

选择 RDS 实例 ID 时,下拉菜单中只列出对应阿里云账号下的 RDS for MySQL 实例。如果要配置跨阿里云账号的两个 RDS for MySQL 实例间的双向同步,同步任务的配置请参考 跨阿里云账号下的实例迁移同步

当这些内容配置完成后,可以点击[backcolor=transparent]授权白名单并进入下一步 进行 RDS 实例的白名单配置。
[backcolor=transparent]3. 授权 RDS 实例白名单
这个步骤,主要是将数据传输服务器的 IP 地址添加到同步 RDS 实例的白名单中。避免因为 RDS 实例设置了白名单,数据传输服务器连接不上 RDS 实例导致同步作业创建失败。
为了保证同步作业的稳定性,在同步过程中,请勿将这些服务器的 IP 地址从 RDS 实例的白名单中删除。
当白名单授权后,点击下一步,进入同步账号创建。
[backcolor=transparent]4. 创建目标库上的同步账号
这个步骤主要是在目标 RDS 实例上创建一个同步账号,账号名字为:dtssyncwriter,在同步过程中,不能删除这个账号,否则会导致同步链路中断。
[backcolor=transparent]5. 同步对象及同步策略配置
当创建完目标 RDS 实例的同步账号后,即进入同步对象及同步策略的配置。
  • [backcolor=transparent]是否过滤 DDL

这个配置项定义这个同步方向的同步是否要同步 DDL,如果需要同步那么选择 [backcolor=transparent]否,否则选择 [backcolor=transparent]是。一旦这个同步方向选择同步 DDL,那么同一张表在另一个同步方向不支持 DDL 同步。
  • [backcolor=transparent]DML 同步类型

这个配置项定义需要同步的DML类型,默认包括:Insert、Update、Delete,用户可以根据业务需要调整需要同步的 DML 类型。
  • [backcolor=transparent]冲突修复策略

这个配置型定义同步冲突的修复策略,默认为 TaskFailed,用户可以根据业务情况选择合适的冲突修复策略。例如以 A 节点为主业务中心,B 节点为备用业务中心,那么 A 节点正常运行情况下,应该以 A 节点的业务写入为主,即 A->B 同步方向的冲突策略为 overwrite,B->A 同步方向的冲突策略为 ignore。
  • [backcolor=transparent]同步对象选择

实时同步的同步对象的选择粒度可以支持到表级别,即用户可以选择同步某些库或是同步某几张表。
如果选择的同步对象为整个库,那么 DTS 能够支持的这个库中所有对象的结构变更操作(例如 create table,drop view 等),都会同步到目标库。
如果选择的某张表,那么只有这个表的 drop/alter/truncate/rename table,create/drop index 的操作会同步到目标库。

当配置完同步对象后,进入同步初始化配置。
[backcolor=transparent]6. 同步初始化配置
同步初始化配置,初始化是同步链路启动的第一步,它会将源实例中已经存在同步对象的结构及数据在目标实例中初始化,作为后续增量同步数据的基线数据。
同步初始化类型细分为:结构初始化,全量数据初始化。默认情况下,需要选择结构初始化及全量初始化。
如果同步对象中有部分表包含在另外一个同步方向的同步对象中,那么这部分表不会进行同步初始化。

[backcolor=transparent]7. 预检查
当上面所有选项配置完成后,即进入启动之前的预检查。
当同步作业配置完成后,数据传输服务会进行限制预检查,当预检查通过后,可以点击 [backcolor=transparent]启动 按钮,启动同步作业。
当同步作业启动之后,即进入同步作业列表。此时刚启动的作业处于[backcolor=transparent]同步初始化状态。初始化的时间长度依赖于源实例中同步对象的数据量大小。当初始化完成后同步链路即进入[backcolor=transparent]同步中的状态,此时同步任务才真正建立完成。
当这个方向的同步任务配置完成后,另外一个方向同步任务的源及目标 RDS 实例就固定了不能更改。
完成某一方向的同步任务的配置后,既可以开始另外一个方向的同步作业的配置,具体的配置步骤同上面的步骤 2~步骤 6。

展开
收起
云栖大讲堂 2017-10-31 11:54:19 2991 0
1 条回答
写回答
取消 提交回答
问答排行榜
最热
最新
相关电子书
更多
阿里云MySQL云数据库产品体系介绍
立即下载
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL
立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL
立即下载