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

2 分钟阅读
0

我正在运行一个处于完整加载和更改数据捕获(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 任务,并且有一个新的行插入,且对该行进行了十次更新,并在单一批处理中对该行进行了删除,则 DMS 将筛选出所有这些事务,而不会使其延续。这样做是因为该行最终将被删除,不再存在。此过程可减少应用于目标的实际事务的数量。

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

DMS 还提供了 BatchApplyPreserveTransaction 设置,可用于更改处理的优化。如果您已激活 BatchApplyEnabled,则 BatchApplyPreserveTransaction 默认会处于开启状态。如果将其设置为 true,则可保留事务完整性。保证批次中包含来自来源的事务处理中的所有更改。此设置仅适用于 Oracle 目标终端节点。

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

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

批处理应用的使用案例

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

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

限制

批处理应用当前具有以下限制**:**

  • Amazon Redshift 目标默认使用批量应用。Amazon Simple Storage Service (Amazon S3) 目标被强制使用事务性应用。
  • 批量应用只能用于具有主键/唯一索引的表。对于没有主键/唯一索引的表,批量应用将仅在批量模式下应用插入,但将逐个执行更新和删除。如果表具有主键/唯一索引,但您观察到其已切换为一对一模式,请参阅由于 AWS DMS 任务期间批量操作失败而导致 Amazon Redshift 切换为一对一模式,应如何排查故障?
  • 如果复制中包含 LOB 列,则只能在受限 LOB 模式下使用 BatchApplyEnabled。有关更多信息,请参阅目标元数据任务设置
  • 当 BatchApplyEnabyEnabled 设置为 true 时,如果目标表具有唯一约束,则 AWS DMS 生成错误消息。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI

BatchApplySetting 默认处于禁用状态。您可以使用 AWS CLI 或 AWS DMS 控制台激活此设置。在启用批处理设置之前,请在系统上完成以下设置任务:

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

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

使用 AWS CLI 激活批处理设置

  1. 在安装了 AWS CLI 的情况下打开系统。
  2. 运行 aws configure 命令以打开 AWS CLI 提示符。
  3. 输入您的 AWS access key ID(AWS 访问密钥 ID),然后按 Enter 键。
  4. 输入您的 AWS secret key ID(AWS 私有密钥 ID),然后按 Enter 键。
  5. 输入 DMS 资源的 Region name(区域名称),然后按 Enter 键。
  6. 输入 output format(输出格式),然后按 Enter 键。
  7. 使用任务 ARN 和批处理设置条件运行 modify-replication-task 命令。

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

在 AWS CLI 中成功运行命令后,打开 DMS 控制台并再次检查任务的批处理设置状态。在**任务设置(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}}"

使用 AWS DMS 控制台激活批处理设置

  1. 打开 AWS DMS 控制台
  2. 从导航窗格中,选择数据库迁移任务
  3. 选择您的任务,然后选择修改
  4. Task settings(任务设置)部分选择 JSON editor(JSON 编辑器)。
  5. 修改要更改的任务设置。例如,从 TargetMetadata 部分,将 BatchApplyEnabled 更改为 true(默认值为 false)。
  6. 单击保存以修改任务。

请按照以下步骤验证更改是否已生效:

  1. 从“任务”列表页面选择您修改的任务。
  2. 概述详细信息选项卡中,展开任务设置 (JSON)
  3. 查看任务的任务设置。

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

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

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

按照 DMS 最佳实践来排查这些问题。


相关信息

监控 AWS DMS 任务

如何编写数据库迁移的脚本

自动执行 AWS DMS 迁移任务

如何使用 AWS DMS 创建源或目标端点?

更改处理优化设置

AWS 官方
AWS 官方已更新 2 年前