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

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

使用 Amazon DocumentDB(与 MongoDB 兼容)作为 Amazon DMS 的源

有关 Amazon DMS 支持将哪些版本的 Amazon DocumentDB(与 MongoDB 兼容)作为源的信息,请参阅 Amazon DMS 的源

使用 Amazon DocumentDB 作为源,您可以将数据从一个 Amazon DocumentDB 集群迁移到另一个 Amazon DocumentDB 集群。您也可以将数据从 Amazon DocumentDB 集群迁移到 Amazon DMS 支持的其他目标端点之一。

如果您不熟悉 Amazon DocumentDB,请注意 Amazon DocumentDB 的以下重要概念:

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

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

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

使用 Amazon DocumentDB 作为源时,Amazon DMS 支持两种迁移模式:文档模式和表模式。在 Amazon DMS 控制台中创建 Amazon DocumentDB 源端点时,您可以使用元数据模式选项或额外连接属性 nestingLevel 来指定迁移模式。在下文中,您可以找到有关迁移模式的选择如何影响所生成的目标数据格式的说明。

文档模式

文档模式下,JSON 文档按原样迁移。这意味着文档数据将合并到两个项目之一中。当您使用关系数据库作为目标时,数据是目标表中名为 _doc 的单个列。当您使用非关系数据库作为目标时,数据是单个 JSON 文档。默认模式为文档模式,我们建议在迁移到 Amazon DocumentDB 目标时使用这种模式。

例如,请考虑名为 myCollection 的 Amazon DocumentDB 集合中的以下文档。

> 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),请将此参数设置为 true,除非使用 Amazon DocumentDB 作为目标。

注意

如果您将一个新集合添加到源数据库,则 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 源端点,则可指定要扫描的文档的数量。默认值为 1000 个文档。如果您使用 Amazon CLI,则可使用额外连接属性 docsToInvestigate

在表模式中,Amazon DMS 按如下方式管理文档和集合:

  • 当您将一个文档添加到现有集合时,将复制该文档。如果某些字段在目标中不存在,则不会复制这些字段。

  • 当您更新文档时,复制更新后的文档。如果某些字段在目标中不存在,则不会复制这些字段。

  • 完全支持文档删除。

  • 在 CDC 任务期间,添加新集合不会导致在目标上生成新的表。

  • 在更改数据捕获 (CDC) 阶段,Amazon DMS 不支持对集合重命名。

设置权限以使用 Amazon DocumentDB 作为源

为 Amazon DMS 迁移使用 Amazon DocumentDB 源时,您可以创建具有根权限的用户账户。或者,您可以创建一个仅具有待迁移数据库权限的用户。

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

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" }] })

为 Amazon DocumentDB 集群配置 CDC

要将持续复制或 CDC 与 Amazon DocumentDB 结合使用,Amazon DMS 需要对 Amazon DocumentDB 集群的更改流的访问权限。有关集群的集合和数据库中按时间排列的更新事件序列的描述,请参阅《Amazon DocumentDB 开发人员指南》中的使用更改流

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

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

这种方法可以为您数据库中的所有集合启用更改流。启用更改流后,您可以创建一个迁移任务,该任务可以在迁移现有数据的同时复制正在进行的更改。Amazon DMS 仍会继续捕获和应用更改,即使加载了批量数据。最终,源数据库和目标数据库将保持同步,尽可能减少迁移的停机时间。

注意

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

使用 TLS 连接到 Amazon DocumentDB

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

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

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

使用 Amazon DMS 控制台导入公有密钥
  1. 登录 Amazon Web Services Management Console并选择 Amazon DMS。

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

  3. 选择导入证书。此时显示导入新 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 CLI 创建 Amazon DocumentDB 源端点。通过控制台使用以下过程。

使用 Amazon DMS 控制台配置 Amazon DocumentDB 源端点
  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 CLI 配置 Amazon DocumentDB 源端点
  • 运行以下 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"

(必需)对于将 Amazon DocumentDB 作为源,设置为 "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 值,则可能会导致数据丢失或重复行错误。

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

以下示例显示了包含七个项目并将 _id 作为主键的 Amazon DocumentDB 集合。


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

目前,Amazon DMS 支持将以下 Amazon DocumentDB 数据类型作为区段键列:

  • Double

  • String

  • ObjectId

  • 32 位整数

  • 64 位整数

使用 Amazon DocumentDB 作为 Amazon DMS 的源时迁移多个数据库

只有对于 Amazon DocumentDB 版本 4.0 及更高版本,Amazon DMS 版本 3.4.5 及更高版本才支持在单个任务中迁移多个数据库。如果要迁移多个数据库,请执行以下操作:

  1. 创建 Amazon DocumentDB 源端点时:

    • 在适用于 Amazon DMS 的 Amazon Web Services Management Console中,在创建端点页面上的端点配置下,将数据库名称留空。

    • 在 Amazon Command Line Interface (Amazon CLI) 中,为你为操作指定的 documentDbS etting DatabaseNames 中的参数分配一个空字符串值。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 作为 Amazon DMS 的源时的限制

将 Amazon DocumentDB 作为 Amazon DMS 的源时存在以下限制:

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

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

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

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

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

  • 使用自动分段进行并行迁移时,存在上述限制。

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

  • 当使用 DocumentDB(兼容 MongoDB)作为源时,DMS 每秒最多可以处理 250 条记录。

  • Amazon DMS 不支持嵌套级别大于 97 的文档。

  • DocumentDB 不支持源筛选器。

  • Amazon DMS在弹性集群模式下,不支持 DocumentDB 的 CDC(更改数据捕获)复制作为源。

在以 Amazon DocumentDB 为源时使用端点设置

您可以使用端点设置来配置 Amazon DocumentDB 源数据库,这与使用额外连接属性类似。您可以在使用 Amazon DMS 控制台创建源端点时指定端点设置,或者在 Amazon CLI 中使用符合 --doc-db-settings '{"EndpointSetting": "value", ...}' JSON 语法的 create-endpoint 命令指定端点设置。

下表显示了在将 Amazon DocumentDB 用作源时可以使用的端点设置。

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

NestingLevel

"none"

"one"

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

ExtractDocID

布尔值

true

false

false – 当 NestingLevel 设为 "none" 时使用此属性。

如果您的目标数据库是 Amazon DocumentDB,请设置 '{"ExtractDocID": true}'

DocsToInvestigate

大于 0 的正整数。

1000 – 当 NestingLevel 设为 "one" 时使用此属性。

ReplicateShardCollections

布尔值

true

false

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

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

  • 必须将 TargetTablePrepMode 设置为 nothing

  • Amazon DMS 自动将 useUpdateLookup 设置为 false

Amazon DocumentDB 的源数据类型

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

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

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

Amazon DocumentDB 数据类型

Amazon DMS 数据类型

布尔值

布尔型

二元

BLOB

Date

Date

时间戳

Date

Int

INT4

长整型

INT8

Double

REAL8

字符串 (UTF-8)

CLOB

数组

CLOB

OID

String