将 MongoDB 作为 Amazon DMS 源
有关 Amazon DMS 支持作为源的 MongoDB 版本的信息,请参阅 Amazon DMS 的源。
请注意以下有关 MongoDB 版本支持的信息:
Amazon DMS 版本 3.4.5 及更高版本支持 MongoDB 版本 4.2 和 4.4。
Amazon DMS 版本 3.4.5 及更高版本支持 MongoDB 4.2 及更高版本和分布式事务。有关 MongoDB 分布式事务的更多信息,请参阅 MongoDB 文档
中的事务 。 Amazon DMS 版本 3.5.0 及更高版本不支持 3.6 版本之前的 MongoDB。
Amazon DMS 版本 3.5.1 及更高版本支持 MongoDB 版本 5.0。
Amazon DMS 版本 3.5.2 及更高版本支持 MongoDB 版本 6.0。
-
Amazon DMS 版本 3.5.4 及更高版本支持 MongoDB 版本 7.0。
如果您是初次使用 MongoDB,请注意以下关于 MongoDB 数据库的重要概念:
-
MongoDB 中的记录是一个文档,它是由字段和值对构成的数据结构。字段值可以包含其他文档、数组和文档数组。文档大致相当于关系数据库表中的行。
-
MongoDB 中的集合 是一组文档,并且大致相当于关系数据库表。
-
MongoDB 中的数据库是一组集合,并且大致相当于关系数据库中的架构。
-
在内部,MongoDB 文档以压缩格式存储为二进制 JSON (BSON) 文件,包含文档中每个字段的类型。每个文档都有唯一的 ID。
将 MongoDB 作为源时,Amazon DMS 支持两种迁移模式:Document 模式或表模式。您可以在创建 MongoDB 端点时指定要使用的迁移模式,或者通过从 Amazon DMS 控制台设置元数据模式参数来指定。或者,您可以创建名为 _id 的第二列,通过在端点配置面板中选中将 _id 作为单独的列复选标记,将其作为主键。
您选择的迁移模式将影响目标数据的结果格式,如下所述。
- 文档模式
-
在文档模式下,MongoDB 文档按“原样”迁移,这意味着文档数据将并入目标表中一个名为
_doc的列中。文档模式是您将 MongoDB 作为源终端节点时的默认设置。例如,请考虑名为 myCollection 的 MongoDB 集合中的以下文档。
> 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。在文档模式中,Amazon DMS 按如下方式管理集合的创建和重命名:
-
如果您将一个新集合添加到源数据库,则 Amazon DMS 将为该集合创建一个新的目标表并复制所有文档。
-
如果您重命名源数据库上的现有集合,Amazon DMS 不会重命名目标表。
如果目标端点是 Amazon DocumentDB,请在文档模式下运行迁移。
-
- 表模式
-
在表模式中,Amazon DMS 将 MongoDB 文档中的每个顶级字段转换为目标表中的一个列。如果已嵌套字段,则 Amazon DMS 会将嵌套值平展到单个列中。随后,Amazon DMS 将关键字段和数据类型添加到目标表的列集。
对于每个 MongoDB 文档,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 将扫描指定数量的 MongoDB 文档并创建包含所有字段及其类型的集。随后,Amazon DMS 使用此集创建目标表的列。如果您使用 控制台创建或修改 MongoDB 源终端节点,则可指定要扫描的文档的数量。默认值为 1000 个文档。如果您使用 Amazon CLI,则可使用额外连接属性
docsToInvestigate。在表模式中,Amazon DMS 按如下方式管理文档和集合:
-
当您将一个文档添加到现有集合时,将复制该文档。如果某些字段在目标中不存在,则不会复制这些字段。
-
当您更新文档时,复制更新后的文档。如果某些字段在目标中不存在,则不会复制这些字段。
-
完全支持文档删除。
-
在 CDC 任务期间,添加新集合不会导致在目标上生成新的表。
-
在更改数据捕获(CDC)阶段,Amazon DMS 不支持对集合重命名。
-
主题
将 MongoDB 作为 Amazon DMS 的源时所需的权限
对于使用 MongoDB 源的 Amazon DMS 迁移,您可以创建具有根权限的用户账户,也可以仅在要迁移的数据库上创建具有权限的用户。
以下代码创建将作为根账户的用户。
use admin db.createUser( { user: "root", pwd: "password", roles: [ { role: "root", db: "admin" } ] } )
对于 MongoDB 3.x 源,以下代码在要迁移的数据库上创建具有最低权限的用户。
usedatabase_to_migratedb.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 副本集
要将持续复制或 CDC 用于 MongoDB,Amazon DMS 需要对 MongoDB 操作日志(oplog)的访问权限。要创建 oplog,您需要部署一个副本集 (如果没有副本集)。有关更多信息,请参阅 MongoDB 文档
您可以将 CDC 用于作为源终端节点的 MongoDB 副本集的主要或次要节点。
将独立实例转换为副本集
-
使用命令行,连接到
mongo。mongo localhost -
停止
mongod服务。service mongod stop -
使用以下命令重新启动
mongod:mongod --replSet "rs0" --auth -portport_number -
使用以下命令测试与副本集的连接:
mongo -u root -ppassword--host rs0/localhost:port_number--authenticationDatabase "admin"
如果您打算执行文档模式迁移,请在创建 MongoDB 终端节点时选择选项 _id as a
separate column。通过选择此选项,将创建另一个名为 _id 的列以作为主键。Amazon DMS 需要第二列以支持数据操作语言 (DML) 操作。
注意
Amazon DMS 使用操作日志(oplog)捕获持续复制期间的更改。如果 MongoDB 在 Amazon DMS 读取记录之前将其从 oplog 中清除,则您的任务将失败。我们建议调整 oplog 的大小,将更改至少保留 24 小时。
将 MongoDB 作为 Amazon DMS 源时的安全要求
Amazon DMS 支持 MongoDB 的两种身份验证方法。这两种身份验证方法用于加密密码,因此它们仅在将 authType 参数设置为 PASSWORD 时使用。
MongoDB 身份验证方法如下:
-
MONGODB-CR – 提供向后兼容性
-
SCRAM-SHA-1 – 使用 MongoDB 版本 3.x 和 4.0 时的默认值
如果未指定身份验证方法,Amazon DMS 将使用 MongoDB 源版本的默认方法。
对 MongoDB 集合进行分段并以并行方式迁移
为了提高迁移任务的性能,MongoDB 源端点支持表映射中的并行完全加载的两个选项。
换句话说,在 JSON 设置中,对于并行完全加载,您可以使用表映射的自动分段或范围分段来迁移集合。使用自动分段,您可以为 Amazon DMS 指定标准,以自动在每个线程中对源分段用于迁移。使用范围分段,您可以告知 Amazon DMS 每个区段的特定范围,以便 DMS 在每个线程中进行迁移。有关这些设置的更多信息,请参阅表和集合设置规则和操作。
使用自动分段范围并行迁移 MongoDB 数据库
您可以并行迁移文档,方法是为 Amazon DMS 指定标准,以便为每个线程自动分区(分段)数据。具体而言,您指定每个线程要迁移的文档数量。使用这种方法,Amazon DMS 尝试优化区段边界,以最大限度地提高每个线程的性能。
您可以在表映射中,使用以下表设置选项来指定分段标准:
|
表设置选项 |
描述 |
|---|---|
|
|
(必需)对于将 MongoDB 作为源,设置为 |
|
|
(可选)迁移使用的分区(区段)总数。默认值是 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 值,则会导致数据丢失或重复行错误。
使用范围分段并行迁移 MongoDB 数据库
您可以通过为线程中的每个区段指定范围来并行迁移文档。使用这种方法,您可以根据为每个线程选择的文档范围,告知 Amazon DMS 要在每个线程中迁移的特定文档。
下图显示了包含七个项目并将 _id 作为主键的 MongoDB 集合。
要将集合拆分为三个特定区段供 Amazon 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.
目前,Amazon DMS 支持将以下 MongoDB 数据类型作为区段键列:
-
双精度
-
String
-
ObjectId
-
32 位整数
-
64 位整数
使用 MongoDB 作为 Amazon DMS 的源时迁移多个数据库
对于所有支持的 MongoDB 版本,Amazon DMS 版本 3.4.5 及更高版本支持在单个任务中迁移多个数据库。如果您要迁移多个数据库,请采取以下步骤:
-
在创建 MongoDB 源端点时,请执行下列操作之一:
-
在 DMS 控制台的创建端点页面上,确保端点配置下的数据库名称为空。
-
使用 Amazon CLI
CreateEndpoint命令,向MongoDBSettings中的DatabaseName参数分配一个空字符串值。
-
-
对于要从 MongoDB 源迁移的每个数据库,请在任务的表映射中指定数据库名称作为架构名称。您可以在控制台中使用引导式输入或直接在 JSON 中执行此操作。有关引导式输入的更多信息,请参阅 通过控制台指定表选择和转换规则。有关 JSON 的更多信息,请参阅选择规则和操作。
例如,您可以指定以下 JSON 以迁移三个 MongoDB 数据库。
例 迁移架构中的所有表
以下 JSON 会将源端点中 Customers、Orders 和 Suppliers 数据库的所有表迁移到目标端点。
{ "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 作为 Amazon DMS 源时的限制
将 MongoDB 作为 Amazon DMS 源时,存在以下限制:
-
在表模式下,集合中的文档的数据类型,必须与所用于的同一字段中值的数据类型一致。例如,如果集合中的文档包含
'{ a:{ b:value ... }',则集合中引用a.b字段value的所有文档都必须为value使用相同的数据类型,无论该文档出现在集合中的哪个位置。 -
当
_id选项设置为单独一列时,ID 字符串不能超过 200 个字符。 -
在表模式下,对象 ID 和数组类型键将转换为具有
oid和array前缀的列。将使用具有前缀的名称在内部引用这些列。如果您在 Amazon DMS 中使用引用了这些列的转换规则,请确保指定具有前缀的列。例如,指定
${oid__id}而不是${_id},或者指定${array__addresses}而不是${_addresses}。 -
集合名称和键名不能包含美元符号($)。
-
在使用 RDBMS 的表模式下,Amazon DMS 不支持包含具有不同大小写(大写、小写)的相同字段的集合。例如,Amazon DMS 不支持拥有两个名为
Field1和field1的集合。 -
表模式和文档模式具有前面所述的限制。
-
使用自动分段进行并行迁移时,存在上述限制。
-
MongoDB 不支持源筛选器。
-
Amazon DMS 不支持嵌套级别大于 97 的文档。
-
Amazon DMS 不支持 MongoDB 5.0 版本的以下功能:
实时重新分片
客户端字段级加密(CSFLE)
时间序列集合迁移
注意
由于 DocumentDB 不支持时间序列集合,因此在完全加载阶段中迁移的时间序列集合将转换为 Amazon DocumentDB 中的普通集合。
使用 MongoDB 作为 Amazon DMS 的源时的端点配置设置
在设置 MongoDB 源端点时,您可以使用 Amazon DMS 控制台指定多个端点配置设置。
下表介绍了将 MongoDB 数据库作为 Amazon DMS 的源时的可用配置设置。
| 设置(属性) | 有效值 | 默认值和描述 |
|---|---|---|
|
身份验证模式 |
|
值 |
|
身份验证源 |
有效的 MongoDB 数据库名称。 |
您为身份验证所用凭证进行验证时使用的 MongoDB 数据库的名称。默认值为 |
|
身份验证机制 |
|
身份验证机制。 |
|
元数据模式 |
文档和表 |
选择文档模式或表模式。 |
|
要扫描的文档数( |
大于 |
仅在表模式下使用此选项来定义目标表定义。 |
|
将 _id 作为单独的列 |
复选框中的选中标记 |
可选的复选标记框,用于创建另一个名为 |
|
|
NUMBER 仅限额外连接属性(ECA)。 |
此设置以毫秒为单位,用于配置 MongoDB 客户端的连接超时。如果该值小于或等于零,则使用 MongoDB 客户端默认值。 |
|
|
布尔值
|
如果为 true,则在 CDC 更新事件期间,Amazon DMS 将整个更新的文档复制到目标。设置为 false 时,Amazon DMS 使用 MongoDB 更新命令,仅更新目标上文档中已修改的字段。 |
|
|
布尔值
|
如果为 true,Amazon DMS 将数据复制到分片集合。仅当目标端点是 DocumentDB 弹性集群时,Amazon DMS 才使用此设置。 当此项设置为 true 时,请注意以下几点:
|
|
|
|
当为 注意如果更改流和操作日志条目之间出现差异,则可能会错过操作,因为在这种情况下,DMS 的默认行为是使任务失败。默认值: |
|
|
|
当为 |
如果您选择文档作为元数据模式,则可以使用不同的选项。
如果目标端点是 DocumentDB,请确保在文档模式下运行迁移。此外,修改您的源端点并选择选项将 _id 作为单独的列。如果您的源 MongoDB 工作负载涉及事务,则这是必需的先决条件。
MongoDB 的源数据类型
将 MongoDB 作为 Amazon DMS 源的数据迁移支持大多数 MongoDB 数据类型。在下表中,您可以找到使用 Amazon DMS 时支持的 MongoDB 源数据类型以及来自 Amazon DMS 数据类型的默认映射。有关 MongoDB 数据类型的更多信息,请参阅 MongoDB 文档中的 BSON 类型
有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。
有关 Amazon DMS 数据类型的其他信息,请参阅Amazon Database Migration Service 的数据类型。
|
MongoDB 数据类型 |
Amazon DMS 数据类型 |
|---|---|
布尔值 |
布尔型 |
二元 |
BLOB |
日期 |
日期 |
Timestamp |
日期 |
Int |
INT4 |
长整型 |
INT8 |
双精度 |
REAL8 |
字符串 (UTF-8) |
CLOB |
数组 |
CLOB |
OID |
字符串 |
REGEX |
CLOB |
CODE |
CLOB |