使用 MongoDB 作为来源 Amazon DMS - Amazon 数据库迁移服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 MongoDB 作为来源 Amazon DMS

有关支持作为源的 MongoDB 版本的信息 Amazon DMS ,请参阅。的来源 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。

如果您是初次使用 MongoDB,请注意以下关于 MongoDB 数据库的重要概念:

  • MongoDB 中的记录是一个文档,它是由字段和值对构成的数据结构。字段值可以包含其他文档、数组和文档数组。文档大致相当于关系数据库表中的行。

  • MongoDB 中的集合 是一组文档,并且大致相当于关系数据库表。

  • MongoDB 中的数据库是一组集合,并且大致相当于关系数据库中的架构。

  • 在内部,MongoDB 文档以压缩格式存储为二进制 JSON (BSON) 文件,包含文档中每个字段的类型。每个文档都有唯一的 ID。

Amazon DMS 使用 MongoDB 作为源代码时支持两种迁移模式:文档模式或表格模式。您可以在创建 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 将包含嵌套值字段(例如嵌套值)的 JSON 文档迁移{"a" : {"b" : {"c": 1}}}到名为的列中 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 迁移,您可以创建一个具有 root 权限的用户帐户,也可以创建仅具有要迁移的数据库权限的用户。

以下代码创建将作为根账户的用户。

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 副本集

要将持续复制或 CDC 与 MongoDB 配合使用 Amazon 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 的列以作为主键。第二列是支持数据操作语言 (DML) 操作所 Amazon DMS 必需的。

注意

Amazon DMS 使用操作日志 (oplog) 捕获正在进行的复制期间的更改。如果 MongoDB 在读取记录 Amazon DMS 之前将其从操作日志中清除,则您的任务将失败。我们建议调整 oplog 的大小,将更改至少保留 24 小时。

使用 MongoDB 作为源时的安全要求 Amazon DMS

Amazon 分布式消息服务支持两种针对 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 尝试优化分段边界,以最大限度地提高每个线程的性能。

您可以在表映射中,使用以下表设置选项来指定分段标准:

表设置选项

描述

"type"

(必需)对于将 MongoDB 作为源,设置为 "partitions-auto"

"number-of-partitions"

(可选)迁移使用的分区(区段)总数。默认值是 16。

"collection-count-from-metadata"

(可选)如果此选项设置为 true,则 Amazon DMS 使用估计的集合计数来确定分区数。如果此选项设置为false,则 Amazon DMS 使用实际收集次数。默认为 true

"max-records-skip-per-page"

(可选)在确定每个分区的边界时要同时跳过的记录数。 Amazon 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 值,则会导致数据丢失或重复行错误。

使用范围分段并行迁移 MongoDB 数据库

您可以通过为线程中的每个区段指定范围来并行迁移文档。使用这种方法,您可以根据您选择 Amazon DMS 的每个线程的文档范围来告知要在每个线程中迁移的特定文档。

下图显示了包含七个项目并将 _id 作为主键的 MongoDB 集合。

包含七个项目的 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

Amazon DMS 3.4.5 及更高版本支持在单个任务中为所有支持的 MongoDB 版本迁移多个数据库。如果您要迁移多个数据库,请采取以下步骤:

  1. 在创建 MongoDB 源端点时,请执行下列操作之一:

    • 在 DMS 控制台的创建端点页面上,确保端点配置下的数据库名称为空。

    • 使用 Amazon CLI CreateEndpoint命令为中的DatabaseName参数分配一个空字符串值MongoDBSettings

  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 作为源代码时的限制 Amazon DMS

以下是使用 MongoDB 作为源代码时的限制: Amazon DMS

  • 在表模式下,集合中的文档的数据类型,必须与所用于的同一字段中值的数据类型一致。例如,如果集合中的文档包含 '{ a:{ b:value ... }',则集合中引用 a.b 字段 value 的所有文档都必须为 value 使用相同的数据类型,无论该文档出现在集合中的哪个位置。

  • _id 选项设置为单独一列时,ID 字符串不能超过 200 个字符。

  • 在表模式下,对象 ID 和数组类型键将转换为具有 oidarray 前缀的列。

    将使用具有前缀的名称在内部引用这些列。如果您在引用这些列 Amazon DMS 时使用转换规则,请务必指定前缀列。例如,指定 ${oid__id} 而不是 ${_id},或者指定 ${array__addresses} 而不是 ${_addresses}

  • 集合名称和键名不能包含美元符号($)。

  • Amazon DMS 不支持在表格模式下包含具有不同大小写(大小)的相同字段的集合,目标为 RDBMS。例如, 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

设置(属性) 有效值 默认值和描述

身份验证模式

"none"

"password"

"password" 提示输入用户名和密码。如果指定 "none",则不使用用户名和密码参数。

身份验证源

有效的 MongoDB 数据库名称。

您为身份验证所用凭证进行验证时使用的 MongoDB 数据库的名称。默认值为 "admin"

身份验证机制

"default"

"mongodb_cr"

"scram_sha_1"

身份验证机制。 "default" 值为 "scram_sha_1"。当 authType 设为 "no" 时,不使用此设置。

元数据模式

文档和表

选择文档模式或表模式。

要扫描的文档数docsToInvestigate

大于 0 的正整数。

仅在表模式下使用此选项来定义目标表定义。

将 _id 作为单独的列

复选框中的选中标记

可选的复选标记框,用于创建另一个名为 _id 的列作为主键。

socketTimeoutMS

NUMBER

仅限额外连接属性(ECA)。

此设置以毫秒为单位,用于配置 MongoDB 客户端的连接超时。如果该值小于或等于零,则使用 MongoDB 客户端默认值。

UseUpdateLookUp

布尔值

true

false

如果为 true,则在 CDC 更新事件期间,将整个更新的文档 Amazon DMS 复制到目标。设置为 false 时, Amazon DMS 使用 MongoDB update 命令仅更新目标上文档中已修改的字段。

ReplicateShardCollections

布尔值

true

false

如果为 true, Amazon DMS 则将数据复制到分片集合。 Amazon DMS 仅当目标终端节点是 DocumentDB 弹性集群时才使用此设置。

当此项设置为 true 时,请注意以下几点:

  • 必须将 TargetTablePrepMode 设置为 nothing

  • Amazon DMS 自动设置useUpdateLookupfalse

如果您选择文档作为元数据模式,则可以使用不同的选项。

如果目标端点是 DocumentDB,请确保在文档模式下运行迁移。此外,修改您的源端点并选择选项将 _id 作为单独的列。如果您的源 MongoDB 工作负载涉及事务,则这是必需的先决条件。

MongoDB 的源数据类型

使用 MongoDB 作为源的数据迁移 Amazon DMS 支持大多数 MongoDB 数据类型。在下表中,您可以找到 Amazon DMS 使用时支持的 MongoDB 源数据类型以及数据类型的默认映射 Amazon DMS 。有关 MongoDB 数据类型的更多信息,请参阅 MongoDB 文档中的 BSON 类型

有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。

有关 Amazon DMS 数据类型的更多信息,请参见Database Migration Servic Amazon e 的数据类型

MongoDB 数据类型

Amazon DMS 数据类型

布尔值

布尔型

二元

BLOB

日期

日期

时间戳

日期

Int

INT4

长整型

INT8

双精度

REAL8

字符串 (UTF-8)

CLOB

数组

CLOB

OID

字符串

REGEX

CLOB

CODE

CLOB