AWS DMS 如何使用記憶體進行遷移?

2 分的閱讀內容
0

我有 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,
  }

如需詳細資訊,請參閱在 AWS DMS 任務中設定來源資料庫的 LOB 支援

具有 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 階段具有平行執行緒的任務

當您使用 non-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 任務使用了多少記憶體,請在較低的環境 (開發和模擬) 中使用相同的組態測試執行個體。

此外,在處理生產資料之前,請先執行概念驗證遷移。


相關資訊

為您的遷移選擇正確的 AWS DMS 複寫執行個體

為複寫執行個體選擇最佳大小

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