AWS DMS 如何使用内存进行迁移?

上次更新日期:2022 年 8 月 18 日

我有一个 AWS Database Migration Service(AWS DMS)任务使用的内存多于或少于预期。AWS DMS 如何使用内存进行迁移,以及如何优化复制实例的内存使用情况?

简短描述

AWS DMS 复制实例使用内存来运行复制引擎。此引擎负责在满载阶段在源引擎上运行 SELECT 语句。此外,复制引擎在变更数据捕获(CDC)阶段读取源引擎的事务日志中的数据。这些记录将迁移到目标,然后作为验证过程的一部分与目标数据库上的相应记录进行比较。这便是通用迁移流程在 AWS DMS 中的工作原理。

AWS DMS 还可将内存用于任务配置以及从源到目标的数据流。

解决方法

LOB 设置受限的任务

当您使用具有有限 LOB 设置的 AWS DMS 任务迁移数据时,会根据每个 LOB 列的 LobMaxSize 提前分配内存。如果您将此值设置过高,则您的任务可能会失败。该任务失败是因为内存不足(OOM)错误,具体取决于要迁移的记录数和 CommitRate。

因此,如果您为任务配置高值,请确保 AWS DMS 实例有足够的内存。

{
  "TargetMetadata": {
  "SupportLobs": true,
  "FullLobMode": false,
  "LobChunkSize": 0,
  "LimitedSizeLobMode": true,
  "LobMaxSize": 63,
  "InlineLobMaxSize": 0,
  }

ValidationEnabled 的任务

当您使用 ValidationEnabled=true 的 AWS DMS 任务进行迁移时,您可能会看到额外的内存使用情况。发生这种情况是因为 AWS DMS 会从源数据库和目标数据库中检索 ThreadCount * PartitionSize 记录。然后,它将比较复制实例上的相应数据。因此,在迁移过程中,您可以观察到复制实例、源数据库和目标数据库上的内存使用情况。

要限制正在使用的内存量,请使用 SkipLobColums 忽略 LOB 列。您还可以使用单独的复制实例或 AWS DMS 任务,与迁移任务分开执行验证。为此,请使用 ValidationOnly 设置:

"ValidationSettings": {
  "EnableValidation": true,
  "ThreadCount": 5,
  "PartitionSize": 10000,
  "ValidationOnly": false,
  "SkipLobColumns": false,
  },

有关更多信息,请参阅 AWS DMS 数据验证

在满负载和 CDC 阶段使用并行线程的任务

当您使用非关系型数据库(RDBMS)目标时,ParallelLoadThreads * ParallelLoadBufferSize 将决定线程数和向目标传输的数据大小。同样,ParallelApplyThreads * ParallelApplyBufferSize 将决定 CDC 阶段的线程数和传输数据的大小。AWS DMS 将从源中提取的数据保存在 ParallelLoadQueuesPerThread 和 ParallelApplyQueuesPerThread 中。调整这些设置时,请确保 AWS DMS 实例和目标具有处理工作负载的容量。

{
  "TargetMetadata": {
    "ParallelLoadThreads": 0,
    "ParallelLoadBufferSize": 0,
    "ParallelLoadQueuesPerThread": 0,
    "ParallelApplyThreads": 0,
    "ParallelApplyBufferSize": 0,
    "ParallelApplyQueuesPerThread": 0
  },

有关这些设置的详细信息,请参阅目标元数据任务设置

具有批量应用设置的任务

当您使用具有批量应用设置的 AWS DMS 任务时,请采取以下最佳实践:

  • 默认的批处理配置始终足以处理正常的工作负载。在批处理过程中,批处理的大小和应用于目标的频率由 BatchApplyTimeoutMin、BatchApplyTimeoutMax 和 BatchApplyMemoryLimit 设置来决定。这些设置共同作用以在批处理中应用更改。如果由于源上的工作负载繁重而需要对这些设置进行调整,请确保 AWS DMS 实例拥有足够的内存。否则,可能会发生 OOM 错误。
  • 请不要将 BatchApplyMemoryLimit 设置为超过复制实例内存的大小,否则可能会出现 OOM 错误。在设置 BatchApplyMemoryLimit 时,请注意与用于迁移的 AWS DMS 任务同时运行的其他任务。
  • 如果 BatchApplyPreserveTransaction = true 跨多个批处理过程,则长时间运行的事务将保留在内存中。这也可能会导致 OOM 错误,具体取决于下一部分的内存设置。
  • 使用 BatchSplitSize 设置来对每个批处理中可包含的更改数量进行设置,并对内存消耗进行限制:
{
  "TargetMetadata": {
    "BatchApplyEnabled": false,
  },
},
  "ChangeProcessingTuning": {
    "BatchApplyPreserveTransaction": true,
    "BatchApplyTimeoutMin": 1,
    "BatchApplyTimeoutMax": 30,
    "BatchApplyMemoryLimit": 500,
    "BatchSplitSize": 0,
  },

有关使用批处理应用模式的详细信息,请参阅更改处理调整设置

  • 在 CDC 期间,MinTransactionSize 可决定每个事务中更改发生的次数。复制实例上的事务大小由 MemoryLimitTotal 进行控制。当您运行多个需要大量内存的 CDC 任务时,请使用此设置。请务必根据每个任务的事务性工作负载来分配此设置。
  • 设置 MemoryKeepTime 以对源上长时间运行的事务所消耗的内存进行限制。或者,如果在源上运行大批 INSERT 或 UPDATE 语句,则延长此时间。延长此时间以保留净变更表中正在处理的变更。
  • 设置 StatementCacheSize 以对存储在复制实例上的预准备语句的数量进行控制。
  • 如果您的 AWS DMS 复制实例包含大量空闲内存,请对此示例中的设置进行调整。这意味着 AWS DMS 将在内存中处理工作负载,而非频繁地刷新到 AWS DMS 存储。

"ChangeProcessingTuning": {
    "MinTransactionSize": 1000,
    "CommitTimeout": 1,
    "MemoryLimitTotal": 1024,
    "MemoryKeepTime":
  60,
    "StatementCacheSize": 50
  },

有关这些设置的更多信息,请参阅更改处理调整设置

监控复制实例的内存使用情况

有几种方法可以监控复制实例的内存使用情况。要隔离消耗最多内存的单个任务,请按 MemoryUsage 对任务进行排序。要了解任务占用内存的原因,请比较 CDCChangesMemorySource 和 CDCChangesMemoryTarget,然后对相应的端点进行问题排查。

复制实例本身使用最少的内存来运行复制引擎。要检查其他 AWS DMS 任务是否可以在复制实例上运行,请查看 Amazon CloudWatch 中的 AvailableMemory 指标。然后,创建一个新任务以使用可用的 FreeMemory 量。运行 AWS DMS 任务时,请监控 FreeMemory 和 SwapUsage 以查看是否存在资源争用问题。有关更多信息,请参阅复制实例指标

避免内存问题

为了估计您的 AWS DMS 任务已使用的内存量,请在较低的环境(开发和暂存)中对具有相同配置的实例进行测试。

另外,在使用生产数据之前先执行概念验证迁移。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?