New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
如何使用 DMS 批处理应用功能来提高 CDC 复制性能?
我正在运行一个处于完整加载和更改数据捕获(CDC)模式的 AWS Database Migration Service(AWS DMS)任务。源延迟不高,但目标延迟较高或者正在增加。如何加快 CDC 复制阶段?
简短描述
在更改数据捕获 (CDC) 阶段,AWS DMS 使用以下方法来复制数据:
- 事务应用
- 批量应用
默认情况下,AWS DMS CDC 进程为单线程(事务应用)。这与用于所有其他联机事务处理(OLTP)数据库引擎的 SQL 复制方法相同。DMS CDC 复制依赖源数据库事务日志。当正处于复制阶段时,DMS 使用事务性应用方法来应用更改,如下所示:
- DMS 将事务日志中的更改从源读取到复制数据库实例内存。
- DMS 对更改进行转换,然后将其传递给分类器组件。
- 分类器组件按提交顺序对事务进行排序,然后依次将其转发至目标。
如果源数据库上的更改率很高,则此过程可能需要花费一些时间。当 DMS 从源数据库接收大量传入工作负载时,您可能会看到 CDC 目标延迟时间指标会达到峰值。
DMS 使用单线程复制方法来处理 CDC 更改。DMS 提供了任务级别设置BatchApplyEnabled,可使用批处理来快速处理目标上所做的更改。如果源数据库上的工作负载很大,并且目标 CDC 延迟很高,则 BatchApplyEnabled 非常有用。默认情况下,DMS 会停用 BatchApplySetting。您可以使用 AWS 命令行界面(AWS CLI)来激活此功能。
批处理应用的工作原理
如果您使用 BatchApplyEnabled 来运行任务,则 DMS 将以以下方式处理更改:
- DMS 从源数据库事务日志中批量收集更改。
- DMS 将创建一个名为净更改表的表,其中将包含批次中所做的所有更改。
- 该表驻留在复制数据库实例的内存中,并将传递给目标数据库实例。
- DMS 应用了净更改算法,该算法可以筛选出从净更改表到实际目标表的所有更改。
例如,如果您使用 BatchApplyEnabled 运行 DMS 任务,并且有一个新的行插入,且对该行进行了十次更新,并在单一批处理中对该行进行了删除,则 DMS 将筛选出所有这些事务,而不会使其延续。这样做是因为该行最终将被删除,不再存在。此过程可减少应用于目标的实际事务的数量。
BatchApplyEnabled 将净更改算法应用于特定任务批处理范围内的表的行级别。因此,如果源数据库在同一行上进行频繁的更改(更新、删除和插入)或这些工作负载的组合,则您可从 BatchApplyEnabled 获得最佳使用体验。 这样可以最大限度地减少要应用于目标的更改。如果收集的批次所做的更改是唯一的(针对不同的行记录进行更新/删除/插入更改),则净更改表算法过程将无法筛选出任何事件。因此,所有批次事件都将以批次模式应用于目标。表必须具有主键或唯一键才能使用批处理应用。
DMS 还提供了 BatchApplyPreserveTransaction 设置,可用于更改处理的优化。如果您已激活 BatchApplyEnabled,则 BatchApplyPreserveTransaction 默认会处于开启状态。如果将其设置为 true,则可保留事务完整性。保证批次中包含来自来源的事务处理中的所有更改。此设置仅适用于 Oracle 目标终端节点。
**注意:**请注意此设置的优点和缺点。当 BatchApplyPreserveTransaction 设置为 true 时,DMS 会在复制数据库实例的内存中捕获整个长时间运行的事务。它根据任务设置 MemoryLimitTotal 和 MemoryKeepTime 进行此操作,并会在将更改发送到净更改表之前根据需要进行交换。当 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 控制台激活此设置。在启用批处理设置之前,请在系统上完成以下设置任务:
- 安装和配置最新版本的 AWS CLI。
- 创建具有程序访问权限的 IAM 用户。
检查现有任务的批量设置状态
- 打开 AWS DMS 控制台。
- 从“导航”窗格中,选择数据库迁移任务
- 选择您的任务,然后选择任务设置 (JSON)。在 JSON 中,BatchApplyEnabled 已处于已禁用状态。
使用 AWS CLI 激活批处理设置
- 在安装了 AWS CLI 的情况下打开系统。
- 运行 aws configure 命令以打开 AWS CLI 提示符。
- 输入您的 AWS access key ID(AWS 访问密钥 ID),然后按 Enter 键。
- 输入您的 AWS secret key ID(AWS 私有密钥 ID),然后按 Enter 键。
- 输入 DMS 资源的 Region name(区域名称),然后按 Enter 键。
- 输入 output format(输出格式),然后按 Enter 键。
- 使用任务 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 控制台激活批处理设置
- 打开 AWS DMS 控制台。
- 从导航窗格中,选择数据库迁移任务。
- 选择您的任务,然后选择修改。
- 从 Task settings(任务设置)部分选择 JSON editor(JSON 编辑器)。
- 修改要更改的任务设置。例如,从 TargetMetadata 部分,将 BatchApplyEnabled 更改为 true(默认值为 false)。
- 单击保存以修改任务。
请按照以下步骤验证更改是否已生效:
- 从“任务”列表页面选择您修改的任务。
- 从概述详细信息选项卡中,展开任务设置 (JSON)。
- 查看任务的任务设置。
在批处理模式下运行任务后,对 CDCLatencyTarget 高的问题进行故障排除
如果在批处理模式下运行任务后,CDCLatencyTarget 很高,则延迟可能是由以下原因造成的:
- 由于缺少主索引和二级索引,目标事务处理在长时间运行
- 处理目标工作负载的资源可用性不足
- DMS 复制实例上的高资源争用
按照 DMS 最佳实践来排查这些问题。
相关信息

相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 2 年前