迁移到 Amazon DocumentDB - Amazon DocumentDB
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

迁移到 Amazon DocumentDB

Amazon DocumentDB(与 MongoDB 兼容)是一项完全托管的与 MongoDB API 兼容的数据库服务。您可以使用本部分中详述的过程,将数据从本地或 Amazon Elastic Compute Cloud (Amazon EC2) 上运行的 MongoDB 数据库迁移到 Amazon DocumentDB。

迁移工具

要迁移到 Amazon DocumentDB,大多数客户使用的两个主要工具是 Amazon Database Migration Service (Amazon DMS) 和命令行实用程序,例如mongodumpmongorestore。作为最佳做法,对于上述任一选项,我们建议您在开始迁移之前首先在 Amazon DocumentDB 中创建索引,因为这可以减少总体时间并提高迁移速度。为此,您可以使用 Amazon DocumentDB 索引工具

Amazon Database Migration Service

Amazon Database Migration Service (Amazon DMS) 是一项云服务,可以轻松地将关系数据库和非关系数据库迁移到 Amazon DocumentDB。您可以使用将数据从本地或 Amazon DMS EC2 上托管的数据库迁移到 Amazon DocumentDB。使用 Amazon DMS,您可以执行一次性迁移,也可以复制正在进行的更改以使源和目标保持同步。

有关使用迁移 Amazon DMS 到亚马逊 DocumentDB 的更多信息,请参阅:

命令行实用程序

用于将数据迁移到 Amazon DocumentDB 和从 Amazon DocumentDB 迁移数据的通用实用程序,包括 mongodumpmongorestoremongoexportmongoimport。通常,mongodumpmongorestore 是最有效的实用程序,因为它们使用二进制格式在数据库中转储和还原数据。这通常是性能最高的选项,而且与逻辑导出相比,产生的数据量更少。如果您要使用 JSON 或 CSV 等逻辑格式导出和导入数据,可以使用 mongoexportmongoimport,因为此时数据是人类可读格式,但速度通常比 mongodump/mongorestore 慢,而且得到的数据量也较多。

以下迁移方法部分将根据您的用例 Amazon DMS 和要求讨论何时最适合使用以及命令行实用程序。

Discovery

对于您的每个 MongoDB 部署,您应该确定并记录两组数据:架构详情运行特征。该信息将帮助您选择适当的迁移方法和集群大小调整。

架构详情
  • 名称

    选择用于跟踪该部署的唯一名称。

     

  • 版本

    记录部署正在运行的 MongoDB 版本。要查找版本,请使用 mongo shell 连接到副本集成员并运行 db.version() 操作。

     

  • 类型

    记录您的部署是独立的 mongo 实例、副本集还是分片集群。

     

  • 成员

    记录每个集群、副本集或独立成员的主机名、地址和端口。

     

    对于集群化部署,您可以通过使用 mongo shell 连接到 mongo 主机并运行 sh.status() 操作来查找分片成员。

     

    对于副本集,您可以通过使用 mongo shell 连接到副本集成员并运行 rs.status() 操作来获取成员。

     

  • Oplog 大小

    对于副本集或分片集群,记录每个副本集成员的 oplog 大小。要查找成员的 oplog 大小,请使用 mongo shell 连接到副本集成员并运行 ps.printReplicationInfo() 操作。

     

  • 副本集成员优先级

    对于副本集或分片集群,记录每个副本集成员的优先级。要查找副本集成员优先级,请使用 mongo shell 连接到副本集成员并运行 rs.conf() 操作。优先级显示为 priority 键的值。

     

  • 是否使用 TLS/SSL

    记录是否在每个节点上使用传输层安全性 (TLS)/安全套接字层 (SSL) 进行传输加密。

运行特征
  • 数据库统计数据

    对于每个集合,记录以下信息:

    • 名称

    • 数据大小

    • 集合数量

     

    要查找数据库统计数据,请使用 mongo shell 连接到数据库并运行命令 db.runCommand({dbstats: 1})

     

  • 集合统计数据

    对于每个集合,记录以下信息:

    • 命名空间

    • 数据大小

    • 索引数量

    • 集合是否有上限

     

  • 索引统计数据

    对于每个集合,记录以下索引信息:

    • 命名空间

    • ID

    • 大小

    • TTL

    • 稀疏

    • 背景

     

    要查找索引信息,请使用 mongo shell 连接到数据库并运行命令 db.collection.getIndexes()

     

  • Opcounters

    该信息可帮助您了解当前的 MongoDB 工作负载模式(读取操作繁重、写入操作繁重还是平衡)。它还能够为您的初始 Amazon DocumentDB 实例选择提供指导。

     

    以下是要在监测期间收集的关键信息(以计数/秒为单位):

    • 查询

    • 插入

    • 更新

    • 删除

     

    您可以通过绘制一段时间内 db.serverStatus() 命令的输出来获取该信息。也可以使用 mongostat 工具获取这些统计数据的即时值。但使用该选项时,您的迁移计划可能无法涵盖峰值负载。

     

  • 网络统计数据

    该信息可帮助您了解当前的 MongoDB 工作负载模式(读取操作繁重、写入操作繁重还是平衡)。它还能够为您的初始 Amazon DocumentDB 实例选择提供指导。

     

    以下是要在监测期间收集的关键信息(以计数/秒为单位):

    • 连接

    • 网络输入字节数

    • 网络输出字节数

     

    您可以通过绘制一段时间内 db.serverStatus() 命令的输出来获得该信息。也可以使用 mongostat 工具获取这些统计数据的即时值。但使用该选项时,您的迁移计划可能无法涵盖峰值负载。

规划:Amazon DocumentDB 集群要求

要实现成功迁移,您需要仔细考虑 Amazon DocumentDB 集群的配置以及应用程序访问集群的方式。在确定集群要求时,请考虑以下每个维度:

  • 可用性

    Amazon DocumentDB 通过部署副本实例提供高可用性,副本实例可在称为失效转移的过程中提升为主实例。通过将副本实例部署到不同的可用区,您可以实现更高级别的可用性。

     

    下表提供了 Amazon DocumentDB 部署配置指南,以满足特定的可用性目标。

     

    可用性目标 实例总数 副本 可用区
    99% 1 0 1
    99.9% 2 1 2
    99.99% 3 2 3

     

    整体系统可靠性必须考虑所有组件,而不仅仅是数据库。有关满足整体系统可靠性需求的最佳实践和建议,请参阅Amazon Well-Architected Reliability Pillar Whitepaper

     

  • 性能

    Amazon DocumentDB 实例允许您读写集群的存储卷。集群实例有多种类型,它们具有不同的内存和 vCPU,这将影响集群的读写性能。使用您在发现阶段收集的信息,选择可支持您的工作负载性能要求的实例类型。有关受支持实例类型的列表,请参阅 管理实例类

     

    为 Amazon DocumentDB 集群选择实例类型时,请考虑工作负载性能要求的以下方面:

    • vCPU 需要更高连接数的架构可能会受益于具有更多 vCPU 的实例。

       

    • 内存 如果可能,将工作数据集保留在内存中可提供最高的性能。一项基本准则是为 Amazon DocumentDB 引擎预留三分之一的实例内存,将剩余的三分之二用于工作数据集。

       

    • 连接 最小的最佳连接数是每个 Amazon DocumentDB 实例 vCPU 8 个连接。虽然 Amazon DocumentDB 实例的连接限制要高得多,但在连接数超过每 vCPU 8 个连接后,更多连接带来的性能优势将下降。

       

    • 网络 具有大量客户端或连接的工作负载应考虑插入和检索数据所需的聚合网络性能。批量操作可更有效地使用网络资源。

       

    • 插入性能 单个文档插入通常是将数据插入 Amazon DocumentDB 的最慢方式。批量插入操作要比单个插入快得多。

       

    • 读取性能 从工作内存读取始终比从存储卷返回的读取要快。因此,优化实例内存大小以将工作集保留在内存中是最佳的做法。

       

    除了从主实例提供读取之外,Amazon DocumentDB 集群还会自动配置为副本集。之后,您可以通过在 MongoDB 驱动程序中设置读取首选项来将只读查询路由到只读副本。您可以通过添加副本来扩展读取流量,从而减少主实例上的总体负载。

     

    可以在同一集群中部署不同实例类型的 Amazon DocumentDB 副本。一个作为示例的使用案例是启动一个具有较大实例类型的副本来处理临时分析流量。如果部署一组混合实例类型,请确保为每个实例配置失效转移优先级。这有助于确保失效转移事件始终提升足够大小的副本来处理写入负载。

     

  • 恢复

    Amazon DocumentDB 在写入数据时会持续备份数据。它在可配置的 1-35 天(称为备份保留期)内提供 point-in-time 恢复 (PITR) 功能。默认备份保留期为一天。Amazon DocumentDB 还自动创建存储卷的每日快照,这些快照也会在配置的备份保留期内保留。

     

    如果要保留超过备份保留期的快照,也可以随时使用 Amazon Web Services Management Console 和 Amazon Command Line Interface (Amazon CLI) 启动手动快照。有关更多信息,请参阅 在 Amazon DocumentDB 中进行备份和恢复

     

    在规划迁移时,请考虑以下事项:

    • 选择满足恢复点目标 (RPO) 要求的备份保留期(1–35 天)。

    • 确定是否需要手动快照,如果需要,确定时间间隔。

迁移方法

主要有三种方法可用于将数据迁移到 Amazon DocumentDB。

注意

虽然您可以随时在 Amazon DocumentDB 中创建索引,但整体来说,先创建索引,然后再导入大型数据集的速度会更快。作为最佳做法,我们建议对于以下每种方法,在执行迁移之前首先在 Amazon DocumentDB 中创建索引。为此,您可以使用 Amazon DocumentDB 索引工具

离线

离线方法使用 mongodumpmongorestore 工具将数据从源 MongoDB 部署迁移到 Amazon DocumentDB 集群。离线方法是最简单的迁移方法,但是它也会给集群带来最多的停机时间。

离线迁移的基本过程如下所示:

  1. Quiesce 对 MongoDB 源进行写入。

  2. 从源 MongoDB 部分转储集合数据和索引。

  3. 如果您要迁移到弹性集群,请使用sh.shardCollection()命令创建分片集合。如果您要迁移到基于实例的集群,请跳到下一步。

  4. 将索引还原到 Amazon DocumentDDB 集群。

  5. 将集合数据还原到 Amazon DocumentDB 集群。

  6. 将您的应用程序端点更改为写入到 Amazon DocumentDB 集群。


               图:迁移到 Amazon DocumentDB 的离线方法

在线

在线 方法使用 Amazon Database Migration Service (Amazon DMS)。它执行从源 MongoDB 部署到 Amazon DocumentDB 集群的数据完全加载。然后,它会切换至更改数据捕获 (CDC) 模式来复制更改。在线方法可最大限度减少集群停机时间,但它是三种方法中速度最慢的一个。

在线迁移的基本过程如下所示:

  1. 您的应用程序正常使用源数据库。

  2. 如果您要迁移到弹性集群,请使用sh.shardCollection()命令创建分片集合。如果您要迁移到基于实例的集群,请跳到下一步。

  3. 将索引还原到 Amazon DocumentDB 集群。

  4. 创建 Amazon DMS 任务以执行满载,然后启用从源 MongoDB 部署到 Amazon DocumentDB 集群的 CDC。

  5. Amazon DMS 任务完成满载并正在复制对 Amazon DocumentDB 的更改后,将应用程序的终端节点切换到 Amazon DocumentDB 集群。


               图:迁移到 Amazon DocumentDB 的在线方法

有关使用 Amazon DMS 迁移的更多信息,请参阅Amazon Database Migration Service 用户指南中的使用 Amazon DocumentDB 作为目标 Amazon Database Migration Service和相关教程

混合

混合方法使用 mongodumpmongorestore 工具将数据从源 MongoDB 部署迁移到 Amazon DocumentDB 集群。然后,它 Amazon DMS 在 CDC 模式下使用来复制更改。混合方法使迁移速度和停机时间达到平衡,但它是这三种方法中最复杂的方法。

混合迁移的基本过程如下所示:

  1. 您的应用程序正常使用源 MongoDB 部署。

  2. 从源 MongoDB 部分转储集合数据和索引。

  3. 将索引还原到 Amazon DocumentDB 集群。

  4. 如果您要迁移到弹性集群,请使用sh.shardCollection()命令创建分片集合。如果您要迁移到基于实例的集群,请跳到下一步。

  5. 将集合数据还原到 Amazon DocumentDB 集群。

  6. 创建 Amazon DMS 任务以启用 CDC 从源 MongoDB 部署到 Amazon DocumentDB 集群。

  7. 当 Amazon DMS 任务在可接受的窗口内复制更改时,请将您的应用程序终端节点更改为写入 Amazon DocumentDB 集群。


               图:迁移到 Amazon DocumentDB 的混合方法
重要

一个 Amazon DMS 任务目前只能迁移一个数据库。如果 MongoDB 源具有大量数据库,则可能需要实现迁移任务的自动创建,或考虑使用离线方法。

不管您选择何种迁移方法,在迁移数据之前,在 Amazon DocumentDB 集群中预先创建索引都是一种最有效的措施。这是因为 Amazon DocumentDB 索引是并行插入的数据,但对现有数据创建索引是单线程操作。

由于 Amazon DMS 不会迁移索引(仅迁移您的数据),因此无需执行额外步骤即可避免再次创建索引。

迁移源

如果您的 MongoDB 源是一个独立的 mongo 进程,并且您想要使用在线或混合迁移方法,请先将独立的 mongo 转换为副本集,以便创建 oplog 来用作 CDC 源。

如果您要从 MongoDB 副本集或分片集群进行迁移,请考虑为每个副本集或分片创建链接或隐藏的辅助副本集或分片来用作迁移源。执行数据转储可能会迫使工作集数据超出内存并影响生产实例的性能。您可以通过从不提供生产数据的节点迁移来降低这一风险。

迁移源版本

如果源 MongoDB 数据库版本与目标 Amazon DocumentDB 集群的兼容版本不同,您可能需要采取其他准备步骤来确保成功迁移。最常遇到的两个要求是将源 MongoDB 安装升级到支持的迁移版本(MongoDB 3.0 或更高版本),和升级应用程序驱动程序以支持目标 Amazon DocumentDB 版本。

如果您的迁移具有上述任一要求,请务必在迁移计划中包括这些步骤,以升级和测试任何驱动程序更改。

迁移连接

您可以从在数据中心中运行的源 MongoDB 部署或从在 Amazon DocumentDB 实例上运行的 MongoDB 部署迁移到 Amazon DocumentDB。从在 EC2 上运行的 MongoDB 迁移很简单,只需要正确配置安全组和子网。


            图:从 Amazon EC2 源迁移到 Amazon DocumentDB

从本地数据库迁移需要 MongoDB 部署与虚拟私有云(VPC)之间的连接。您可以通过虚拟专用网络 (VPN) 连接或使用该 Amazon Direct Connect 服务来实现此目的。虽然您可以通过 Internet 迁移到 VPC,但从安全角度来看,这种连接方法是最不可取的。

下图说明了通过 VPN 连接从本地源到 Amazon DocumentDB 的迁移。


            图:从本地源 (VPN) 迁移到 Amazon DocumentDB

下图表示使用 Amazon Direct Connect从本地源到 Amazon DocumentDB 的迁移。


            图:从本地源 (Amazon Direct Connect) 迁移到 Amazon DocumentDB

在线和混合迁移方法需要使用 Amazon DMS 实例,该实例必须在 Amazon VPC 中的 Amazon EC2 上运行。所有方法都需要迁移服务器来运行 mongodumpmongorestore。通常,在启动 Amazon DocumentDB 集群的 VPC 中的 Amazon EC2 实例上运行迁移服务器会更容易,因为这能够大幅简化与 Amazon DocumentDB 集群的连接。

测试

以下是迁移前测试的目标:

  • 验证所选方法能否实现期望的迁移结果。

  • 验证实例类型和读取首选项选择是否满足应用程序的性能要求。

  • 验证应用程序在失效转移期间的行为。

迁移计划测试注意事项

在测试 Amazon DocumentDB 迁移计划时,请考虑以下事项。

还原索引

默认情况下,mongorestore 会为转储的集合创建索引,但是在还原数据后创建它们。在将数据还原到集群之前,在 Amazon DocumentDB 中创建索引总体上更快。这是因为索引操作在数据加载期间是并行化的。

如果您选择预先创建索引,则在使用 mongorestore 还原数据时可通过提供 -–noIndexRestore 选项跳过索引创建步骤。

转储数据

mongodump 工具是从源 MongoDB 部署转储数据的首选方法。根据迁移实例上的可用资源,您也许可以通过使用 mongodump 选项增加转储的并行连接数(默认为 4)来加速 –-numParallelCollections

还原数据

mongorestore 工具是将转储数据还原到 Amazon DocumentDB 实例的首选方法。您可以通过使用 -–numInsertionWorkersPerCollection 选项增加还原期间每个集合的工作线程数来提高还原性能。可以从为 Amazon DocumentDB 集群主实例上的每个 vCPU 分配 1 个工作线程开始。

Amazon DocumentDB 当前不支持 mongorestore 工具的 --oplogReplay 选项。

默认情况下,mongorestore 将跳过插入错误并继续还原过程。如果您将不支持的数据还原到 Amazon DocumentDB 实例,就会发生这种情况。例如,您的文档包含带有空字符串的键或值。如果您希望在遇到任何还原错误时完全停止 mongorestore 操作,请使用 --stopOnError 选项。

Oplog 大小调整

MongoDB 操作日志 (oplog) 是一种受限集合,其中包含对数据库的所有数据修改。您可以通过对副本集或分片成员运行 db.printReplicationInfo() 操作来查看 oplog 的大小及其包含的时间范围。

如果您使用的是在线或混合方法,请确保每个副本集或分片上的操作日志足够大,足以包含在整个数据迁移过程(无论是通过mongodump还是 Amazon DMS 任务满载)期间所做的所有更改,并留出合理的缓冲区。有关更多信息,请参阅 MongoDB 文档中的 Check the Size of the Oplog (查看 Oplog 的大小)。通过记录 mongodumpmongorestore 进程或 Amazon DMS 完全加载任务首次测试运行所用的时间来确定所需的最小 oplog 大小。

Amazon Database Migration Service 配置

Amazon Database Migration Service 用户指南涵盖了将 MongoDB 源数据迁移到 Amazon DocumentDB 集群所需的组件和步骤。以下是用于 Amazon DMS 执行在线或混合迁移的基本过程:

要使用执行迁移 Amazon DMS
  1. 创建 MongoDB 源端点。有关更多信息,请参阅使用 MongoDB 作为 Amazon DMS源

  2. 创建 Amazon DocumentDB 接口端点。有关更多信息,请参阅使用 Amazon DMS 端点

    如果您要将目标端点配置为弹性集群,请注意您的现有 Amazon DocumentDB SSL 证书不适用于弹性集群,您需要使用以下步骤将新的 SSL 证书附加到端点:

    a. 访问 https://www.amazontrust.com/repository/SFSRootCAG2.pem 并将其内容保存为 “SFSRootCAG2.pem” 文件。这是您在后续步骤中需要导入的证书文件。

    b. 创建弹性集群端点时,在端点配置下,选择添加新 CA 证书

    • 对于 Certificate identifier (证书标识符),输入 SFSRootCAG2.pem

    • 对于 Import certificate file (导入证书文件),选择 Choose file (选择文件),然后导航到之前下载的 SFSRootCAG2.pem 文件。选择并打开此文件。选择导入证书,然后从选择证书下拉列表中选择 SFSRootCAG2.pem

  3. 至少创建一个 Amazon DMS 复制实例。有关更多信息,请参阅使用 Amazon DMS 复制实例

  4. 至少创建一个 Amazon DMS 复制任务。有关更多信息,请参阅使用 Amazon DMS 任务

    对于在线迁移,迁移任务使用迁移类型 Migrate existing data and replicate ongoing changes (迁移现有数据并复制持续更改)

    对于混合迁移,迁移任务使用迁移类型 Replicate data changes only (仅复制数据更改)。您可以选择 CDC 开始时间以与 mongodump 操作中的转储时间保持一致。MongoDB oplog 是幂等的。为避免遗漏更改,最好在 mongodump 完成时间与 CDC 开始时间之间保留几分钟的重叠时间。

从分片集群迁移

将数据从分片集群迁移到 Amazon DocumentDB 实例的过程基本上是并行迁移多个副本集的过程。测试分片集群迁移时的一个关键考虑因素是某些分片可能比其他分片使用得更频繁。这种情况会导致数据迁移具有不同的运行时间。在规划和测试时,请务必评估每个分片的 oplog 要求。

以下是迁移分片集群时要考虑的一些配置问题:

  • 在运行 mongodump 或启动 Amazon DMS 迁移任务之前,必须禁用分片集群均衡器并等待所有正在进行的迁移完成。有关更多信息,请参阅 MongoDB 文档中的 Disable the Balancer (禁用均衡器)

  • 如果您使用 Amazon DMS 复制数据,请在运行迁移任务之前在每个分片上运行该cleanupOrphaned命令。如果不运行该命令,任务可能会因为重复的文档 ID 而失败。请注意,该命令可能会影响性能。有关更多信息,请参阅 MongoDB 文档中的 cleanupOrphaned

  • 如果您使用 mongodump 工具转储数据,则应为每个分片运行一个 mongodump 进程。最节省时间的方法可能需要多个迁移服务器来最大限度提高转储性能。

  • 如果您使用 Amazon Database Migration Service 复制数据,则必须为每个分片创建一个源终端节点。同时为要迁移的每个分片运行至少一个迁移任务。最节省时间的方法可能需要多个复制实例来最大限度提高迁移性能。

性能测试

将数据成功迁移到测试 Amazon DocumentDB 集群后,请对集群执行测试工作负载。通过 Amazon CloudWatch 指标验证您的性能是否达到或超过 MongoDB 源部署的当前吞吐量。

验证以下关键 Amazon DocumentDB 指标:

  • 网络吞吐量

  • 写入吞吐量

  • 读取吞吐量

  • 副本滞后

有关更多信息,请参阅 监控 Amazon DocumentDB

失效转移测试

验证应用程序在 Amazon DocumentDB 失效转移事件期间的行为是否满足您的可用性要求。要在控制台上启动 Amazon DocumentDB 集群的手动失效转移,请在集群页面上,选择操作菜单上的失效转移操作。

也可以通过从 Amazon CLI执行 failover-db-cluster 操作来启动失效转移。有关更多信息,请参阅参考failover-db-cluster资料的 Amazon DocumentDB 部分。 Amazon CLI

其他资源

请参阅 Amazon Database Migration Service 用户指南 中的以下主题: