全部产品
数据传输服务DTS

创建双向同步实例

更新时间:2017-07-13 10:28:21   分享:   

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

支持功能

支持数据源

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

支持同步语法

双向同步支持MySQL所有DML(Insert/Delete/Update)和DDL语法的同步。
其中,为了保证同步链路的稳定性,对于同一张表的DDL更新只能在某个同步方向进行同步。例如:对于A->B,B->A 同步,用户需要配置在A->B或B->A方向上进行DDL同步。一旦某个同步方向配置了DDL同步,另外一个方向不支持DDL同步,只进行DML同步。

冲突检测

为了保证同步数据的一致性,用户需要保证同一个主键/业务主键的记录只在双向同步的某个节点进行更新。

如果用户业务发生误操作或其他原因,对于同一个主键/业务主键在双向同步的两个节点均进行了更新,那么会出现同步冲突,为了最大程度维护同步实例的稳定性,DTS支持冲突检测和修复。下面介绍DTS支持的冲突类型和修复方法。

支持冲突类型

目前DTS支持的冲突类型包括:

  • Insert导致的唯一性冲突

Insert导致的唯一性冲突是指当同步Inser语句时违背了唯一性约束。例如双向同步的两个节点同时Insert 一条主键值一样的记录,那么同步到对端时,会因为已经存在相同主键值的记录,导致Insert同步失败。

  • Update 更新的记录不完全匹配

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

  • Delete 对应的记录不存在

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

支持冲突修复策略

对于上面的同步冲突,DTS提供了如下几种修复策略,用户可以在配置双向同步时,选择任意一种冲突修复策略。

  • TaskFailed(遇到冲突,任务报错退出)

这种冲突修复策略是指当同步遇到上面的冲突类型时,同步任务直接报错并退出,同步任务进入失败状态,需要用户介入修复任务。这种冲突修复方法为默认的冲突修复策略

  • Ignore(遇到冲突,直接使用目标实例中的冲突记录)

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

  • Overwrite(遇到冲突,直接覆盖目标实例中的冲突记录)

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

同步限制

数据源

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

同步架构

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

进入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. 购买同步链路

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

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

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

  • 源实例

源实例选择 RDS For MySQL

  • 源地域

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

  • 目标实例

目标实例选择RDS For MySQL

  • 目标地域

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

  • 同步拓扑

同步拓扑选择:双向同步

  • 网络类型

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

  • 实例规格

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

  • 数量

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

购买双向同步实例

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

未配置双向同步实例

此时,可以点击同步作业右侧的“配置同步链路” 开始某个方向的同步任务的配置。下面详细介绍某个方向的同步任务的配置流程。

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

在这一步主要配置:

  • 同步作业名称

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

  • 同步作业的RDS实例ID

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

双向同步实例-配置步骤1

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

3. 授权RDS实例白名单

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

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

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

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

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

5. 同步对象及同步策略配置

当创建完目标RDS实例的同步账号后,即进入同步对象及同步策略的配置。

  • 是否过滤DDL

这个配置项定义这个同步方向的同步是否要同步DDL,如果需要同步那么选择 ,否则选择 。一旦这个同步方向选择同步DDL,那么同一张表在另一个同步方向不支持DDL同步。

  • DML同步类型

这个配置项定义需要同步的DML类型,默认包括:Insert、Update、Delete,用户可以根据业务需要调整需要同步的DML类型。

  • 冲突修复策略

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

  • 同步对象选择

实时同步的同步对象的选择粒度可以支持到表级别,即用户可以选择同步某些库或是同步某几张表。

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

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

双向同步配置-步骤2

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

6. 同步初始化配置

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

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

如果同步对象中有部分表包含在另外一个同步方向的同步对象中,那么这部分表不会进行同步初始化。

同步初始化配置

7. 预检查

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

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

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

当这个方向的同步任务配置完成后,另外一个方向同步任务的源及目标RDS实例就固定了不能更改。
双向同步-完成单向同步

完成某一方向的同步任务的配置后,既可以开始另外一个方向的同步作业的配置,具体的配置步骤同上面的步骤2~步骤6。

本文导读目录
本文导读目录
以上内容是否对您有帮助?