本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用亚马逊 DocumentDB 作为AWS数据库迁移服务的目标
有关支持哪些版本的亚马逊 DocumentDB(兼容 MongoDB)的信息,请参阅。AWS DMS 的目标 AWS DMS您可以使用 AWS DMS 将数据从 AWS DMS 支持的任一源数据引擎迁移到 Amazon DocumentDB(与 MongoDB 兼容)。源引擎可以位于AWS托管服务上,例如 Amazon RDS、Aurora 或 Amazon S3。或者,引擎可以位于自我管理的数据库上,例如在亚马逊或本地运行的 MongoDB。 EC2
您可以使用将源数据复制AWS DMS到 Amazon DocumentDB 数据库、馆藏或文档。
注意
如果您的源端点是 MongoDB 或 Amazon DocumentDB,请在文档模式下运行迁移。
MongoDB 以二进制 JSON 格式 (BSON) 存储数据。 AWS DMS支持 Amazon DocumentDB 支持的所有 BSON 数据类型。有关这些数据类型的列表,请参阅 Amazon DocumentDB 开发者 APIs指南中的支持的 MongoDB 、操作和数据类型。
如果源终端节点是关系数据库,则按如下方式将数据库对象AWS DMS映射到 Amazon DocumentDB:
-
关系数据库或数据库架构映射到 Amazon DocumentDB 数据库。
-
关系数据库中的表映射到 Amazon DocumentDB 中的集合。
-
关系表中的记录映射到 Amazon DocumentDB 中的文档。每个文档均由源记录中的数据构成。
如果源端点为 Amazon S3,则生成的 Amazon DocumentDB 对象对应于 Amazon S3 的 AWS DMS 映射规则。例如,考虑以下 URI。
s3://amzn-s3-demo-bucket/hr/employee
在本例中,将对象AWS DMS映射amzn-s3-demo-bucket到亚马逊文档数据库,如下所示:
-
顶级 URI 部分(
hr)映射到 Amazon DocumentDB 数据库。 -
接下来的 URI 部分(
employee)映射到 Amazon DocumentDB 集合。 -
employee中的每个对象都映射到 Amazon DocumentDB 中的一个文档。
有关 Amazon S3 的映射规则的更多信息,请参阅使用亚马逊 S3 作为来源 AWS DMS。
Amazon DocumentDB 端点设置
在 3.5.0 及更高AWS DMS版本中,您可以通过调整并行线程和批量操作的任务设置来提高 Amazon DocumentDB 终端节点的更改数据捕获 (CDC) 性能。为此,您可以使用 ParallelApply* 任务设置来指定并发线程的数量、每个线程的队列数以及要存储在缓冲区中的记录数。例如,假设您要执行 CDC 加载并且要并行应用 128 个线程。您还希望对于每个线程访问 64 个队列,每个缓冲区存储 50 条记录。
为了提高 CDC 性能,AWS DMS支持以下任务设置:
-
ParallelApplyThreads— 指定 CDC 加载期间AWS DMS用于将数据记录推送到 Amazon DocumentDB 目标终端节点的并发线程数。默认值为零(0),最大值为 32。 -
ParallelApplyBufferSize– 指定在 CDC 加载过程中,要在每个缓冲区队列中存储的、供并发线程推送到目标 Amazon DocumentDB 端点的最大记录数。默认值是 100,最大值是 1,000。当ParallelApplyThreads指定多个线程时,请使用此选项。 -
ParallelApplyQueuesPerThread– 指定每个线程访问以将数据记录从队列中取出并在 CDC 期间为 Amazon DocumentDB 端点生成批处理负载的队列数。默认值是 1。最大值为 512。
有关使用亚马逊 DocumentDB 作为目标的更多详情AWS DMS,请参阅以下各节:
主题
注意
有关迁移过程的 step-by-step演练,请参阅迁移指南中的从 MongoDB 迁移到 Amazon DocumentDB。AWS Database Migration Service Step-by-Step
将数据从源映射到 Amazon DocumentDB 目标
AWS DMS从源端点读取记录,并根据其读取的数据构建 JSON 文档。对于每个 JSON 文档,AWS DMS必须确定一个_id字段作为唯一标识符。然后,它使用 _id 字段作为主键,将 JSON 文档写入到 Amazon DocumentDB 集合。
单列源数据
如果源数据包含单个列,则数据必须是字符串类型。(根据源引擎的不同,实际的数据类型可能是 VARCHAR、NVARCHAR、TEXT、LOB、CLOB 或类似类型。) AWS DMS假设数据是有效的 JSON 文档,并按原样将数据复制到 Amazon DocumentDB。
如果生成的 JSON 文档包含名为 _id 的字段,则该字段用作 Amazon DocumentDB 中的唯一 _id。
如果 JSON 不包含 _id 字段,则 Amazon DocumentDB 会自动生成 _id 值。
多列源数据
如果源数据由多列组成,则根据所有这些列AWS DMS构造一个 JSON 文档。要确定文档的_id字段,请按AWS DMS以下步骤操作:
-
如果其中一个列被命名为
_id,则该列中的数据将用作目标_id。 -
如果没有
_id列,但源数据有主键或唯一索引,则AWS DMS使用该键或索引值作为_id值。主键或唯一索引中的数据也在 JSON 文档中显示为显式字段。 -
如果没有
_id列,且没有主键或唯一索引,则 Amazon DocumentDB 会自动生成_id值。
在目标终端节点强制转换数据类型
AWS DMS在写入 Amazon DocumentDB 目标终端节点时可以修改数据结构。可以通过在源终端节点重命名列和表,或者通过提供运行任务时所应用的转换规则来请求这些更改。
使用嵌套 JSON 文档(json_ 前缀)
要强制转换数据类型,可以手动或使用转换的方式在源列名称中加上前缀 json_(即 json_)。在这种情况下,该列作为目标文档中的嵌套 JSON 文档(而不是作为字符串字段)而创建。columnName
例如,假设您要从 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_*ContactDetails” 前缀或通过转换规则将源端点的列重命名为 json_”。例如,您可以使用以下转换规则:
{ "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 } ] }
AWS DMS将该 ContactDetails 字段复制为嵌套 JSON,如下所示。
{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactDetails": { "Home": { "Address": "Boston", "Phone": "1111111111" }, "Work": { "Address": "Boston", "Phone": "2222222222" } } }
使用 JSON 数组(array_ 前缀)
要强制转换数据类型,可以手动或使用转换的方式在列名称中加上前缀 array_(即 array_)。在这种情况下,会将该列AWS DMS视为 JSON 数组,并在目标文档中这样创建它。columnName
假设您要从 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\"]" }
但是,您可以添加转换规则,以将 ContactAddress 和 ContactPhoneNumbers 强制转换为 JSON 数组,如下表所示。
| 原始源列名称 | 重命名的源列 |
|---|---|
ContactAddress |
array_ContactAddress |
ContactPhoneNumbers |
array_ContactPhoneNumbers |
AWS DMS复制ContactAddress并如下ContactPhoneNumbers所示。
{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactAddresses": [ "Boston", "New York" ], "ContactPhoneNumbers": [ "1111111111", "2222222222" ] }
使用 TLS 连接到 Amazon DocumentDB
默认情况下,新创建的 Amazon DocumentDB 集群仅接受使用传输层安全性协议(TLS)的安全连接。当 TLS 启用时,每个到 Amazon DocumentDB 的连接都需要公有密钥。
您可以通过从AWS托管的 Amazon S3 存储桶下载文件来检索 Amazon DocumentDB 的公钥。rds-combined-ca-bundle.pem有关下载此文件的更多信息,请参阅《Amazon DocumentDB 开发人员指南》中的使用 TLS 加密连接
下载此.pem 文件后,您可以按AWS DMS如下所述将其中包含的公钥导入其中。
AWS 管理控制台
导入公有密钥 (.pem) 文件
-
在 https://console.aws.amazon.com/dm AWS DMS
s 上打开控制台。 -
在导航窗格中,选择证书。
-
选择导入证书,然后执行以下操作:
对于 Certificate identifier (证书标识符),请输入证书的唯一名称,例如
docdb-cert。-
对于 Import file (导入文件),请导航到要将 .pem 文件保存到的位置。
根据需要设置完毕后,选择 Add new CA certificate (添加新的 CA 证书)。
AWS CLI
使用 aws dms import-certificate 命令,如以下示例所示。
aws dms import-certificate \ --certificate-identifier docdb-cert \ --certificate-pem file://./rds-combined-ca-bundle.pem
创建AWS DMS目标终端节点时,请提供证书标识符(例如docdb-cert)。另外,请将 SSL 模式参数设置为 verify-full。
连接到 Amazon DocumentDB 弹性集群作为目标
在 3.4.7 及更高AWS DMS版本中,您可以将 Amazon DocumentDB 目标终端节点创建为弹性集群。如果您将目标端点创建为弹性集群,则需要将新的 SSL 证书附加到您的 Amazon DocumentDB 弹性集群节点,因为您的现有 SSL 证书无法使用。
将新的 SSL 证书附加到您的 Amazon DocumentDB 弹性集群端点
-
例如,在浏览器中,打开 https://www.amazontrust.com/repository/SFSRootCAG2.pem
并将内容保存到具有 .pem唯一文件名的文件中。SFSRootCAG2.pem这是您需要在后续步骤中导入的证书文件。 -
创建弹性集群端点并设置以下选项:
-
在端点配置下,选择添加新 CA 证书。
-
对于证书标识符,输入
SFSRootCAG2.pem。 -
对于导入证书文件,选择选择文件,然后导航到之前下载的
SFSRootCAG2.pem文件。 -
选择并打开下载的
SFSRootCAG2.pem文件。 -
选择导入证书。
-
从 “选择证书” 下拉列表中,选择 SFSRootCAG2.pem。
-
下载的 SFSRootCAG2.pem 文件中的新 SSL 证书现已附加到您的 Amazon DocumentDB 弹性集群端点。
以 Amazon DocumentDB 作为目标的持续复制
如果以 Amazon DocumentDB 为目标启用持续复制(变更数据捕获,CDC),则 AWS DMS 版本 3.5.0 及更高版本提供的性能提升将是之前版本的 20 倍。在之前的版本中,每秒最多可AWS DMS处理 250 条记录,AWS DMS现在每秒可以高效处理 5000 多条记录。 AWS DMS还可确保 Amazon DocumentDB 中的文档与源文件保持同步。创建或更新源记录时,AWS DMS必须首先通过执行以下操作来确定哪个 Amazon DocumentDB 记录会受到影响:
-
如果源记录有一个名称为
_id的列,则该列的值将确定 Amazon DocumentDB 集合中的相应_id。 -
如果没有
_id列,但源数据有主键或唯一索引,则AWS DMS使用该键或索引值作为 Amazon DocumentDB 集合的。_id -
如果源记录没有
_id列、主键或唯一索引,则将所有源列AWS DMS与 Amazon DocumentDB 集合中的相应字段进行匹配。
创建新的源记录时,AWS DMS会将相应的文档写入亚马逊文档数据库。如果更新了现有源记录,AWS DMS则会更新 Amazon DocumentDB 中目标文档中的相应字段。目标文档中存在而源记录中不存在的任何字段均保持不变。
删除源记录后,AWS DMS会从 Amazon DocumentDB 中删除相应的文档。
源位置的结构变更 (DDL)
通过持续复制,对源数据结构(如表、列等)的任何更改都将传播到其在 Amazon DocumentDB 中的对应项。在关系数据库中,通过使用数据定义语言 (DDL) 语句启动这些更改。您可以在下表中看到这些更改是如何AWS DMS传播到 Amazon DocumentDB 的。
| 源位置的 DDL | 对 Amazon DocumentDB 目标的影响 |
|---|---|
CREATE TABLE |
创建一个空集合。 |
重命名表的语句(RENAME TABLE、ALTER TABLE...RENAME 及类似语句) |
重命名集合。 |
TRUNCATE TABLE |
从集合中删除所有文档,但前提是 HandleSourceTableTruncated 为 true。有关更多信息,请参阅 更改处理 DDL 处理的任务设置。 |
DROP TABLE |
删除集合,但前提是 HandleSourceTableDropped 为 true。有关更多信息,请参阅 更改处理 DDL 处理的任务设置。 |
向表中添加一列的语句(ALTER
TABLE...ADD 及类似语句) |
将忽略 DDL 语句,并发出警告。在源位置执行第一个 INSERT 时,新字段将添加到目标文档。 |
ALTER TABLE...RENAME COLUMN |
将忽略 DDL 语句,并发出警告。在源位置执行第一个 INSERT 时,新命名的字段将添加到目标文档。 |
ALTER TABLE...DROP COLUMN |
将忽略 DDL 语句,并发出警告。 |
更改列数据类型的语句(ALTER
COLUMN...MODIFY 及类似语句) |
将忽略 DDL 语句,并发出警告。使用新数据类型在源位置执行第一个 INSERT 时,将创建包含该新数据类型的字段的目标文档。 |
使用 Amazon DocumentDB 作为目标的限制
使用亚马逊 DocumentDB 作为目标时,以下限制适用:AWS DMS
-
在 Amazon DocumentDB 中,集合名称不能包含美元符号($)。此外,数据库名称不能包含任何 Unicode 字符。
-
AWS DMS不支持将多个源表合并为一个 Amazon DocumentDB 集合。
-
当AWS DMS处理来自没有主键的源表发生变化时,该表中的任何 LOB 列都将被忽略。
-
如果更改表选项处于启用状态,并且 AWS DMS 发现名为“_id”的源列,则该列将在更改表中显示为“__id”(两条下划线)。
-
如果选择 Oracle 作为源终端节点,则 Oracle 源必须启用完整补充日志记录。否则,如果源位置有未更改的列,则数据将作为空值加载到 Amazon DocumentDB。
-
不支持将复制任务设置
TargetTablePrepMode:TRUNCATE_BEFORE_LOAD与 DocumentDB 目标端点一起使用。 -
Amazon DocumentDB 不支持 MongoDB 受限集合。但是,AWS DMS 会自动将此类对象迁移为目标 DocumentDB 上的不受限集合。
使用以 Amazon DocumentDB 为目标的端点设置
您可以使用端点设置来配置 Amazon DocumentDB 目标,这与使用额外连接属性类似。您可以在使用AWS DMS控制台创建目标端点时指定设置,或者使用中的create-endpoint命令和 --doc-db-settings '{" JSON 语法。AWS CLIEndpointSetting":
"value", ...}'
下表显示了在将 Amazon DocumentDB 作为目标时可以使用的端点设置。
| 属性名称 | 有效值 | 默认值和描述 |
|---|---|---|
|
|
布尔值
|
在
|
Amazon DocumentDB 的目标数据类型
在下表中,您可以找到使用 AWS DMS 时支持的 Amazon DocumentDB 目标数据类型,以及 DMS 数据类型的默认映射。AWS有关 AWS DMS 数据类型的更多信息,请参阅AWS Database Migration Service 的数据类型。
|
AWSDMS 数据类型 |
Amazon DocumentDB 数据类型 |
|---|---|
|
BOOLEAN |
布尔值 |
|
BYTES |
二进制数据 |
|
DATE |
日期 |
|
TIME |
字符串 (UTF8) |
|
DATETIME |
日期 |
|
INT1 |
32 位整数 |
|
INT2 |
32 位整数 |
|
INT4 |
32 位整数 |
|
INT8 |
64 位整数 |
|
NUMERIC |
字符串 (UTF8) |
|
REAL4 |
双精度 |
|
REAL8 |
双精度 |
|
string |
如果数据被识别为 JSON,则将其作为文档AWS DMS迁移到 Amazon DocumentDB。否则,数据将映射到字符串 (UTF8)。 |
|
UINT1 |
32 位整数 |
|
UINT2 |
32 位整数 |
|
UINT4 |
64 位整数 |
|
UINT8 |
字符串 (UTF8) |
|
WSTRING |
如果数据被识别为 JSON,则将其作为文档AWS DMS迁移到 Amazon DocumentDB。否则,数据将映射到字符串 (UTF8)。 |
|
BLOB |
二元 |
|
CLOB |
如果数据被识别为 JSON,则将其作为文档AWS DMS迁移到 Amazon DocumentDB。否则,数据将映射到字符串 (UTF8)。 |
|
NCLOB |
如果数据被识别为 JSON,则将其作为文档AWS DMS迁移到 Amazon DocumentDB。否则,数据将映射到字符串 (UTF8)。 |