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

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

使用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 }

您可以选择将额外连接属性设置为extractDocIDtrue以创建第二个名为"_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控制台导入您的公钥
  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 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 源终端节点
  1. 登录 Amazon Web Services Management Console并选择 Amazon DMS。

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

  3. 对于端点标识符,请提供一个可帮助您轻松识别它的名称,例如docdb-source

  4. 对于源引擎,选择 Amazon DocumentDB(与 MongoDB co ment

  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 证书,请选择亚马逊 DocumentDB 证书rds-combined-ca-bundle.pem。有关添加此证书的说明,请参阅使用 TLS 连接Amazon DocumentDB

  9. 对于 DB 名称,输入要迁移的数据库的名称。

在 CLI 中使用以下步骤。

要使用 Amazon DocumentDB 源终端节点,Amazon CLI
  • 运行以下Amazon DMScreate-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

对亚马逊 DocumentDB 集合进行分段parallel 迁移

为了提高迁移任务的性能,Amazon DocumentDB 源终端节点支持表映射中parallel 满载功能的两个选项。换句话说,您可以在 JSON 设置中使用表映射的自动分段或范围分段选项并parallel 迁移集合,以实现parallel 满负载。自动分段选项允许您指定标准,Amazon DMS以便在每个线程中自动对迁移源进行细分。范围分段选项允许您告知每个分段Amazon DMS的具体范围,以便 DMS 在每个线程中迁移。有关这些设置的更多信息,请参阅表和集合设置规则和操作

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

您可以通过指定自动对每个线程的数据进行分区(分段)的标准,尤其是每个线程Amazon DMS要迁移的文档数量,来parallel 迁移文档。使用这种方法,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值,这可能会导致数据丢失或重复行错误。

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

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


                        包含七个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 及更高版本。如果要迁移多个数据库,请执行以下操作:

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

    • 在表单中Amazon Web Services Management ConsoleAmazon DMS,在 “创建终端节点” 页面的 “端点配置” 下将数据库名称留空。

    • 在Amazon Command Line Interface (Amazon CLI) 中,为您在 Document DbSettings 中为该CreateEndpoint操作指定的DatabaseName参数分配一个空字符串值。

  2. 对于要从此 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 和数组类型键将转换为具有 oidarray 前缀的列。

    将使用具有前缀的名称在内部引用这些列。如果您在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 '{"EndpointSetting": "value", ...}' JSON 语法创建源终端节点时指定设置。Amazon CLI

下表显示了您可以将 Amazon DocumentDB 作为源使用。

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

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数据类型的默认映射。有关数据类型的更多信息,请参阅 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

字符串