本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用Amazon DocumentDB(with MongoDB)作为来源Amazon DMS
Amazon DMS支持 Amazon DocumentDB(兼容 MongoDB)版本 3.6 和 4.0 作为数据库源。使用 Amazon DocumentDB 作为来源,您可以将数据从一个 Amazon DocumentDB 集群迁移到另一个Amazon DocumentDB umentD 您还可以将数据从 Amazon DocumentDB 集群迁移到支持的其他目标终端节点之一Amazon DMS。
如果您不熟悉 Amazon DocumentDB,请注意Amazon DocumentDB 数据库的以下重要概念:
-
Amazon DocumentDB 中的记录是一个文档,一种由字段和值对组成的数据结构。字段值可以包含其他文档、数组和文档数组。文档大致相当于关系数据库表中的行。
-
Amazon DocumentDB 中的集合是一组文档,大致等同于关系数据库表。
-
Amazon DocumentDB 中的数据库是一组集合,大致等同于关系数据库中的架构。
Amazon DMS使用 Amazon DocumentDB 作为源时支持两种迁移模式:文档模式和表模式。在Amazon 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"
的列作为主键。如果您要使用变更数据捕获 (CDC),请在使用 Amazon DocumentDB 作为目标时将true
此参数设置为 exception。注意
如果您将一个新集合添加到源数据库,则 Amazon DMS 将为该集合创建一个新的目标表并复制所有文档。
- 表模式
-
在表模式下,Amazon DMS将 Amazon DocumentDB 文档中的每个顶级字段转换为目标表中的一列。如果已嵌套字段,则 Amazon DMS 会将嵌套值平展到单个列中。随后,Amazon DMS 将关键字段和数据类型添加到目标表的列集。
对于每个 Amazon DocumentDB 文档,Amazon DMS将每个键和类型添加到目标表的列集中。例如,通过使用表模式,Amazon DMS 将上一个示例迁移到下表中。
oid_id a b c 5a94815f40bd44d1b02bdfe0 1 2 3 5a94815f40bd44d1b02bdfe1 4 5 6 嵌套值平展到包含键名 (以句点分隔) 的列中。该列是使用由句点分隔的扁平字段名称的串联命名的。例如,Amazon DMS 将具有嵌套值字段(如
{"a" : {"b" : {"c": 1}}}
)的 JSON 文档迁移到名为a.b.c.
的列中要创建目标列,请Amazon DMS扫描指定数量的 Amazon DocumentDB 文档,然后创建一组所有字段及其类型。 Amazon DMS然后使用此集创建目标表的列。如果您使用控制台创建或修改您的 Amazon DocumentDB 源终端节点,则可以指定要扫描的文档数量。默认值为 1,000 个文档。如果您使用Amazon CLI,则可以使用额外的连接属性
docsToInvestigate
。在表模式中,Amazon DMS 按如下方式管理文档和集合:
-
当您将一个文档添加到现有集合时,将复制该文档。如果某些字段在目标中不存在,则不会复制这些字段。
-
当您更新文档时,复制更新后的文档。如果某些字段在目标中不存在,则不会复制这些字段。
-
完全支持文档删除。
-
在 CDC 任务期间,添加新集合不会导致在目标上生成新的表。
-
不支持重命名集合。
-
主题
设置使用Amazon DocumentDB 作为源的权限
使用 Amazon DocumentDB 源进行Amazon 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 及更高版本,Amazon DMS使用部署范围的变更流。在这里,以下代码创建了一个具有最低权限的用户。
db.createUser( { user: "dms-user", pwd: "password", roles: [ { role: "readAnyDatabase", db: "admin" }] })
为亚马逊 DocumentDB 集群配置 CDC
要在 Amazon DocumentDB 中使用持续复制或 CDC,Amazon DMS需要访问Amazon DocumentDB 集群的变更流。有关集群集合和数据库中按时间顺序排列的更新事件的描述,请参阅 Amazon DocumentDB 开发者指南中的使用更改流。
使用 MongoDB 外壳对您的亚马逊 DocumentDB 集群进行身份验 然后运行以下命令以启用更改流。
db.adminCommand({modifyChangeStreams: 1, database: "DB_NAME", collection: "", enable: true});
这种方法为数据库中的所有集合启用变更流。启用变更流后,您可以创建迁移任务,该任务可以迁移现有数据,同时复制正在进行的更改。 Amazon DMS即使在加载批量数据之后,仍能继续捕获和应用更改。最终,源数据库和目标数据库会同步,从而最大限度地减少迁移的停机时间。
使用 TLS 连接Amazon DocumentDB
默认情况下,新创建的 Amazon DocumentDB 集群仅接受使用传输层安全性协议(TLS)的安全性协议。启用 TLS 后,与 Amazon DocumentDB 的每个连接都需要一个公钥。
您可以通过rds-combined-ca-bundle.pem
从Amazon托管的 Amazon S3 存储桶下载文件来检索 Amazon DocumentDB 的公钥。有关下载此文件的更多信息,请参阅 Amazon DocumentDB 开发者指南中的使用 TLS 加密连接。
下载rds-combined-ca-bundle.pem
文件后,可以将其包含的公钥导入其中Amazon DMS。以下步骤介绍了如何完成此操作。
使用Amazon DMS控制台导入您的公钥
-
登录 Amazon Web Services Management Console并选择 Amazon DMS。
-
在导航窗格中,选择证书。
-
选择 Import certificate (导入证书)。将出现 “导入新 CA 证书” 页面。
-
在 “证书配置” 部分中,执行以下操作之一:
-
对于证书标识符,输入证书的唯一名称,例如
docdb-cert
。 -
选择 “选择文件”,导航到保存
rds-combined-ca-bundle.pem
文件的位置,然后将其选中。
-
-
选择 Add new CA certificate (添加新 CA 证书)。
Amazon CLI以下示例使用Amazon DMSimport-certificate
命令导入公钥rds-combined-ca-bundle.pem
文件。
aws dms import-certificate \ --certificate-identifier docdb-cert \ --certificate-pem file://./rds-combined-ca-bundle.pem
创建Amazon DocumentDB 源终端节点
您可以使用控制台或创建 Amazon DocumentDB 源端点Amazon CLI。在控制台上使用以下步骤。
使用Amazon DMS控制台配置 Amazon DocumentDB 源终端节点
-
登录 Amazon Web Services Management Console并选择 Amazon DMS。
-
从导航窗格中选择终端节点,然后选择创建终端节点。
-
对于端点标识符,请提供一个可帮助您轻松识别它的名称,例如
docdb-source
。 -
对于源引擎,选择 Amazon DocumentDB(与 MongoDB co ment
-
在服务器名称中,输入您的 Amazon DocumentDB 数据库终端节点所在的服务器的名称。例如,您可以输入您的 Amazon EC2 实例的公有 DNS 名称,例如
democluster.cluster-cjf6q8nxfefi.us-east-2.docdb.amazonaws.com
。 -
对于端口,输入 27017。
-
对于 SSL mode (SSL 模式),请选择 verify-full。如果您已在 Amazon DocumentDB 集群上禁用 SSL,则可以跳过此步骤。
-
对于 CA 证书,请选择亚马逊 DocumentDB 证书
rds-combined-ca-bundle.pem
。有关添加此证书的说明,请参阅使用 TLS 连接Amazon DocumentDB。 -
对于 DB 名称,输入要迁移的数据库的名称。
在 CLI 中使用以下步骤。
要使用 Amazon DocumentDB 源终端节点,Amazon CLI
-
运行以下Amazon DMS
create-endpoint
命令配置 Amazon DocumentDB 源终端节点,用您自己的值替换占位符。aws dms create-endpoint \ --endpoint-identifier
a_memorable_name
\ --endpoint-type source \ --engine-name docdb \ --usernamevalue
\ --passwordvalue
\ --server-nameservername_where_database_endpoint_resides
\ --port 27017 \ --database-namename_of_endpoint_database
对亚马逊 DocumentDB 集合进行分段parallel 迁移
为了提高迁移任务的性能,Amazon DocumentDB 源终端节点支持表映射中parallel 满载功能的两个选项。换句话说,您可以在 JSON 设置中使用表映射的自动分段或范围分段选项并parallel 迁移集合,以实现parallel 满负载。自动分段选项允许您指定标准,Amazon DMS以便在每个线程中自动对迁移源进行细分。范围分段选项允许您告知每个分段Amazon DMS的具体范围,以便 DMS 在每个线程中迁移。有关这些设置的更多信息,请参阅表和集合设置规则和操作。
使用自动分段范围parallel 迁移 Amazon DocumentDB 数据库
您可以通过指定自动对每个线程的数据进行分区(分段)的标准,尤其是每个线程Amazon DMS要迁移的文档数量,来parallel 迁移文档。使用这种方法,Amazon DMS尝试优化分段边界,以最大限度地提高每个线程的性能。
您可以使用表格映射中的表格设置选项指定分段标准:
表格设置选项 |
描述 |
---|---|
|
(必需)将 |
|
(可选)用于迁移的分区(分段)总数。默认值为 16。 |
|
(可选)如果设置为 |
|
(可选)确定每个分区的边界时要同时跳过的记录数。 Amazon DMS使用分页跳过方法来确定分区的最小边界。默认值为 10000。设置相对较大的值可能会导致光标超时和任务失败。设置相对较低的值会导致每页的操作次数更多,满载速度也会变慢。 |
|
(可选)限制一批中返回的文档数量。每批都需要往返服务器。如果批次大小为零 (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
值,这可能会导致数据丢失或重复行错误。
使用特定区段范围parallel 迁移 Amazon DocumentDB 数据库
以下示例显示了一个包含七个项目并_id
作为主键的 Amazon DocumentDB 集合。

要将集合拆分为三个分段并parallel 迁移,您可以将表映射规则添加到迁移任务中,如以下 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
该表映射定义将源集合分成三个段并parallel 迁移。以下是分段边界。
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)
迁移任务完成后,您可以从任务日志中验证表是parallel 加载的,如以下示例所示。您还可以验证用于从源表中卸载每个分段的 Amazon DocumentDBfind
子句。
[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.
目前,Amazon DMS支持以下 Amazon DocumentDB 数据类型作为区段键列:
-
Double
-
字符串
-
ObjectId
-
32 位整数
-
64 位整数
使用 Amazon DocumentDB 作为源时迁移多个数据库Amazon DMS
Amazon DMS版本 3.4.5 及更高版本仅支持在单个任务中迁移多个数据库,仅适用于 Amazon DocumentDB 版本 4.0 及更高版本。如果要迁移多个数据库,请执行以下操作:
-
创建 Amazon DocumentDB 源终端节点时:
-
在表单中Amazon Web Services Management ConsoleAmazon DMS,在 “创建终端节点” 页面的 “端点配置” 下将数据库名称留空。
-
在Amazon Command Line Interface (Amazon CLI) 中,为您在 Document DbSettings 中为该CreateEndpoint操作指定的DatabaseName参数分配一个空字符串值。
-
-
对于要从此 Amazon DocumentDB 源终端节点迁移的每个数据库,使用控制台中的引导输入或直接在 JSON 中将每个数据库的名称指定为任务表映射中的架构名称。有关引导式输入的更多信息,请参阅的描述 从控制台指定表格选择和转换规则。有关 JSon 的更多信息,请参阅选择规则和操作。
例如,您可以指定以下 JSON 来迁移三个 Amazon DocumentDB 数据库。
例 迁移架构中的所有表
以下 JSON 会将源端点Customers
中的Orders
、和Suppliers
数据库中的所有表迁移到目标终端节点。
{ "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 作为来源时的限制Amazon DMS
以下是使用 Amazon DocumentDB 作为来源时的限制Amazon DMS:
-
当
_id
选项设置为单独一列时,ID 字符串不能超过 200 个字符。 -
在表模式下,对象 ID 和数组类型键将转换为具有
oid
和array
前缀的列。将使用具有前缀的名称在内部引用这些列。如果您在Amazon DMS引用这些列时使用转换规则,请务必指定前缀列。例如,指定
${oid__id}
与否${_id}
,或${array__addresses}
不指定${_addresses}
。 -
集合名称和键名不能包含美元符号 ($)。
-
表模式和文档模式具有前面讨论的限制。
-
使用自动分段进行parallel 迁移具有前面描述的局限性。
-
Amazon DocumentDB(兼容 MongoDB)源不支持使用特定的时间戳作为变更数据捕获 (CDC) 的起始位置。无论时间戳如何,正在进行的复制任务都会开始捕获更改。
-
使用 DocumentDB(兼容 MongoDB)作为源时,DMS 每秒最多可以处理 250 条记录。
-
Amazon DMS不支持嵌套级别大于 97 的文档。
-
DocumentDB 不支持源过滤器。
使用以 Amazon DocumentDB 作为源的终端节点设置
您可以使用终端节点设置来配置 Amazon DocumentDB 源数据库,就像使用额外的连接属性一样。您可以使用Amazon DMS控制台或使用中的create-endpoint
命令使用--doc-db-settings '{"
JSON 语法创建源终端节点时指定设置。Amazon CLIEndpointSetting"
:
"value"
, ...
}'
下表显示了您可以将 Amazon DocumentDB 作为源使用。
属性名称 | 有效值 | 默认值和描述 |
---|---|---|
|
|
|
|
|
如果您的目标数据库是 Amazon DocumentDB,请设置 |
|
大于 |
|
注意
如果目标终端节点是 Amazon DocumentDB,请在文档模式下运行迁移,并设置额外的连接属性"ExtractDocID": true
。要设置终端节点设置"ExtractDocID": true
,请修改您的源终端节点并选中 _id 复选框作为单独的列。
Amazon DocumentDB 的源数据类型
在下表中,您可以找到使用时支持的 Amazon DocumentDB 源数据类型Amazon DMS。您还可以在此表中找到Amazon DMS数据类型的默认映射。有关数据类型的更多信息,请参阅 MongoDB 文档中的 BSon 类型
有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。
有关 Amazon DMS 数据类型的其他信息,请参阅DatAmazon abase Migration Service 数据类型。
Amazon DocumentDB C 数据类型 |
Amazon DMS 数据类型 |
---|---|
布尔值 |
Bool |
二进制 |
BLOB |
日期 |
日期 |
时间戳 |
日期 |
Int |
INT4 |
长整型 |
INT8 |
Double |
REAL8 |
字符串 (UTF-8) |
CLOB |
数组 |
CLOB |
OID |
字符串 |