使用 Amazon DocumentDB(與 MongoDB 兼容性)作為源 AWS DMS - AWS Database Migration Service

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

使用 Amazon DocumentDB(與 MongoDB 兼容性)作為源 AWS DMS

如需 AWS DMS 支援作為來源之 Amazon DocumentDB (with MongoDB compatibility) 版本的相關資訊,請參閱 資料來源 AWS DMS

使用 Amazon DocumentDB 作為來源,您可以將資料從 Amazon DocumentDB 叢集遷移到另一個 Amazon DocumentDB 叢集。您也可以將資料從 Amazon DocumentDB 叢集遷移到受支援的其他目標端點之一。 AWS DMS

如果您剛開始使用 Amazon DocumentDB,請注意以下 Amazon DocumentDB 資料庫的重要概念:

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

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

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

AWS DMS 使用 Amazon DocumentDB 做為來源、文件模式和表格模式時,支援兩種遷移模式。您可以在主控台中使用中繼資料模式選項或額外連線屬性在 AWS DMS 主控台中建立 Amazon DocumentDB 來源端點時指定遷移模式nestingLevel您可以在以下找到說明,了解遷移模式的選擇會如何影響目標資料的結果格式。

文件模型

文件模式中,JSON 文件會依原狀遷移。這意味著文件資料會合併為兩個項目之一。當您使用關聯式資料庫作為目標時,資料是在目標資料表中名為 _doc 的單一資料欄。當您使用非關聯式資料庫作為目標時,資料是單一 JSON 文件。文件模式是預設模式,我們建議您在遷移至 Amazon DocumentDB 目標時使用此模式。

例如,請考慮 Amazon DocumentDB 集合中名為 myCollection 的下列文件。

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

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

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

您可以選擇性地將額外連線屬性 extractDocID 設為 true,以建立第二個名為 "_id" 的資料欄,其作用如同主索引鍵。除非您使用 Amazon DocumentDB 作為目標,否則如果您要使用變更資料擷取 (CDC),請將此參數設定為 true

注意

如果您將新集合新增至來源資料庫,請 AWS DMS 建立集合的新目標資料表,並複寫任何文件。

資料表模式

資料表模式下,AWS DMS 會將 Amazon DocumentDB 文件中每個最上層的欄位轉換成目標資料表的資料欄。如果某個欄位是巢狀的,則會將巢狀值 AWS DMS 平面化為單一欄。 AWS DMS 然後將索引鍵欄位和資料類型新增至目標資料表的欄集。

對於每個 Amazon DocumentDB 文件, AWS DMS 將每個索引鍵和類型新增至目標資料表的資料行集。例如,使用表格模式,將上一個範例 AWS DMS 移轉至下表中。

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

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

若要建立目標欄,請 AWS DMS 掃描指定數量的 Amazon DocumentDB 文件,並建立一組所有欄位及其類型。 AWS DMS 然後使用此集合來創建目標表的列。如果使用主控台建立或修改 Amazon DocumentDB 來源端點,您可以指定待掃描的文件數。預設值為 1,000 份文件。如果您使用 AWS CLI,則可以使用額外的連接屬性docsToInvestigate

在表格模式下,像這樣 AWS DMS 管理文檔和集合:

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

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

  • 完全支援刪除文件。

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

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

設定許可以使用 Amazon DocumentDB 作為來源

使用 Amazon DocumentDB 來源進行 AWS DMS 移轉時,您可以建立具有根權限的使用者帳戶。或者,您可以建立使用者,所含許可僅限於要遷移的資料庫。

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

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

若是 Amazon DocumentDB 3.6,以下程式碼會在要遷移的資料庫建立擁有最基本權限的使用者。

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

對於 Amazon DocumentDB 4.0 及更高版本, AWS DMS 會使用部署範圍內的變更串流。在這裡,下面的程式碼會建立具有最基本權限的使用者。

db.createUser( { user: "dms-user", pwd: "password", roles: [ { role: "readAnyDatabase", db: "admin" }] })

設定 Amazon DocumentDB 叢集的 CDC

若要將持續複寫或 CDC 與 Amazon DocumentDB 搭配使用, AWS DMS 需要存取 Amazon DocumentDB 叢集的變更串流。如需說明,了解叢集集合和資料庫中按時間順序排序的更新事件,請參閱《Amazon DocumentDB 開發人員指南》中的使用變更串流

使用 MongoDB Shell 向 Amazon DocumentDB 叢集進行驗證。然後執行下列命令以啟用變更串流。

db.adminCommand({modifyChangeStreams: 1, database: "DB_NAME", collection: "", enable: true});

此方法可為資料庫中的所有集合啟用變更串流。啟用變更串流後,您可以建立移轉現有資料的移轉任務,並同時複寫進行中的變更。 AWS DMS 即使載入大量資料後,仍會繼續擷取並套用變更。來源和目標資料庫最終將保持同步,盡可能地縮短停機時間。

注意

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

使用 TLS 連接到 Amazon DocumentDB

依預設,新建立的 Amazon DocumentDB 叢集僅接受使用 Transport Layer Security (TLS) 的安全連線。啟用 TLS 時,每個 Amazon DocumentDB 連線都需要公有金鑰。

您可以從 AWS託管的 Amazon S3 儲存貯體下載檔rds-combined-ca-bundle.pem案,以擷取 Amazon 文件資料庫的公開金鑰。如需下載此檔案的相關資訊,請參閱《Amazon DocumentDB開發人員指南》中的使用 TLS 加密連線

下載rds-combined-ca-bundle.pem檔案後,您可以將其包含的公開金鑰匯入其中 AWS DMS。下列步驟說明如何執行這項操作。

使用 AWS DMS 主控台匯入公開金鑰
  1. 登入 AWS Management Console 並選擇 AWS DMS。

  2. 在導覽窗格中,選擇 Certificates (憑證)

  3. 選擇 Import certificate (匯入憑證)。隨即顯示匯入新的 CA 憑證頁面。

  4. 憑證組態區段中,執行以下其中一項操作:

    • 針對憑證識別碼,輸入憑證的唯一名稱,例如 docdb-cert

    • 選擇選擇檔案,瀏覽至您儲存 rds-combined-ca-bundle.pem 檔案的位置,然後加以選取。

  5. 選擇 Add new CA certificate (新增憑證授權機構憑證)

AWS CLI 下列範例會使用 AWS DMS import-certificate命令來匯入公開金鑰rds-combined-ca-bundle.pem檔案。

aws dms import-certificate \ --certificate-identifier docdb-cert \ --certificate-pem file://./rds-combined-ca-bundle.pem

建立 Amazon DocumentDB 來源端點

您可以使用主控台或 AWS CLI建立 Amazon DocumentDB 來源端點。使用主控台執行以下程序。

使用主控台設定 Amazon DocumentDB 來源端點 AWS DMS
  1. 登入 AWS Management Console 並選擇 AWS DMS。

  2. 在導覽窗格中選擇端點,然後選擇建立端點

  3. 對於端點識別碼,請提供可協助您輕鬆識別的名稱,例如 docdb-source

  4. 針對來源引擎,請選擇 Amazon DocumentDB (with MongoDB compatibility)

  5. 伺服器名稱中,輸入 Amazon DocumentDB 資料庫端點所在的伺服器名稱。例如,您可以輸入 Amazon EC2 執行個體的公有 DNS 名稱,例如 democluster.cluster-cjf6q8nxfefi.us-east-2.docdb.amazonaws.com

  6. 針對連接埠,輸入 27017。

  7. 對於 SSL mode (SSL 模式),請選擇 verify-full (完整驗證)。如果您已在 Amazon DocumentDB 叢集上停用 SSL,則可以略過此步驟。

  8. 對於 CA 憑證,請選擇 Amazon DocumentDB 憑證 (rds-combined-ca-bundle.pem)。如需新增此憑證的指示,請參閱使用 TLS 連接到 Amazon DocumentDB

  9. 針對資料庫名稱,輸入要遷移的資料庫名稱。

使用 CLI 執行以下程序。

使用設定 Amazon DocumentDB 來源端點 AWS CLI
  • 執行下列 AWS DMS create-endpoint命令以設定 Amazon DocumentDB 來源端點,並以您自己的值取代預留位置。

    aws dms create-endpoint \ --endpoint-identifier a_memorable_name \ --endpoint-type source \ --engine-name docdb \ --username value \ --password value \ --server-name servername_where_database_endpoint_resides \ --port 27017 \ --database-name name_of_endpoint_database

將 Amazon DocumentDB 集合分段並平行遷移

為了改善遷移任務的效能,Amazon DocumentDB 來源端點在資料表對應中支援兩個平行完全載入功能選項。換句話說,您可以在 JSON 設定中為平行完全載入,使用自動分段或包含資料表對應的範圍分割選項,以平行遷移集合。自動分段選項可讓您指定自動區段每個執 AWS DMS 行緒中移轉來源的準則。範圍分割選項可讓您告知 DMS AWS DMS 在每個執行緒中遷移的每個區段的特定範圍。如需這些設定的詳細資訊,請參閱資料表和集合設定規則與操作

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

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

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

資料表設定選項

描述

"type"

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

"number-of-partitions"

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

"collection-count-from-metadata"

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

"max-records-skip-per-page"

(選擇性) 決定每個分割區的邊界時,要一次略過的記錄數目。 AWS DMS 使用分頁跳過方法來確定分區的最小邊界。預設值為 10000。設定相對較大的值可能會導致游標逾時和任務失敗。設定相對較低的值會導致每頁操作數增加,而且完全載入速度較慢。

"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 值,這可能會導致資料遺失或重複的資料列錯誤。

使用特定區段範圍平行遷移 Amazon DocumentDB 資料庫

下列範例顯示具有七個項目的 Amazon DocumentDB 集合,並將 _id 作為主索引鍵。

具有七個項目的 Amazon DocumentDB 集合。

若要將集合分割成三個區段並平行遷移,您可以如下列 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 less-than-or-equal-to "5f805cc5873173399a278d7c" and num less-than-or-equal-to 5 and not in (_id less-than-or-equal-to "5f805c97873173399a278d79" and num less-than-or-equal-to 2) (3 records) Data not in (_id less-than-or-equal-to "5f805cc5873173399a278d7c" and num less-than-or-equal-to 5) (2 records)

遷移任務完成後,您可以如下列範例所示,從任務日誌中確認資料表是否是平行載入。您也可以驗證用來從來源資料表卸載每個區段的 Amazon DocumentDB 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 支援下列 Amazon 文件資料庫資料類型做為區段索引鍵資料行:

  • Double

  • 字串

  • ObjectId

  • 32 位元整數

  • 64 位元整數

使用 Amazon DocumentDB 作為來源時遷移多個資料庫 AWS DMS

AWS DMS 版本 3.4.5 及更高版本支援在單一任務中移轉多個資料庫,僅適用於 Amazon DocumentDB 4.0 及更高版本。若想要遷移多個資料庫,請執行以下作業:

  1. 當您建立 Amazon DocumentDB 來源端點時:

    • 在的中 AWS Management Console AWS DMS,將 [建立端點] 頁面上 [端點組態] 下的 [資料庫名稱] 保留空白。

    • 在 AWS Command Line Interface (AWS CLI) 中,將空字串值指派給您為動作指定的文件資料庫設定中的DatabaseName參數。CreateEndpoint

  2. 對於要從此 Amazon DocumentDB 來源端點遷移的每個資料庫,請使用主控台中的引導式輸入或直接使用 JSON,將每個資料庫的名稱指定為任務資料表對應的結構描述名稱。如需引導式輸入的相關資訊,請參閱 從主控台指定資料表選取及轉換的描述。如需 JSON 的相關資訊,請參閱選取規則與動作

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

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

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

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

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

以下是使用 Amazon DocumentDB 做為來源時的限制: AWS DMS

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

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

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

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

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

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

  • Amazon DocumentDB (MongoDB compatible) 來源不支援使用特定時間戳記作為變更資料擷取 (CDC) 的起始位置。進行中複寫任務會開始擷取變更 (不論時間戳記為何)。

  • 當使用 DocumentDB (MongoDB compatible) 作為來源,DMS 可以處理最多每秒 250 則記錄。

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

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

  • AWS DMS 在彈性叢集模式下,不支援 DocumentDB 的 CDC (變更資料擷取) 複寫做為來源。

在將 Amazon DocumentDB 作為來源的情況下使用端點設定

您可以使用端點設定來設定 Amazon DocumentDB 來源資料表,類似於使用額外的連線屬性。您可以在使用 AWS DMS 主控台建立來源端點時指定設定,或使用中的create-endpoint命令以 --doc-db-settings '{"EndpointSetting": "value", ...}' JSON 語法來指定設定。AWS CLI

下列資料表顯示您可以在將 Amazon DocumentDB 作為來源搭配使用的端點設定。

屬性名稱 有效值 預設值和描述

NestingLevel

"none"

"one"

"none":指定 "none" 使用文件模式。指定 "one" 使用資料表模式。

ExtractDocID

boolean

true

false

false:將 NestingLevel 設為 "none" 時,請使用此屬性。

如果目標資料庫是 Amazon DocumentDB,請設定 '{"ExtractDocID": true}'

DocsToInvestigate

正整數會大於 0

1000:將 NestingLevel 設為 "one" 時,請使用此屬性。

ReplicateShardCollections

boolean

true

false

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

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

  • 您必須將 TargetTablePrepMode 設為 nothing

  • AWS DMS 自動設定useUpdateLookupfalse

Amazon DocumentDB 的來源資料類型

您可以在下表中找到在使用 AWS DMS時支援的 Amazon DocumentDB 來源資料類型。您也可以從此表中的 AWS DMS 數據類型中找到默認映射。如需資料類型的詳細資訊,請參閱 MongoDB 文件中的 BSON 類型

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

如需有關資 AWS DMS 料類型的其他資訊,請參閱AWS Database Migration Service 的資料類型

Amazon DocumentDB 資料類型

AWS DMS 資料類型

Boolean

Bool

二進位

BLOB

日期

日期

時間戳記

日期

Int

INT4

Long

INT8

Double

REAL8

字串 (UTF-8)

CLOB

陣列

CLOB

OID

字串