如何排查 AWS DMS 任务目标延迟高的问题?

上次更新时间:2020 年 1 月 23 日

我有一个处于完整加载和更改数据捕获 (CDC) 模式的 AWS Database Migration Service (AWS DMS) 任务。源延迟不高,但目标延迟较高或者正在增加。如何排查 AWS DMS 迁移任务目标延迟高的问题?

简短描述

您可以使用 Amazon CloudWatch 指标来监控复制任务的统计数据。具体来说,您可以通过监控 CDCLatencySourceCDCLatencyTarget 指标来识别持续复制阶段 (CDC) 中的延迟。CDCLatencySource 指标记录源和复制实例之间的延迟。CDCLatencyTarget 指标记录复制实例与目标之间的延迟。有关更多信息,请参阅复制任务指标

CDCLatencySource 高则意味着从源捕获更改的过程存在延迟。而 CDCLatencyTarget 高则意味着将更改事件应用到目标的过程存在延迟。如果 CDCLatencySource CDCLatencyTarget 都高,则应首先调查 CDCLatencySource,因为目标延迟始终等于或大于源延迟。CDCLatencyTarget 高最有可能是因从源捕获更改事件时的延迟导致。如果 CDCLatencySource 不高,但 CDCLatencyTarget 较高,则延迟可能是由于下列原因造成的:

  • 目标没有主键或索引
  • 目标存在资源瓶颈
  • 复制实例存在资源瓶颈
  • 复制实例与目标之间存在网络问题

要解决这些问题,请参阅最佳实践和问题排查

解决方法

目标中没有主键或索引

默认情况下,AWS DMS 会像任何其他应用程序一样,通过 INSERT、UPDATE 或 DELETE 等数据操作语言 (DML) 语句将更改写入目标。如果没有需要的索引,UPDATE 和 DELETE 等更改可能会导致全表扫描。全表扫描可能会导致目标发生性能问题。这些扫描进而会导致目标延迟。请检查目标数据库的架构,尤其是您手动创建了目标架构时。使用目标数据库的机制识别运行缓慢的查询,例如 MySQL 慢查询日志PostgreSQL 的 pg_stat_activity 或查询计划。如果您的目标是 Amazon Redshift,则还需检查表的分配方式。所有分配方式均可能会导致目标延迟,因为在表中 INSERT 或 UPDATE 数据将需要更长时间。

目标存在资源瓶颈

如果您的目标没有足够的资源,则目标无法按照 AWS DMS 发送更改的速率接受更改。这可能导致目标资源瓶颈并且出现目标延迟。如果其他进程也消耗目标中的资源,则也可能发生这种情况。如果目标是在 AWS 上托管,则请检查 CloudWatch 指标以获取资源统计数据

复制实例存在资源瓶颈

选择的复制实例应具有足够的资源来处理迁移 — CPU、内存、网络或 iOPS。您可以使用 CloudWatch 指标来监控复制实例资源

复制实例与目标之间存在网络问题

网络带宽和延迟问题也可能会导致延迟问题,尤其是您的目标属于本地数据库,或者您使用 AWS DMS 进行跨区域复制时。

最佳实践和问题排查

如果您的目标是 Amazon Relational Database Service (Amazon RDS),请遵循改进 AWS DMS 迁移的性能的最佳实践。Amazon RDS 拥有自动备份机制,它会在备份时段内启动,且 Amazon RDS 会备份被移动的数据。如果这时正在捕获目标数据库实例的快照,AWS DMS 可能会在将更改应用到目标时遇到问题。因此在快照捕获完成之前,目标延迟将会增加。如果您的目标是 Amazon Elastic Compute Cloud (Amazon EC2) 或本地数据库,请检查目标数据库的备份机制。

一些任务设置可能会导致将更改写入目标的速度缓慢。如果您从高速更改的源持续复制,请考虑使用 BatchApplyEnabled。有关更多信息,请参阅 AWS DMS 迁移调试:出现问题时该怎么办?一文的 BatchApplyEnabled 部分。

要将 BatchApplyEnabled 设置为 True,请使用 AWS 命令行界面 (AWS CLI) 运行 modify-replication-task 命令:

aws dms modify-replication-task --replication-task-arn arn:aws:dms:ap-northeast-1:123456789012:task:ABCDEFGHIJKLMNOPQRSTUVWXYZ --replication-task-settings "{\"TargetMetadata\":{\"BatchApplyEnabled\":true}}"

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?