迁移到 Amazon DocumentDB

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

迁移工具

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

AWS Database Migration Service

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

为帮助降低迁移成本,在迁移到 Amazon DocumentDB 时,您可以为每个实例免费使用 AWS DMS 六个月。有关更多信息,请参阅免费 DMS

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

命令行实用程序

用于向 Amazon DocumentDB 中迁移数据和从中迁移数据的常见实用工具包括 mongodumpmongorestoremongoexportmongoimport。 通常,mongodumpmongorestore 是最有效的实用程序,因为它们以二进制格式从数据库中转储和还原数据。与逻辑导出相比,这通常是性能最高的选项,生成的数据大小较小。当数据可读但通常比 mongoexport/mongoimport 慢并产生更大的数据大小时,如果要以 JSON 或 CSV 等逻辑格式导出和导入数据, 和 非常有用。mongodump``mongorestore

以下迁移方法部分将讨论如何根据您的使用案例和要求决定何时适合使用 AWS 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})

  • 集合统计数据

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

    • Namespace

    • 数据大小

    • 索引数量

    • 集合是否有上限

  • 索引统计数据

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

    • Namespace

    • ID

    • Size

    • 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%101
    99.9%212
    99.99%323

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

  • 性能

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

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

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

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

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

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

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

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

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

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

  • 恢复

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

    如果您需要保留超出备份保留期的快照,还可以使用 AWS 管理控制台和 AWS Command Line Interface (AWS CLI) 随时启动手动快照。有关更多信息,请参阅Amazon DocumentDB 中的备份和还原

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

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

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

迁移方法

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

注意

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

Offline

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

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

  1. Quiesce 对 MongoDB 源进行写入。

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

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

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

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


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

Online

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

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

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

  2. (可选)在 Amazon DocumentDB 集群中预先创建索引。

  3. 创建 AWS DMS 任务来执行完全加载,然后启用从源 MongoDB 部署到 Amazon DocumentDB 集群的 CDC。

  4. 在 AWS DMS 任务完成完全加载并且正在将更改复制到 Amazon DocumentDB 后,将应用程序的终端节点切换至 Amazon DocumentDB 集群。


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

有关使用 AWS DMS 进行迁移的更多信息,请参阅 中的Amazon DocumentDB将 用作 AWS Database Migration Service 的目标及相关 教程。AWS Database Migration Service 用户指南

Hybrid

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

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

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

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

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

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

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

  6. 在 AWS DMS 任务在可接受时段内复制更改时,将您的应用程序终端节点更改为写入到 Amazon DocumentDB 集群。


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

重要

AWS DMS 任务当前只能迁移单个数据库。如果您的 MongoDB 源具有大量数据库,您可能需要自动创建迁移任务,或考虑使用离线方法。

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

AWS DMS 不迁移索引(仅迁移数据),因此无需额外步骤来避免二次创建索引。

迁移源

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

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

迁移源版本

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

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

迁移连接

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


            图:从 Amazon DocumentDB 源迁移到Amazon EC2

从本地数据库迁移需要在 MongoDB 部署和 Virtual Private Cloud (VPC) 之间建立连接。您可以通过虚拟专用网络 (VPN) 连接或使用 AWS Direct Connect 服务来完成该操作。虽然您可以通过 Internet 迁移到 VPC,但从安全角度来看,这种连接方法是最不可取的。

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


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

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


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

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

Testing

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

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

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

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

迁移计划测试注意事项

在测试 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 的大小及其包含的时间范围。

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

AWS Database Migration Service 配置

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

使用 AWS DMS 执行迁移

  1. 创建 MongoDB 源终端节点。有关更多信息,请参阅将 MongoDB 用作 AWS DMS 的源

  2. 创建 Amazon DocumentDB 目标终端节点。有关更多信息,请参阅使用 AWS DMS 终端节点

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

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

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

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

从分片集群迁移

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

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

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

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

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

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

性能测试

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

验证以下关键 Amazon DocumentDB 指标:

  • 网络吞吐量

  • 写入吞吐量

  • 读取吞吐量

  • 副本滞后

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

故障转移测试

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

也可以通过从 AWS CLI 执行 failover-db-cluster 操作来启动故障转移。有关更多信息,请参阅 参考的 failover-db-cluster 部分中的 Amazon DocumentDBAWS CLI。

其他资源

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