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

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

将 Amazon DocumentDB 作为 Amazon Database Migration Service 的目标

有关 Amazon DMS 支持哪些版本的 Amazon DocumentDB(与 MongoDB 兼容)的信息,请参阅Amazon DMS 的目标。您可以使用 Amazon DMS 将数据从 Amazon DMS 支持的任一源数据引擎迁移到 Amazon DocumentDB(与 MongoDB 兼容)。该引擎可以位于 Amazon 托管服务(如 Amazon RD、Aurora 或 Amazon S3)上。或者,该引擎可以位于自管理数据库(如在 Amazon EC2 上或本地运行的 MongoDB)上。

您可以使用 Amazon DMS 将源数据复制到 Amazon DocumentDB 数据库、集合或文档。

注意

如果您的源端点是 MongoDB 或 Amazon DocumentDB,请在文档模式下运行迁移。

MongoDB 以二进制 JSON 格式 (BSON) 存储数据。Amazon DMS 支持 Amazon DocumentDB 支持的所有 BSON 数据类型。有关这些数据类型的列表,请参阅《Amazon DocumentDB 开发人员指南》中的支持的 MongoDB API、操作和数据类型

如果源端点是关系数据库,则 Amazon DMS 会将数据库对象映射到 Amazon DocumentDB,如下所示:

  • 关系数据库或数据库架构映射到 Amazon DocumentDB 数据库

  • 关系数据库中的表映射到 Amazon DocumentDB 中的集合

  • 关系表中的记录映射到 Amazon DocumentDB 中的文档。每个文档均由源记录中的数据构成。

如果源端点为 Amazon S3,则生成的 Amazon DocumentDB 对象对应于 Amazon S3 的 Amazon DMS 映射规则。例如,考虑以下 URI。

s3://mybucket/hr/employee

在这种情况下,Amazon DMS 将 mybucket 中的对象映射到 Amazon DocumentDB,如下所示:

  • 顶级 URI 部分 (hr) 映射到 Amazon DocumentDB 数据库。

  • 接下来的 URI 部分 (employee) 映射到 Amazon DocumentDB 集合。

  • employee 中的每个对象都映射到 Amazon DocumentDB 中的一个文档。

有关 Amazon S3 的映射规则的更多信息,请参阅将 Amazon S3 作为 Amazon DMS 的源

Amazon DocumentDB 端点设置

在 Amazon DMS 3.5.0 及更高版本中,您可以通过调整并行线程和批量操作的任务设置来提高 Amazon DocumentDB 端点的更改数据捕获 (CDC) 性能。为此,您可以使用 ParallelApply* 任务设置来指定并发线程的数量、每个线程的队列数以及要存储在缓冲区中的记录数。例如,假设您要执行 CDC 加载并且要并行应用 128 个线程。您还希望对于每个线程访问 64 个队列,每个缓冲区存储 50 条记录。

要提高 CDC 性能,请 Amazon DMS 支持以下任务设置:

  • ParallelApplyThreads – 指定 Amazon DMS 在 CDC 加载期间用于将数据记录推送到 Amazon DocumentDB 目标端点的并发线程数。默认值为零 (0),最大值为 32。

  • ParallelApplyBufferSize – 指定在 CDC 加载过程中,要在每个缓冲区队列中存储的、供并发线程推送到目标 Amazon DocumentDB 端点的最大记录数。默认值是 100,最大值是 1,000。当 ParallelApplyThreads 指定多个线程时,请使用此选项。

  • ParallelApplyQueuesPerThread – 指定每个线程访问以将数据记录从队列中取出并在 CDC 期间为 Amazon DocumentDB 端点生成批处理负载的队列数。默认值是 1。最大值为 512。

有关将 Amazon DocumentDB 作为 Amazon DMS 目标的其他详细信息,请参阅以下章节:

注意

有关迁移过程的分步演练,请参阅《Amazon Database Migration Service 分步迁移指南》中的从 MongoDB 迁移到 Amazon DocumentDB

将数据从源映射到 Amazon DocumentDB 目标

Amazon DMS 从源终端节点读取记录,并基于它所读取的数据来构建 JSON 文档。对于每个 JSON 文档,Amazon DMS 必须确定一个 _id 字段以充当唯一标识符。然后,它使用 _id 字段作为主键,将 JSON 文档写入到 Amazon DocumentDB 集合。

单列源数据

如果源数据包含单个列,则数据必须是字符串类型。(根据源引擎,实际数据类型可能是 VARCHAR、NVARCHAR、TEXT、LOB、CLOB 或类似类型。)Amazon DMS 假定数据是有效的 JSON 文档,并按原样将数据复制到 Amazon DocumentDB。

如果生成的 JSON 文档包含名为 _id 的字段,则该字段用作 Amazon DocumentDB 中的唯一 _id

如果 JSON 不包含 _id 字段,则 Amazon DocumentDB 会自动生成 _id 值。

多列源数据

如果源数据包含多个列,则 Amazon DMS 根据所有这些列来构建 JSON 文档。要确定文档的 _id 字段,Amazon DMS 按如下方式继续:

  • 如果其中一个列被命名为 _id,则该列中的数据将用作目标 _id

  • 如果没有 _id 列,但源数据包含主键或唯一索引,则 Amazon DMS 使用该键或索引值作为 _id 值。主键或唯一索引中的数据也在 JSON 文档中显示为显式字段。

  • 如果没有 _id 列,且没有主键或唯一索引,则 Amazon DocumentDB 会自动生成 _id 值。

在目标终端节点强制转换数据类型

Amazon DMS 可以在数据写入到 Amazon DocumentDB 目标端点时修改数据结构。可以通过在源终端节点重命名列和表,或者通过提供运行任务时所应用的转换规则来请求这些更改。

使用嵌套 JSON 文档(json_ 前缀)

要强制转换数据类型,可以手动或使用转换的方式在源列名称中加上前缀 json_(即 json_columnName)。在这种情况下,该列作为目标文档中的嵌套 JSON 文档(而不是作为字符串字段)而创建。

例如,假设您要从 MongoDB 源终端节点迁移以下文档。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactDetails": "{"Home": {"Address": "Boston","Phone": "1111111"},"Work": { "Address": "Boston", "Phone": "2222222222"}}" }

如果不强制转换任何源数据类型,则嵌入的 ContactDetails 文档将作为字符串进行迁移。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactDetails": "{\"Home\": {\"Address\": \"Boston\",\"Phone\": \"1111111\"},\"Work\": { \"Address\": \"Boston\", \"Phone\": \"2222222222\"}}" }

但是,可以添加一个转换规则,以将 ContactDetails 强制转换为 JSON 对象。例如,假设原始源列名称为 ContactDetails。要将数据类型强制为嵌套 JSON,需要手动或通过转换规则在源端点上添加“*json_*”前缀,将源端点的列重命名为“json_contactDetails”。例如,您可以使用以下转换规则:

{ "rules": [ { "rule-type": "transformation", "rule-id": "1", "rule-name": "1", "rule-target": "column", "object-locator": { "schema-name": "%", "table-name": "%", "column-name": "ContactDetails" }, "rule-action": "rename", "value": "json_ContactDetails", "old-value": null } ] }

Amazon DMS 将 ContactDetails 字段复制为嵌套 JSON,如下所示。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactDetails": { "Home": { "Address": "Boston", "Phone": "1111111111" }, "Work": { "Address": "Boston", "Phone": "2222222222" } } }

使用 JSON 数组(array_ 前缀)

要强制转换数据类型,可以手动或使用转换的方式在列名称中加上前缀 array_(即 array_columnName)。在这种情况下,Amazon DMS 将该列视为 JSON 数组,并在目标文档中以这种方式创建它。

假设您要从 MongoDB 源终端节点迁移以下文档。

{ "_id" : "1", "FirstName": "John", "LastName": "Doe",
 "ContactAddresses": ["Boston", "New York"],
 "ContactPhoneNumbers": ["1111111111", "2222222222"] }

如果不强制转换任何源数据类型,则嵌入的 ContactDetails 文档将作为字符串进行迁移。

{ "_id": "1", "FirstName": "John", "LastName": "Doe",
 "ContactAddresses": "[\"Boston\", \"New York\"]",
 "ContactPhoneNumbers": "[\"1111111111\", \"2222222222\"]"
 }

但是,您可以添加转换规则,以将 ContactAddressContactPhoneNumbers 强制转换为 JSON 数组,如下表所示。

原始源列名称 重命名的源列
ContactAddress array_ContactAddress
ContactPhoneNumbers array_ContactPhoneNumbers

Amazon DMS 复制 ContactAddressContactPhoneNumbers,如下所示。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactAddresses": [ "Boston", "New York" ], "ContactPhoneNumbers": [ "1111111111", "2222222222" ] }

使用 TLS 连接到 Amazon DocumentDB

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

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

下载此 .pem 文件后,您可以将该文件包含的公有密钥导入到 Amazon DMS 中,如下所述。

Amazon Web Services Management Console

导入公有密钥 (.pem) 文件
  1. 打开 Amazon DMS 控制台 (https://console.aws.amazon.com/dms)。

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

  3. 选择导入证书,然后执行以下操作:

    • 对于 Certificate identifier (证书标识符),请输入证书的唯一名称,例如 docdb-cert

    • 对于 Import file (导入文件),请导航到要将 .pem 文件保存到的位置。

    根据需要设置完毕后,选择 Add new CA certificate (添加新的 CA 证书)

Amazon CLI

使用 aws dms import-certificate 命令,如以下示例所示。

aws dms import-certificate \ --certificate-identifier docdb-cert \ --certificate-pem file://./rds-combined-ca-bundle.pem

创建 Amazon DMS 目标终端节点时,请提供证书标识符(例如 docdb-cert)。另外,请将 SSL 模式参数设置为 verify-full

连接到 Amazon DocumentDB 弹性集群作为目标

在 Amazon DMS 版本 3.4.7 及更高版本中,您可以创建 Amazon DocumentDB 目标端点作为弹性集群。如果您将目标端点创建为弹性集群,则需要将新的 SSL 证书附加到您的 Amazon DocumentDB 弹性集群节点,因为您的现有 SSL 证书无法使用。

将新的 SSL 证书附加到您的 Amazon DocumentDB 弹性集群端点
  1. 例如,在浏览器中打开 https://www.amazontrust.com/repository/SFSRootCAG2.pem 并将内容保存到具有唯一文件名的 .pem 文件中,例如 SFSRootCAG2.pem。这是您需要在后续步骤中导入的证书文件。

  2. 创建弹性集群端点并设置以下选项:

    1. 端点配置下,选择添加新 CA 证书

    2. 对于证书标识符,输入 SFSRootCAG2.pem

    3. 对于导入证书文件,选择选择文件,然后导航到之前下载的 SFSRootCAG2.pem 文件。

    4. 选择并打开下载的 SFSRootCAG2.pem 文件。

    5. 选择导入证书

    6. 选择证书下拉列表中,选择 SFSRootCAG2.pem

下载的 SFSRootCAG2.pem 文件中的新 SSL 证书现已附加到您的 Amazon DocumentDB 弹性集群端点。

以 Amazon DocumentDB 作为目标的持续复制

如果以 Amazon DocumentDB 为目标启用持续复制(变更数据捕获,CDC),则 Amazon DMS 版本 3.5.0 及更高版本提供的性能提升将是之前版本的 20 倍。在之前的版本中,Amazon DMS 每秒最多可处理 250 条记录,Amazon DMS 现在每秒处理大约 5000 条记录。Amazon DMS 还可确保 Amazon DocumentDB 中的文档与源文件保持同步。创建或更新源记录时,Amazon DMS 必须首先通过执行以下操作来确定哪个 Amazon DocumentDB 记录受到影响:

  • 如果源记录有一个名称为 _id 的列,则该列的值将确定 Amazon DocumentDB 集合中的相应 _id

  • 如果没有 _id 列,但源数据有主键或唯一索引,则 Amazon DMS 使用该键或索引值作为 Amazon DocumentDB 集合的 _id

  • 如果源记录没有 _id 列、主键或唯一索引,则 Amazon DMS 会将所有源列与 Amazon DocumentDB 集合中的相应字段进行匹配。

创建新的源记录后,Amazon DMS 会将相应文档写入 Amazon DocumentDB。如果更新了现有的源记录,则 Amazon DMS 会更新 Amazon DocumentDB 中的目标文档中的相应字段。目标文档中存在而源记录中不存在的任何字段均保持不变。

删除源记录后,Amazon DMS 会从 Amazon DocumentDB 中删除相应文档。

源位置的结构变更 (DDL)

通过持续复制,对源数据结构(如表、列等)的任何更改都将传播到其在 Amazon DocumentDB 中的对应项。在关系数据库中,通过使用数据定义语言 (DDL) 语句启动这些更改。可以在下表中查看 Amazon DMS 如何将这些更改传播到 Amazon DocumentDB。

源位置的 DDL 对 Amazon DocumentDB 目标的影响
CREATE TABLE 创建一个空集合。
重命名表的语句(RENAME TABLEALTER TABLE...RENAME 及类似语句) 重命名集合。
TRUNCATE TABLE 从集合中删除所有文档,但前提是 HandleSourceTableTruncatedtrue。有关更多信息,请参阅更改处理 DDL 处理的任务设置
DROP TABLE 删除集合,但前提是 HandleSourceTableDroppedtrue。有关更多信息,请参阅更改处理 DDL 处理的任务设置
向表中添加一列的语句(ALTER TABLE...ADD 及类似语句) 将忽略 DDL 语句,并发出警告。在源位置执行第一个 INSERT 时,新字段将添加到目标文档。
ALTER TABLE...RENAME COLUMN 将忽略 DDL 语句,并发出警告。在源位置执行第一个 INSERT 时,新命名的字段将添加到目标文档。
ALTER TABLE...DROP COLUMN 将忽略 DDL 语句,并发出警告。
更改列数据类型的语句(ALTER COLUMN...MODIFY 及类似语句) 将忽略 DDL 语句,并发出警告。使用新数据类型在源位置执行第一个 INSERT 时,将创建包含该新数据类型的字段的目标文档。

使用 Amazon DocumentDB 作为目标的限制

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

  • 在 Amazon DocumentDB 中,集合名称不能包含美元符号 ($)。此外,数据库名称不能包含任何 Unicode 字符。

  • Amazon DMS 不支持将多个源表合并到单个 Amazon DocumentDB 集合。

  • 当 Amazon DMS 处理没有主键的源表中的更改时,将忽略该表中的任何 LOB 列。

  • 如果 Change table (更改表) 选项处于启用状态,并且 Amazon DMS 发现名为“_id”的源列,则该列将在更改表中显示为“__id”(两条下划线)。

  • 如果选择 Oracle 作为源终端节点,则 Oracle 源必须启用完整补充日志记录。否则,如果源位置有未更改的列,则数据将作为空值加载到 Amazon DocumentDB。

  • 不支持将复制任务设置 TargetTablePrepMode:TRUNCATE_BEFORE_LOAD 与 DocumentDB 目标端点一起使用。

使用以 Amazon DocumentDB 为目标的端点设置

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

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

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

replicateShardCollections

布尔值

true

false

true 时,此端点设置会产生以下效果并施加以下限制:

  • 允许 Amazon DMS 将数据复制到目标分片集合。仅当目标 DocumentDB 端点是弹性集群时,此设置才适用。

  • 必须将 TargetTablePrepMode 设置为 DO_NOTHING

  • Amazon DMS 在迁移期间自动将 useUpdateLookup 设置为 false

Amazon DocumentDB 的目标数据类型

在下表中,您可以找到使用 Amazon DMS 时支持的 Amazon DocumentDB 目标数据类型以及来自 Amazon DMS 数据类型的默认映射。有关 Amazon DMS 数据类型的更多信息,请参阅Amazon Database Migration Service 的数据类型

Amazon DMS 数据类型

Amazon DocumentDB 数据类型

BOOLEAN

布尔值

BYTES

二进制数据

DATE

日期

TIME

字符串 (UTF8)

DATETIME

日期

INT1

32 位整数

INT2

32 位整数

INT4

32 位整数

INT8

64 位整数

NUMERIC

字符串 (UTF8)

REAL4

Double

REAL8

Double

STRING

如果数据被识别为 JSON,则 Amazon DMS 会将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。

UINT1

32 位整数

UINT2

32 位整数

UINT4

64 位整数

UINT8

字符串 (UTF8)

WSTRING

如果数据被识别为 JSON,则 Amazon DMS 会将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。

BLOB

二进制

CLOB

如果数据被识别为 JSON,则 Amazon DMS 会将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。

NCLOB

如果数据被识别为 JSON,则 Amazon DMS 会将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。