如何使用 DMS 批处理应用功能来提高 CDC 复制性能?

上次更新日期:2020 年 8 月 24 日

我正在运行一个处于完整加载和更改数据捕获 (CDC) 模式的 AWS Database Migration Service (AWS DMS) 任务。源延迟不高,但目标延迟较高或者正在增加。如何加快 CDC 复制阶段?

简短描述

在更改数据捕获 (CDC) 阶段,AWS DMS 使用以下方法来复制数据:

  • 事务应用
  • 批量应用

默认情况下,AWS DMS CDC 进程为单线程(事务应用)。它使用的是与所有其他联机事务处理 (OLTP) 数据库引擎相同的 SQL 复制方法。DMS CDC 复制完全依赖源数据库事务日志。当正处于复制阶段时,DMS 使用事务性应用方法来应用更改,如下所示:

  1. DMS 将事务日志中的更改从源读取到复制数据库实例内存。
  2. DMS 对更改进行转换,然后将其传递给分类器组件。
  3. 分类器组件按提交顺序对事务进行排序,然后依次将其转发至目标。

如果源数据库上的更改率很高,则此过程可能需要花费一些时间。当 DMS 从源数据库接收大量传入工作负载时,您会发现 CDC 目标延迟时间指标会达到峰值。

DMS 使用单线程复制方法来处理 CDC 更改。DMS 提供了任务级别设置BatchApplyEnabled,可使用批处理来快速处理目标上所做的更改。如果源数据库上的工作负载很大,并且目标 CDC 延迟很高,则BatchApplyEnabled非常有用。默认情况下,DMS 禁用BatchApplySetting。您可以使用 AWS 命令行界面 (AWS CLI) 来启用此功能。

批量应用的工作原理

如果您使用 BatchApplyEnabled来运行任务,则 DMS 将以以下方式处理更改:

  1. DMS 从源数据库事务日志中批量收集更改。
  2. DMS 将创建一个名为净更改表的表,其中将包含批次中所做的所有更改。
  3. 该表驻留在复制数据库实例的内存中,并将传递给目标数据库实例。
  4. DMS 应用了净更改算法,该算法可以筛选出从净更改表到实际目标表的所有更改。

例如,如果您使用BatchApplyEnabled运行一个 DMS 任务,并且有一个新的行插入,且对该行进行了 10 次更新,并在一个批处理中对该行进行了删除,则 DMS 将筛选出所有这些事务,而不会使其延续。这样做是因为该行最终将被删除,不再存在。此过程可减少应用于目标的实际事务的数量。

BatchApplyEnabled将净更改算法应用于特定任务的批处理中的表的行级别。因此,如果源数据库在同一行上进行频繁的更改(更新、删除和插入)或这些工作负载的组合,则您可从 BatchApplyEnabled 获得最佳使用体验。这样可以最大限度地减少要应用于目标的更改。如果收集的批次所做的更改是唯一的(即针对不同的行记录进行更新/删除/插入更改),则净更改表算法过程将无法筛选出任何事件,且所有批次事件都将以批次模式应用于目标。表需要具有主键或唯一键才能使用批量应用。

DMS 还提供了BatchApplyPreserveTransaction设置,可用于更改处理的优化。如果您已启用BatchApplySetting,则BatchApplyPreserveTransaction默认会处于开启状态。如果将其设置为 true,则事务的完整性将得以保留,且批处理必定会包含源中事务中所进行的全部更改。此设置仅适用于 Oracle 目标终端节点。

注意:请注意此设置的优点和缺点。当BatchApplyPreserveTransaction设置为true时,DMS 会在复制数据库实例的内存中捕获整个长时间运行的事务。它根据任务设置MemoryLimitTotalMemoryKeepTime进行此操作,并会在将更改发送到净更改表之前根据需要进行交换。当BatchApplyPreserveTransaction设置为false时,来自单个事务的更改可以跨越多个批次。例如,由于目标数据库不可用,部分应用时,这可能会导致数据丢失。

有关 DMS 延迟和批量应用过程的更多信息,请参阅调试 AWS DMS 迁移博客的第 2 部分第 3 部分

批量应用的使用案例

您可以在以下情况下使用批量应用:

  • 该任务拥有大量从源捕获的事务,导致了目标延迟。
  • 该任务的工作负载来自源,该工作负载是对同一行的插入、更新和删除的组合。
  • 无需对目标(禁用的 FK)保持严格的参照完整性。

限制

批量应用当前具有以下限制

解决方法

BatchApplySetting默认处于禁用状态。您只能使用 AWS 命令行界面 (AWS CLI) 来启用此设置。在启用批处理设置之前,请在系统上完成以下设置任务:

检查现有任务的批量设置状态

  1. 打开 AWS DMS 控制台
  2. 从导航窗格中,选择数据库迁移任务
  3. 选择您的任务,然后选择任务设置 (JSON)。在 JSON 中,BatchApplyEnabled已处于已禁用状态。

启用批处理设置

  1. 打开安装有 AWS CLI 的系统。
  2. 运行aws config命令进入 CLI 提示符。
  3. 键入您的AWS 访问密钥 ID,然后按回车键。
  4. 键入您的AWS 私有密钥 ID,然后按回车键。
  5. 键入 DMS 资源的区域名称,然后按回车键。
  6. 键入输出格式,然后按回车键。
  7. 使用任务 ARN 和批处理设置条件执行modify-replication-task 命令。

注:请先确认任务处于已停止状态,然后再修改任务。根据您的任务更改以下命令上的 ARN,然后执行它以更改任务设置。

在 CLI 中成功执行命令后,打开 DMS 控制台并再次检查任务的批处理设置状态。在 Task Setting (JSON)中,BatchApplyEnabled现已处于“已启用”状态。

您现在可以启动 DMS 任务并观察迁移性能。

aws dms modify-replication-task --replication-task-arn arn:aws:dms:us-east-1:123456789123:task:4VUCZ6ROH4ZYRIA25M3SE6NXCM --replication-task-settings "{\"TargetMetadata\":{\"BatchApplyEnabled\":true}}"

在批处理模式下运行任务后,对 CDCLatencyTarget 高的问题进行故障排除

如果在批处理模式下运行任务后,CDCLatencyTarget很高,则延迟可能是由以下原因造成的:

  • 由于缺少主索引和二级索引,目标事务处理在长时间运行
  • 处理目标工作负载的资源可用性不足
  • DMS 复制实例上的高资源争用

按照DMS 最佳做法来排查这些问题。