使用 MongoDB 做為 AWS DMS 的來源 - AWS Database Migration Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 MongoDB 做為 AWS DMS 的來源

如需有關 AWS DMS 支援作為來源之 MongoDB 版本的資訊,請參閱 資料來源 AWS DMS

請注意下列與 MongoDB 版本支援有關的事項:

  • AWS DMS 3.4.5 及更高版本支援 MongoDB 4.2 和 4.4 版。

  • AWS DMS 3.4.5 及更高版本以及 MongoDB 4.2 及更高版本支援分散式交易。如需 MongoDB 分散式交易的詳細資訊,請參閱 MongoDB 文件中的交易

  • AWS DMS 3.5.0 及更高版本的版本不支援 3.6 之前的 MongoDB 版本。

  • AWS DMS 3.5.1 及更高版本支援 MongoDB 5.0 版。

  • AWS DMS 3.5.2 及更高版本支援 MongoDB 6.0 版。

如果您不熟悉 MongoDB,請注意以下重要的 MongoDB 資料庫概念:

  • MongoDB 中的記錄是一份文件,是由欄位/值對組成的資料結構。欄位值可以包含其他文件、陣列和文件的陣列。文件約相當於關聯式資料庫資料表中的資料列。

  • MongoDB 的集合是一組文件,約相當於關聯式資料庫資料表。

  • MongoDB 的資料庫是一組集合,大致相當於關聯式資料庫中的結構描述。

  • MongoDB 文件在內部以壓縮格式存放為二進位 JSON (BSON) 檔案,此格式包含文件中每個欄位的類型。每份文件都有唯一的 ID。

使用 MongoDB 作為來源時,AWS DMS 支援兩種遷移模式:文件模式資料表模式。您可以指定建立 MongoDB 端點時要使用的遷移模式,或從 AWS DMS 主控台設定中繼資料模式參數。或者,您可以在端點組態面板中選取 _id as a separate column 核取記號按鈕,以建立第二個名為 _id 的資料欄,作為主索引鍵。

遷移模式的選擇會影響目標資料的結果格式,請見下文說明。

文件模型

在文件模式中,MongoDB 文件是依原狀遷移,這表示文件資料合併成目標資料表中的單一資料行,名為 _doc。當您使用 MongoDB 做為來源端點時,文件模式是預設設定。

例如,請考慮 MongoDB 集合中稱為 myCollection 的下列文件。

> db.myCollection.find() { "_id" : ObjectId("5a94815f40bd44d1b02bdfe0"), "a" : 1, "b" : 2, "c" : 3 } { "_id" : ObjectId("5a94815f40bd44d1b02bdfe1"), "a" : 4, "b" : 5, "c" : 6 }

使用文件模式將資料遷移到關聯式資料庫資料表之後,資料結構如下所示。MongoDB 文件中的資料欄位會合併到 _doc 資料行。

oid_id _doc
5a94815f40bd44d1b02bdfe0 { "a" : 1, "b" : 2, "c" : 3 }
5a94815f40bd44d1b02bdfe1 { "a" : 4, "b" : 5, "c" : 6 }

您可以選擇性地將額外連線屬性 extractDocID 設為 true,建立第二個資料行,命名為 "_id",作用如同主索引鍵。如果您要使用 CDC,請將此參數設為 true

在文件模式中,AWS DMS 會以這種方式管理集合的建立及重新命名:

  • 如果您將新的集合新增到來源資料庫,AWS DMS 會針對集合建立新的目標資料表,並複寫所有文件。

  • 如果您重新命名來源資料庫的現有集合,AWS DMS 不會重新命名目標資料表。

如果目標端點是 Amazon DocumentDB,請以文件模式執行遷移。

資料表模式

在資料表模式下,AWS DMS 會將 MongoDB 文件每個最上層的欄位轉換成目標資料表的資料行。如果欄位是巢狀結構,AWS DMS 會將巢狀值壓成為單一欄。AWS DMS 會接著將金鑰欄位和資料類型新增到目標資料庫資料表的欄位集。

針對每份 MongoDB 文件,AWS DMS 會將每個索引鍵和類型新增到目標資料表的資料行集。例如,使用資料表模式,AWS DMS 會將上述範例遷移到以下資料表。

oid_id a b c
5a94815f40bd44d1b02bdfe0 1 2 3
5a94815f40bd44d1b02bdfe1 4 5 6

巢狀值會扁平化到包含以點分隔之索引鍵名稱的資料行。資料行名為以句號分隔的扁平化欄位名稱串連。例如,AWS DMS 將有巢狀值 (例如 {"a" : {"b" : {"c": 1}}}) 欄位的 JSON 文件遷移到名為 a.b.c. 的資料行

若要建立目標欄,AWS DMS 會掃描指定數量的 MongoDB 文件和建立一組所有欄位及其類型。AWS DMS 會接著使用此設定來建立目標資料表的資料欄。如果您使用主控台建立或修改 MongoDB 來源端點,您可以指定要掃描的文件數量。預設值為 1000 份文件。如果您使用 AWS CLI,即可使用額外連線屬性 docsToInvestigate

在資料表模式中,AWS DMS 以這種方式管理文件和集合:

  • 當您將文件新增至現有的集合時,會複寫文件。如果欄位不存在於目標中,則不複寫這些欄位。

  • 當您更新文件時,會複寫更新的文件。如果欄位不存在於目標中,則不複寫這些欄位。

  • 完全支援刪除文件。

  • CDC 任務完成時,新增新的集合不會在目標上產生新的資料表。

  • 在變更資料擷取 (CDC) 階段中,AWS DMS 不支援重新命名集合。

使用 MongoDB 做為 AWS DMS 來源時需要的許可

針對 MongoDB 為來源的 AWS DMS 遷移,您可以建立有根權限的使用者帳戶,或僅有要遷移資料庫之許可的使用者。

以下程式碼建立的使用者會成為根帳戶。

use admin db.createUser( { user: "root", pwd: "password", roles: [ { role: "root", db: "admin" } ] } )

對於 MongoDB 3.x 來源,以下程式碼會在要遷移的資料庫上建立具有最基本權限的使用者。

use database_to_migrate db.createUser( { user: "dms-user", pwd: "password", roles: [ { role: "read", db: "local" }, "read"] })

對於 MongoDB 4.x 來源,下面的程式碼會建立具有最基本權限的使用者。

{ resource: { db: "", collection: "" }, actions: [ "find", "changeStream" ] }

例如,在「admin」資料庫中建立下列角色。

use admin db.createRole( { role: "changestreamrole", privileges: [ { resource: { db: "", collection: "" }, actions: [ "find","changeStream" ] } ], roles: [] } )

建立角色後,在要遷移的資料庫中建立使用者。

> use test > db.createUser( { user: "dms-user12345", pwd: "password", roles: [ { role: "changestreamrole", db: "admin" }, "read"] })

為 CDC 設定 MongoDB 複本集

若要在 MongoDB 使用持續複寫 (也就是 CDC),AWS DMS 需要存取 MongoDB 操作日誌 (oplog)。若要建立 oplog,您需要部署複本集 (若無)。如需詳細資訊,請參閱 MongoDB 文件

您可以使用 CDC 且以 MongoDB 複本集的主要或次要節點做為來源端點。

將獨立的執行個體轉換成複本集
  1. 使用命令列,連線到 mongo

    mongo localhost
  2. 停止 mongod 服務。

    service mongod stop
  3. 使用以下命令重新啟動 mongod

    mongod --replSet "rs0" --auth -port port_number
  4. 使用下列命令測試複本集連線:

    mongo -u root -p password --host rs0/localhost:port_number --authenticationDatabase "admin"

如果計劃執行文件模式遷移,請在建立 MongoDB 端點時選取選項 _id as a separate column。選取此選項會建立第二個資料行,名為 _id,做為主索引鍵。AWS DMS 需要這第二個資料行,以支援資料處理語言 (DML) 操作。

注意

AWS DMS 使用操作日誌 (oplog) 來擷取持續複寫期間的變更。如果 MongoDB 在 AWS DMS 讀取記錄之前從 oplog 中排清記錄,則任務將失敗。我們建議調整 oplog 的大小,以將變更保留至少 24 小時。

使用 MongoDB 做為 AWS DMS 來源時需要的安全需求

AWS DMS 支援兩種 MongoDB 身分驗證方法。這兩種身分驗證方法用於加密密碼,所以它們只能在 authType 參數設為 PASSWORD 時使用。

MongoDB 身分驗證方法如下所示:

  • MONGODB-CR – 適用於往前相容性

  • SCRAM-SHA-1 – 使用 MongoDB 3.x 和 4.0 版時的預設值

如不指定身份驗證方法,則 AWS DMS 會使用 MongoDB 來源版本的預設方法。

將 MongoDB 集合分段並平行遷移

為了改善遷移任務的效能,MongoDB 來源端點在資料表對應中支援兩個平行完全載入選項。

換句話說,您可以在 JSON 設定中為平行完全載入,使用自動分段或包含資料表對應的範圍分割,以平行遷移集合。您可以使用自動分段,指定 AWS DMS 將每個執行緒中要遷移的來源自動分段的條件。您可以透過範圍分段,告知 AWS DMS 在每個執行緒中 DMS 要遷移的每個區段的特定範圍。如需這些設定的詳細資訊,請參閱資料表和集合設定規則與操作

使用自動分段範圍平行遷移 MongoDB 資料庫

您可以指定為 AWS DMS 每個執行緒自動分割 (區段) 資料的條件,以平行方式遷移文件。特別是,您可以指定每個執行緒要遷移的文件數目。使用此方法時,AWS DMS 嘗試最佳化區段邊界,以獲得每個執行緒的最大效能。

您可以使用下列資料表對應中的資料表設定選項來指定分段條件。

資料表設定選項

描述

"type"

(必要) 設定 "partitions-auto" 以將 MongoDB 作為來源。

"number-of-partitions"

(選用) 用於遷移的分割 (區段) 總數。預設為 16。

"collection-count-from-metadata"

(選用) 如果此選項設為 true,則 AWS DMS 會使用估計的收集計數來決定分割的數目。如果此選項設為 false,則 AWS DMS 會使用實際的收集計數。預設值為 true

"max-records-skip-per-page"

(選用) 決定每個分割區的邊界時,要一次略過的記錄數目。AWS DMS 使用分頁跳過方法來確定分割的最小邊界。預設值為 10,000。

設定相對較大的值可能會導致游標逾時和任務失敗。設定相對較低的值會導致每頁操作數增加,而且完全載入速度較慢。

"batch-size"

(選用) 限制在單一批次中傳回的文件數。每個批次都需要往返伺服器。如果批次大小為零 (0),游標會使用伺服器定義的批次大小上限。預設值為 0。

下列範例顯示自動分段的資料表對應。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "admin", "table-name": "departments" }, "rule-action": "include", "filters": [] }, { "rule-type": "table-settings", "rule-id": "2", "rule-name": "2", "object-locator": { "schema-name": "admin", "table-name": "departments" }, "parallel-load": { "type": "partitions-auto", "number-of-partitions": 5, "collection-count-from-metadata": "true", "max-records-skip-per-page": 1000000, "batch-size": 50000 } } ] }

自動分段具有以下限制。每個區段的遷移會分別擷取集合計數和收集下限 _id。然後,其會使用分頁略過來計算該區段的最小邊界。

因此,請確保每個集合的最小 _id 值保持不變,直到集合中的所有區段邊界都經過計算為止。如果您在區段邊界計算期間變更集合的最小 _id 值,這可能會導致資料遺失或資料列重複錯誤。

使用範圍分段平行遷移 MongoDB 資料庫

您可以透過為執行緒中的每個區段指定範圍,以平行遷移文件。您可以使用這種方法,根據您選擇的每個執行緒的文件範圍,告訴 AWS DMS 在每個執行緒中要遷移的特定文件。

下圖顯示了具有七個項目的 MongoDB 集合,並將 _id 作為主索引鍵。

包含七個項目的 MongoDB 集合。

若要將集合分割成 AWS DMS 的三個特定區段並平行遷移,您可以將資料表對應規則新增至遷移任務。在以下 JSON 範例中會顯示此方法。

{ // Task table mappings: "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "testdatabase", "table-name": "testtable" }, "rule-action": "include" }, // "selection" :"rule-type" { "rule-type": "table-settings", "rule-id": "2", "rule-name": "2", "object-locator": { "schema-name": "testdatabase", "table-name": "testtable" }, "parallel-load": { "type": "ranges", "columns": [ "_id", "num" ], "boundaries": [ // First segment selects documents with _id less-than-or-equal-to 5f805c97873173399a278d79 // and num less-than-or-equal-to 2. [ "5f805c97873173399a278d79", "2" ], // Second segment selects documents with _id > 5f805c97873173399a278d79 and // _id less-than-or-equal-to 5f805cc5873173399a278d7c and // num > 2 and num less-than-or-equal-to 5. [ "5f805cc5873173399a278d7c", "5" ] // Third segment is implied and selects documents with _id > 5f805cc5873173399a278d7c. ] // :"boundaries" } // :"parallel-load" } // "table-settings" :"rule-type" ] // :"rules" } // :Task table mappings

該資料表對應定義會將來源集合分割為三個區段,並平行遷移。以下是分段邊界。

Data with _id less-than-or-equal-to "5f805c97873173399a278d79" and num less-than-or-equal-to 2 (2 records) Data with _id > "5f805c97873173399a278d79" and num > 2 and _id less-than-or-equal-to "5f805cc5873173399a278d7c" and num less-than-or-equal-to 5 (3 records) Data with _id > "5f805cc5873173399a278d7c" and num > 5 (2 records)

遷移任務完成後,您可以如下列範例所示,從任務日誌中確認資料表是否是平行載入。您也可以確認用來從來源資料表卸載每個區段的 MongoDB find 子句。

[TASK_MANAGER ] I: Start loading segment #1 of 3 of table 'testdatabase'.'testtable' (Id = 1) by subtask 1. Start load timestamp 0005B191D638FE86 (replicationtask_util.c:752) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is initialized. (mongodb_unload.c:157) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is: { "_id" : { "$lte" : { "$oid" : "5f805c97873173399a278d79" } }, "num" : { "$lte" : { "$numberInt" : "2" } } } (mongodb_unload.c:328) [SOURCE_UNLOAD ] I: Unload finished for segment #1 of segmented table 'testdatabase'.'testtable' (Id = 1). 2 rows sent. [TASK_MANAGER ] I: Start loading segment #1 of 3 of table 'testdatabase'.'testtable' (Id = 1) by subtask 1. Start load timestamp 0005B191D638FE86 (replicationtask_util.c:752) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is initialized. (mongodb_unload.c:157) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is: { "_id" : { "$lte" : { "$oid" : "5f805c97873173399a278d79" } }, "num" : { "$lte" : { "$numberInt" : "2" } } } (mongodb_unload.c:328) [SOURCE_UNLOAD ] I: Unload finished for segment #1 of segmented table 'testdatabase'.'testtable' (Id = 1). 2 rows sent. [TARGET_LOAD ] I: Load finished for segment #1 of segmented table 'testdatabase'.'testtable' (Id = 1). 1 rows received. 0 rows skipped. Volume transfered 480. [TASK_MANAGER ] I: Load finished for segment #1 of table 'testdatabase'.'testtable' (Id = 1) by subtask 1. 2 records transferred.

目前,AWS DMS 支援將下列 MongoDB 資料類型作為區段索引鍵資料欄:

  • Double

  • 字串

  • ObjectId

  • 32 位元整數

  • 64 位元整數

使用 MongoDB 作為 AWS DMS 的來源時,遷移多個資料庫

AWS DMS 3.4.5 版及更高版本支援在所有受支援的 MongoDB 版本的單一任務中遷移多個資料庫。如果您要遷移多個資料庫,請採取這些步驟:

  1. 當您建立 MongoDB 來源端點時,請執行以下其中一項:

    • 在 DMS 主控台的建立端點頁面上,確定端點組態下的資料庫名稱是空白的。

    • 使用 AWS CLI CreateEndpoint 命令,將 空白字串值指派給 MongoDBSettings 中的 DatabaseName 參數。

  2. 對於要從 MongoDB 來源遷移的每個資料庫,請在任務的資料表對應中指定資料庫名稱作為結構描述名稱。您可以使用主控台中的引導式輸入或直接在 JSON 中執行此操作。如需引導式輸入的詳細資訊,請參閱 從主控台指定資料表選取及轉換。如需有關 JSON 的詳細資訊,請參閱選取規則與動作

例如,您可以在下列指定 JSON 以遷移三個 MongoDB 資料庫。

範例 遷移結構描述中的所有資料表

下列 JSON 會將來源端點中 CustomersOrdersSuppliers 資料庫中的所有資料表遷移至目標端點。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "Customers", "table-name": "%" }, "rule-action": "include", "filters": [] }, { "rule-type": "selection", "rule-id": "2", "rule-name": "2", "object-locator": { "schema-name": "Orders", "table-name": "%" }, "rule-action": "include", "filters": [] }, { "rule-type": "selection", "rule-id": "3", "rule-name": "3", "object-locator": { "schema-name": "Inventory", "table-name": "%" }, "rule-action": "include", "filters": [] } ] }

使用 MongoDB 做為 AWS DMS 來源時的限制

使用 MongoDB 做為 AWS DMS 來源時,有下列限制:

  • 在資料表模式中,集合中的文件必須在相同欄位中用於值的資料類型中保持一致。例如,如果集合中的文件包含 '{ a:{ b:value ... }',則集合中參考該 a.b 欄位 value 的所有文件都必須在 value 使用相同的資料類型,無論其出現在集合中何位置為何。

  • _id 選項設為單獨的資料行,ID 字串不能超過 200 個字元。

  • 在資料表模式中,物件 ID 和陣列類型索引鍵都會轉換成以 oidarray 為前綴的資料行。

    這些資料行在內部使用加上前綴的名稱參考。如果您在 AWS DMS 中使用參考這些資料欄的轉換規則,您必須指定加上前綴的資料欄。例如,您指定 ${oid__id} 而不是 ${_id},或者 ${array__addresses} 而不是 ${_addresses}

  • 集合名稱和索引鍵名稱不能包含金錢符號 ($)。

  • AWS DMS 不支援以下集合:在具有 RDBMS 目標的資料表模式中,使用不同大小寫 (大寫、小寫) 的相同欄位。例如,AWS DMS 不支援具有名為 Field1field1 的兩個集合。

  • 資料表模式和文件模式都有前文討論的限制。

  • 使用自動分段進行平行遷移時具有前述限制。

  • MongoDB 不支援來源篩選條件。

  • AWS DMS 不支援巢狀層級大於 97 的文件。

  • AWS DMS 不支援 MongoDB 5.0 版的以下功能:

    • 即時重新分片

    • 用戶端欄位層級加密 (CSFLE)

    • 時間序列集合遷移

      注意

      在完全載入階段遷移的時間序列集合會轉換為 Amazon DocumentDB 中的一般集合,因為 DocumentDB 不支援時間序列集合。

使用 MongoDB 作為 AWS DMS 來源時的端點組態設定

當您設定 MongoDB 來源端點時,您可以使用 AWS DMS 主控台指定多個端點組態設定。

下表說明使用 MongoDB 資料庫作為 AWS DMS 來源時可用的組態設定。

設定 (屬性) 有效值 預設值和描述

身分驗證模式

"none"

"password"

"password" 會提示輸入使用者名稱和密碼。指定 "none" 時,不會使用使用者名稱和密碼參數。

驗證來源

有效的 MongoDB 資料庫名稱。

您要用來驗證憑證以進行驗證的 MongoDB 資料庫名稱。預設值為 "admin"

身分驗證機制

"default"

"mongodb_cr"

"scram_sha_1"

身分驗證機制。 "default" 值是 "scram_sha_1"。設定 authType"no" 時,不會使用此設定。

中繼資料模式

文件與資料表

選擇文件模式或資料表模式。

待掃描的文件數 (docsToInvestigate)

正整數會大於 0

僅在資料表模式中使用此選項來定義目標資料表定義。

_id as a separate column

方塊中的核取記號

選用的核取記號方塊,其會建立名為 _id 的第二個資料欄,作為主索引鍵。

socketTimeoutMS

NUMBER

僅限額外連線屬性 (ECA)。

此設定以毫秒為單位,並為 MongoDB 用戶端設定連線逾時。如果該值小於或等於零,則使用 MongoDB 用戶端預設值。

UseUpdateLookUp

boolean

true

false

當為 true 時,在 CDC 更新事件期間,AWS DMS 會將整個更新的文件複製到此目標。設為 false 時,AWS DMS 會使用 MongoDB 更新命令,僅更新目標上文件中修改的欄位。

ReplicateShardCollections

boolean

true

false

當為 true 時,AWS DMS 會將資料複寫至碎片集合。AWS DMS 只有在目標端點是 DocumentDB 彈性叢集時,才會使用此設定。

當此設定為 true 時,請注意以下事項:

  • 您必須將 TargetTablePrepMode 設為 nothing

  • AWS DMS 會自動將 useUpdateLookup 設為 false

如果您選擇將文件作為中繼資料模式,則可使用不同的選項。

如果目標端點是 DocumentDB,請確保在文件模式中執行遷移。此外,修改來源端點並選取選項 _id as separate column。如果來源 MongoDB 工作負載涉及交易,這是必要的先決條件。

MongoDB 的來源資料類型

使用 MongoDB 做為 AWS DMS 來源的資料遷移,支援大部分的 MongoDB 資料類型。在下表中,您可找到在使用 AWS DMS 和來自 AWS DMS 資料類型的預設映射時受支援的 MongoDB 來源資料類型。如需 MongoDB 資料類型的詳細資訊,請參閱 MongoDB 文件中的 BSON 類型

如需如何檢視從目標映射的資料類型資訊,請參閱您要使用的目標端點一節。

如需 AWS DMS 資料類型的詳細資訊,請參閱AWS Database Migration Service 的資料類型

MongoDB 資料類型

AWS DMS 資料類型

Boolean

Bool

二進位

BLOB

日期

日期

時間戳記

日期

Int

INT4

Long

INT8

Double

REAL8

字串 (UTF-8)

CLOB

陣列

CLOB

OID

字串

REGEX

CLOB

CODE

CLOB