将 Amazon DocumentDB (MongoDB 兼容) 作为的源Amazon DMS - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

将 Amazon DocumentDB (MongoDB 兼容) 作为的源Amazon DMS

Amazon DMS将 Amazon DocumentDB (MongoDB 兼容) 版本 3.6 和 4.0 作为数据库源。使用 Amazon DocumentDB 作为源,您可以将数据从一个 Amazon DocumentDB 集群迁移到另一个 Amazon DocumentDB 集群。您还可以将数据从 Amazon DocumentDB 集群迁移到支持的其他目标终端节点之一Amazon DMS.

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

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

  • 一个collection在 Amazon DocumentDB 中是一组文档,并且大致相当于关系数据库表。

  • 一个数据库在 Amazon DocumentDB 中是一组集合,并且大致相当于关系数据库中的模式。

Amazon DMS将 Amazon DocumentDB 用作源模式、文档模式和表模式时,支持两种迁移模式。在中创建 Amazon DocumentDB 源终端节点时,您可以指定迁移模式Amazon DMS控制台,使用元数据模式选项或额外的连接属性nestingLevel. 在下文中,您可以找到关于迁移模式的选择如何影响目标数据的结果格式的解释。

文档模式

In文档模式,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 }

在使用文档模式将数据迁移到关系数据库表后,数据结构如下所示。将文档中的数据字段合并到 _doccolumn.

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

您可以选择设置额外的连接属性extractDocIDtrue创建名为的第二列"_id"作为主键的作用。如果要使用更改数据捕获 (CDC),请将此参数设置为true除非使用 Amazon DocumentDB 作为目标。

注意

如果您将一个新集合添加到源数据库,则 Amazon DMS 将为该集合创建一个新的目标表并复制所有文档。

表模式

In表模式,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迁移时,您可以创建具有 root 权限的用户帐户。或者,您可以创建仅具有要迁移的数据库权限的用户。

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

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

以下代码在要迁移的数据库上创建具有最低权限的用户。

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

为 Amazon DocumentDB 集群配置 CDC

要将正在进行的复制或 CDC 与 Amazon DocumentDB 一起使用,Amazon DMS需要访问 Amazon DocumentDB 集群的更改流。有关集群集合和数据库中更新事件的时间顺序的说明,请参阅使用 Change stream中的Amazon DocumentDB 开发人员指南.

使用 MongoDB 外壳对您的 Amazon DocumentDB 集群进行身份验证。然后,运行以下命令以启用更改流。

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

此方法为数据库中的所有集合启用更改流。启用更改流后,您可以创建迁移任务,以迁移现有数据并同时复制正在进行的更改。Amazon DMS甚至在加载批量数据后,也会继续捕获和应用更改。最终,源数据库和目标数据库会同步,最大限度地减少迁移的停机

使用 TLS 连接到 Amazon DocumentDB

默认情况下,新创建的 Amazon DocumentDB 集群仅接受使用传输层安全性 (TLS) 的安全连接。当 TLS 启用时,每个到 Amazon DocumentDB 的连接都需要公有密钥。

您可以通过下载文件来检索 Amazon DocumentDB 的公有密钥。rds-combined-ca-bundle.pem来自Amazon托管 Amazon S3 存储桶。有关下载此文件的更多信息,请参阅使用 TLS 加密连接中的Amazon DocumentDB 开发人员指南。

下载之后rds-combined-ca-bundle.pem文件时,您可以将其包含的公钥导入到中的公有密钥。Amazon DMS. 以下步骤介绍了如何完成此操作。

使用导入公钥Amazon DMS控制台

  1. 登录 Amazon Web Services Management Console并选择 Amazon DMS。

  2. 在导航窗格中,选择证书

  3. 选择 Import certificate (导入证书)。这些区域有:导入新 CA 证书将显示页面。

  4. 证书配置部分中,请执行以下操作之一:

    • 适用于证书标识符中输入证书的唯一名称,例如docdb-cert.

    • 选择选择文件中,导航到您保存的位置rds-combined-ca-bundle.pem文件,然后选择它。

  5. 选择 Add new CA certificate (添加新 CA 证书)

这些区域有:Amazon CLI以下示例使用Amazon 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 源终端节点

您可以使用控制台或使用控制台创建 Amazon DocumentDB 源终端节点。Amazon CLI. 对控制台使用以下步骤。

Amazon DocumentDB 用Amazon DMS控制台

  1. 登录 Amazon Web Services Management Console并选择 Amazon DMS。

  2. 选择终端节点从导航窗格中,选择创建终端节点.

  3. 适用于终端节点标识符中,提供一个可帮助您轻松标识的名称,例如docdb-source.

  4. 适用于源引擎,选择Amazon DocumentDB(与 MongoDB 兼容).

  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 用Amazon CLI

  • 运行以下命令Amazon 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 设置中使用表映射的自动分段或范围分段选项并行迁移集合。自动分段选项允许您指定Amazon DMS以便在每个线程中自动对源进行分段以便迁移。范围细分选项允许你告诉Amazon DMS要在每个线程中迁移 DMS 的每个区段的具体范围。有关这些设置的更多信息,请参阅表和集合设置规则和操作.

使用自动分段范围并行迁移 Amazon DocumentDB 数据库

您可以通过指定标准并行迁移文档Amazon DMS自动分区(分段)每个线程的数据,尤其是每个线程要迁移的文档数量。使用这种方法,Amazon DMS尝试优化区段边界以实现每个线程的最大性能。

您可以使用表映射中的表格设置选项指定分段条件:

表设置选项

描述

"type"

(必填)设置为"partitions-auto"将 Amazon DocumentDB 作为来源。

"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集合在区段边界计算期间的值,这可能会导致数据丢失或重复行错误。

使用特定区段范围并行迁移 Amazon DocumentDB 数据库

以下示例显示了具有 7 个项目的 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 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 DMS3.4.5 及更高版本支持在单个任务中迁移多个数据库,仅适用于 Amazon DocumentDB 4.0 及更高版本。如果要迁移多个数据库,请执行以下操作:

  1. 当您创建 Amazon DocumentDB 源终端节点时:

    • 在Amazon Web Services Management Console为了Amazon DMS离开,离开数据库名称下空端节点配置创建端节点页.

    • 在Amazon Command Line Interface(Amazon CLI) 中,将空字符串值分配给DatabaseName中的参数文档数据库设置你为CreateEndpointaction.

  2. 对于要从此 Amazon DocumentDB 源终端节点迁移的每个数据库,请使用控制台中的指导输入或直接在 JSON 中将每个数据库的名称指定为任务的表映射中的架构名称。有关引导式输入的更多信息,请参阅 从控制台指定表选择和转换规则. 有关 JSON 的更多信息,请参阅选择规则和操作.

例如,您可以指定以下 JSON 来迁移三个 Amazon DocumentDB 数据库。

例 迁移架构中的所有表

下面的 JSON 将从CustomersOrders, 和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 和数组类型键将转换为具有 oidarray 前缀的列。

    将使用具有前缀的名称在内部引用这些列。如果你在中使用转换规则Amazon DMS该列引用了这些列,请确保指定具有前缀的列。例如,指定${oid__id}而不是${_id},或者${array__addresses}而不是${_addresses}.

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

  • 表模式和文档模式具有前面讨论的限制。

  • 使用自动分段并行迁移具有前面描述的限制。

  • Amazon DocumentDB(兼容 MongoDB)源不支持使用特定时间戳作为更改数据捕获 (CDC) 的起始位置。无论时间戳如何,持续的复制任务都会开始捕获更改。

将额外的连接属性与 Amazon DocumentDB 用作源

当您设置 Amazon DocumentDB 源终端节点时,您可以指定额外的连接属性。通过键值对指定额外的连接属性。如果您具有多个连接属性设置,请用分号将它们彼此分开,并且不需要额外的空格(例如,oneSetting;thenAnother)。

下表介绍了将 Amazon DocumentDB 数据库用作的额外连接属性时可用的额外连接属性。Amazon DMS源。

属性名称 有效值 默认值和描述

nestingLevel

"none"

"one"

"none"— 指定"none"以使用文档模式。指定 "one" 使用表模式。

extractDocID

"true"

"false"

"false"— 当时使用此属性nestingLevel设置为"none".

如果您的目标数据库是 Amazon DocumentDB,请设置extractDocID=true.

docsToInvestigate

大于 0 的正整数。

1000— 当时使用此属性nestingLevel设置为"one".

注意

如果目标终端节点是 Amazon DocumentDB,请在文档模式,然后设置额外的连接属性extractDocID=true. 设置额外的连接属性extractDocID=true,修改源终端节点并选中复选框_id 作为单独的列.

Amazon DocumentDB 的源数据类型

在下表中,您可以找到使用时支持的 Amazon DocumentDB 源数据类型。Amazon DMS. 您还可以从以下位置查找默认映射Amazon DMS此表中的数据类型。有关数据类型的更多信息,请参阅BSON 类型在 MongoDB 文档中。

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

有关 Amazon DMS 数据类型的其他信息,请参阅的数据类型AmazonDatabase Migration Service

Amazon DocumentDB 数据类型

Amazon DMS 数据类型

Boolean

Bool

Binary

BLOB

日期

日期

时间戳

日期

Int

INT4

长整型

INT8

Double

REAL8

字符串 (UTF-8)

CLOB

数组

CLOB

OID

字符串