

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

# 迁移到 Amazon DocumentDB
<a name="docdb-migration"></a>

Amazon DocumentDB 是一项完全托管的与 MongoDB API 兼容的数据库服务。您可以使用本节中详述的流程将数据从本地或亚马逊弹性计算云 (Amazon EC2) 上运行的 MongoDB 数据库迁移到亚马逊 DocumentDB。

**Topics**
+ [快速入门指南](migration-quick-start.md)
+ [迁移运行手册](docdb-migration-runbook.md)
+ [从 Couchbase 服务器迁移](migration-from-couchbase.md)

# 使用 AWS Database Migration Service（DMS）迁移到 Amazon DocumentDB：快速入门指南
<a name="migration-quick-start"></a>

**Topics**
+ [准备 DMS 源](#migrate-qs-dma-source)
+ [设置 DMS](#migrate-qs-dms-setup)
+ [启用 DocumentDB 压缩](#migrate-qs-comp)
+ [创建复制任务](#migrate-qs-create)
+ [监控进度](#migrate-qs-monitor)
+ [其他信息](#migrate-qs-info)

## 准备 DMS 源
<a name="migrate-qs-dma-source"></a>

要启用 DocumentDB 变更流或启用 MongoDB Oplog 以支持 DMS 变更数据捕获（CDC），请参阅 [启用变更流](change_streams.md#change_streams-enabling)。
+ DMS 源必须保留所有正在进行的变更，直至所有包含的集合的 DMS 完全加载完成。
+ DocumentDB 变更流是基于时间的。确保您的 `change_stream_log_retention_duration` 设置足够大，足以覆盖完成完全加载所需要的时间。
+ MongoDB Oplog 为固定大小。确保其大小可容纳完全加载期间的所有操作。

## 设置 DMS
<a name="migrate-qs-dms-setup"></a>

创建 DMS 实例、源端点和目标端点，并测试每个端点。

## 启用 DocumentDB 压缩
<a name="migrate-qs-comp"></a>

通过向 DocumentDB 集群附加自定义参数组并将 default\$1collection\$1compression 参数更新为 enabled 来启用压缩。请参阅[管理集合级文档压缩](doc-compression.md)了解更多信息。

## 创建复制任务
<a name="migrate-qs-create"></a>

1. 在 DMS 控制台的导航窗格中，选择**迁移或复制**，然后选择**任务**。

1. 选择**创建任务**。

1. 在**创建任务**页面的**任务配置**部分中：
   + 输入唯一且有意义的**任务标识符**（例如，“mongodb-docdb-replication”）。
   + 在**源数据库端点**下拉菜单中选择您之前创建的源端点。
   + 在**目标数据库端点**下拉菜单中选择您之前创建的目标端点。
   + 对于**任务类型**，选择**迁移和复制**。

1. 在**设置**部分中：
   + 对于**任务日志**，选中**打开 CloudWatch 日志**框。
   + 对于**编辑模式**（位于部分顶部），选择 **JSON 编辑器**并设置以下属性：
     + 将 `ParallelApplyThreads` 设置为 5（位于 `TargetMetadata` 下方）。这样可以在 CDC 中每秒执行大约 1000 次插入/更新/删除操作。
     + 将 `MaxFullLoadSubTasks` 设置为 16（位于 `FullLoadSettings` 下方）。根据您的实例大小酌情增加此值。
     + 对于大型集合（超过 100GB），请启用自动分区（在“表映射”下和 `parallel-load` 属性下）：
       + “type”：“partitions-auto”
       + “number-of-partitions”：16

## 监控进度
<a name="migrate-qs-monitor"></a>

使用 AWS DMS 控制台或创建自定义控制面板（[控制面板工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/monitoring/docdb-dashboarder)）来跟踪迁移。重点关注以下指标：
+ **FullLoadThroughputBandwidthTarget** – 测量 DMS 在迁移的完全加载阶段向目标数据库传输数据时使用的网络带宽（以 KB/秒为单位）。
+ **CDCLatencyTarget** – 测量源数据库发生变更与将该变更应用于目标数据库之间的时间延迟（以秒为单位）。
+ **CDCThroughputRowsTarget** – 测量 DMS 在迁移的持续复制阶段每秒向目标数据库应用的行数。

## 其他信息
<a name="migrate-qs-info"></a>

有关 Amazon DocumentDB 和 AWS DMS 的更多信息，请参阅：
+ [Amazon DocumentDB 迁移运行手册](docdb-migration-runbook.md)
+ [从 MongoDB 迁移到 Amazon DocumentDB](https://docs.aws.amazon.com/dms/latest/sbs/chap-mongodb2documentdb.html)

# Amazon DocumentDB 迁移运行手册
<a name="docdb-migration-runbook"></a>

本运行手册提供了使用 (DMS) 将 MongoDB 数据库迁移到 Amazon DocumentDB 的全面指南。 AWS Database Migration Service 它旨在为数据库管理员、云工程师和开发人员提供从初始发现到 end-to-end迁移后验证的整个迁移过程中的支持。

鉴于 MongoDB 与 Amazon DocumentDB 在实现和支持功能方面的差异，本运行手册强调了结构化和系统化的方法。本运行手册概述了重要的迁移前评测，重点介绍了兼容性注意事项，并详细说明了在最大限度减少中断的情况下确保迁移成功所需执行的关键任务。

本运行手册包含以下主题：
+ **[兼容性](#mig-runbook-compatibility)**：了解 Amazon DocumentDB 中支持的 MongoDB 功能和数据类型，识别潜在的不兼容性。
+ **[工作负载发现](#mig-runbook-workload)**— 分析现有 MongoDB 工作负载， read/write 包括模式、数据量和性能基准。
+ **[索引迁移](#mig-runbook-index)**：分析用于提取和转换 MongoDB 索引的策略，以在 Amazon DocumentDB 中实现最佳性能。
+ **[用户迁移](#mig-runbook-user)**：详细介绍将数据库用户、角色和访问控制迁移到 Amazon DocumentDB 的方法。
+ **[数据迁移](#mig-runbook-data)**— 介绍使用各种数据迁移方法 AWS DMS，包括满载和变更数据捕获 (CDC)。
+ **[监控](#mig-runbook-monitoring)**：详细介绍使用 DMS 或原生工具进行迁移时的各种监控方法。
+ **[验证](#mig-runbook-validation)**：提供进行迁移后数据完整性检查、功能验证和性能比较的过程。

通过遵循本运行手册中的指导，团队可以确保平稳、安全且高效地过渡到 Amazon DocumentDB，同时保留应用程序功能并最大限度地降低风险。

## 兼容性
<a name="mig-runbook-compatibility"></a>

**Topics**
+ [核心功能兼容性](#w2aac23b9c13c13)
+ [Amazon DocumentDB 兼容性评测工具](#w2aac23b9c13c15)

从 MongoDB 迁移到 Amazon DocumentDB 时，全面的初始评测和功能兼容性检查是成功迁移的关键。此过程从全面清点您的 MongoDB 功能开始，包括聚合管道运算符、查询模式、索引和数据模型。

由于亚马逊 DocumentDB 与 MongoDB 3.6、4.0、5.0 和 8.0 API 兼容，因此使用较新 MongoDB 特定功能的应用程序可能需要重构。需要评估的关键领域包括分片机制（Amazon DocumentDB 使用不同的方法）、事务实现、变更流功能以及索引类型（尤其是稀疏索引和部分索引）。

性能特征也存在差异，Amazon DocumentDB 针对企业工作负载进行了优化，性能可预测。测试应包括对两个系统运行具有代表性的工作负载，以识别可能需要优化的查询模式。

在评测阶段，监控执行计划以发现潜在的性能差距非常重要。这有助于制定清晰的迁移路线图，识别必要的应用程序变更以及建立切合实际的时间表，以便实现平稳过渡。

### 核心功能兼容性
<a name="w2aac23b9c13c13"></a>



#### 全面功能支持
<a name="w2aac23b9c13c13b5"></a>
+ **CRUD 操作**：全面支持所有基本的创建、读取、更新和删除操作（包括批量和查询运算符），从而提供无缝的应用程序兼容性。
+ **丰富的索引功能**：利用对单字段索引、复合索引、TTL 索引、部分索引、稀疏索引和 2dsphere 索引的全面支持，优化查询性能，以及利用文本索引（版本 5）进行基于文本的查找。
+ **企业级复制**：受益于强大的自动失效转移机制与只读副本，可实现卓越的高可用性，并且不会产生运营开销。
+ **高级备份解决方案** — 借助具有 Point-in-Time恢复 (PITR) 功能的自动备份系统和按需手动快照来保护数据，让您高枕无忧。

#### 增强 AWS的集成功能
<a name="w2aac23b9c13c13b7"></a>
+ **简化的聚合**：利用最常用的聚合阶段（`$match`、`$group`、`$sort`、`$project` 等），已针对企业工作负载优化性能。
+ **事务支持**：实现多文档和多集合事务，非常适合大多数业务应用程序需求。
+ **实时数据跟踪**：通过简单的命令启用变更流，并通过简单的参数组设置来延长变更流保留期，以实现实时数据变更监控。
+ **基于位置的服务**：实现支持 `$geoNear` 运算符和 2dsphere 索引的地理空间应用程序。
+ **文本搜索功能**：利用内置的文本搜索功能满足内容发现需求。

#### 现代架构优势
<a name="w2aac23b9c13c13b9"></a>
+ **云原生设计** — 享受 AWS经过优化的架构，该架构可取代传统功能，例如更高效 MapReduce 的聚合管道操作。
+ **增强的安全性** — 受益于 AWS Identity and Access Management (IAM)、SCRAM-SHA-1、SCRAM-SHA-256、X.509 证书身份验证和基于密码的身份验证。
+ **可预测的性能**：体验专为企业工作负载而优化的稳定性能。

要全面了解 Amazon DocumentDB 的功能，请参阅 [在 Amazon Document APIs DB 中支持 MongoDB、操作和数据类型](mongo-apis.md) 和 [功能差异：Amazon DocumentDB 和 MongoDB](functional-differences.md)，以最大限度地发挥数据库的潜力。

Amazon DocumentDB 并不支持 MongoDB 提供的所有索引。我们提供免费的[索引工具](https://github.com/awslabs/amazon-documentdb-tools/blob/master/index-tool/README.md)来检查兼容性。我们建议运行索引工具来评测不兼容性，并据此规划解决方法。

### Amazon DocumentDB 兼容性评测工具
<a name="w2aac23b9c13c15"></a>

[MongoDB 与 Amazon DocumentDB 的兼容性工具是一个可用的开源工具，它通过分析 MongoD](https://github.com/awslabs/amazon-documentdb-tools/blob/master/compat-tool/README.md) B 日志或应用程序源代码来帮助评估 MongoDB 工作 GitHub 负载与亚马逊 DocumentDB 的兼容性。

**主要特征**
+ 识别工作负载中的 MongoDB API 使用模式
+ 在迁移之前标记潜在的兼容性问题
+ 生成包含建议的详细兼容性报告
+ 可用作在本地运行的独立实用程序

#### 评测方法
<a name="w2aac23b9c13c15b9"></a>

**基于日志的评测**


+ 优点：
  + 捕获实际运行时行为和查询模式
  + 识别现实世界的使用频率和性能特征
  + 检测可能在源代码中不可见的动态查询
  + 无需访问应用程序源代码
+ 缺点：
  + 需要访问 MongoDB 日志并启用分析
  + 仅捕获在日志记录期间发生的操作
  + 可能会遗漏不常使用的功能或季节性工作负载

**源代码分析**


+ 优点：
  + 全面覆盖代码库中所有潜在的 MongoDB 操作
  + 可以识别罕见执行的代码路径中的问题
  + 检测可能受 Amazon DocumentDB 差异影响的客户端逻辑
  + 无需运行应用程序即可执行评测
+ 缺点：
  + 可能会标记存在但从未在生产环境中执行的代码
  + 需要访问完整的应用程序源代码
  + 对动态构造的查询进行分析的能力有限

为了获得最佳结果，我们建议尽可能使用这两种评测方法，以便在迁移之前全面了解兼容性挑战。

## 工作负载发现
<a name="mig-runbook-workload"></a>

从 MongoDB 迁移到 Amazon DocumentDB 需要对现有数据库工作负载有透彻的了解。工作负载发现是分析数据库使用模式、数据结构、查询性能和操作依赖关系的过程，旨在确保以最少的中断实现无缝过渡。本节概述了工作负载发现所涉及的关键步骤，以促进从 MongoDB 到 Amazon DocumentDB 的有效迁移。

**Topics**
+ [评测现有的 MongoDB 部署](#w2aac23b9c15b7)
+ [识别数据模型差异](#w2aac23b9c15b9)
+ [查询和性能分析](#w2aac23b9c15c11)
+ [安全与访问控制审查](#w2aac23b9c15c13)
+ [操作和监控注意事项](#w2aac23b9c15c15)

### 评测现有的 MongoDB 部署
<a name="w2aac23b9c15b7"></a>

在迁移之前，评估当前的 MongoDB 环境至关重要，包括：
+ **集群架构**：确定节点数量、副本集和分片配置。从 MongoDB 迁移到 Amazon DocumentDB 时，了解您的 MongoDB 分片配置非常重要，因为 Amazon DocumentDB 不支持用户控制的分片。为分片 MongoDB 环境设计的应用程序需要进行架构变更，因为 Amazon DocumentDB 在其基于存储的架构中使用了不同的扩展方法。迁移到 Amazon DocumentDB 时，您需要调整数据分配策略，并且可能需要整合分片集合。
+ **存储和数据量**：测量集群的总数据大小和索引大小。配合使用 [Oplog 审查工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/mongodb-oplog-review)，以了解写入模式和数据增长速度。有关调整集群大小的更多信息，请参阅 [实例大小调整](best_practices.md#best_practices-instance_sizing)。
+ **工作负载模式**：分析读取和写入吞吐量、查询执行频率和索引效率。
+ **操作依赖关系**：记录依赖于 MongoDB 的所有应用程序、服务和集成。

### 识别数据模型差异
<a name="w2aac23b9c15b9"></a>

尽管 Amazon DocumentDB 与 MongoDB 兼容，但支持的功能存在差异，例如：
+ **事务**：Amazon DocumentDB 支持 ACID 事务，但存在一些[限制](transactions.md#transactions-limitations)。
+ **架构设计**：确保文档结构、嵌入式文档和参考符合 [Amazon DocumentDB 的最佳实践](https://d1.awsstatic.com/product-marketing/Data%20modeling%20with%20Amazon%20DocumentDB.pdf)。

### 查询和性能分析
<a name="w2aac23b9c15c11"></a>

了解查询行为有助于优化迁移和迁移后的性能。需要分析的关键领域包括：
+ **慢查询**：使用 MongoDB 的分析工具识别执行时间较长的查询。
+ **查询模式**：对常见的查询类型进行分类，包括 CRUD 操作和聚合。
+ **索引使用情况**：评测索引是否得到有效利用，或者是否需要在 Amazon DocumentDB 中进行优化。要评测索引使用情况并优化 Amazon DocumentDB 中的性能，请在关键查询中将 `$indexStats` 聚合管道阶段与 `explain()` 方法结合使用。首先运行 `db.collection.aggregate([{$indexStats{}}])` 以识别正在使用的索引。您可以通过使用 `explainPlan` 执行最频繁的查询来执行更详细的分析。
+ **并发和工作负载分配**：评估读取和写入比率、连接池和性能瓶颈。

### 安全与访问控制审查
<a name="w2aac23b9c15c13"></a>

**身份验证和授权**
+ **MongoDB RBAC 到亚马逊 DocumentDB IAM 和 RBAC — 将 MongoDB 基于角色的访问控制用户和角色映射到 (IAM) 策略 AWS Identity and Access Management 和亚马**逊 DocumentDB SCRAM 身份验证用户。
+ **用户迁移策略**：规划将数据库用户、自定义角色和权限迁移到 Amazon DocumentDB 支持的身份验证机制。
+ **权限差异**：识别 MongoDB 权限中没有直接的 Amazon DocumentDB 等效权限（例如，集群管理角色）。
+ **应用程序身份验证**：更新 Amazon DocumentDB 密码策略的连接字符串和凭证管理。您可以使用 Secrets Manager 来存储您的凭证和轮换密码。
+ **服务帐号管理**-在中建立管理服务帐号凭证的流程 AWS Secrets Manager。
+ **最低权限实施**：审查并优化访问控制，以在新环境中实施最低权限原则。

**加密**

确保静态加密和传输中加密符合合规要求。

**网络配置**

规划[虚拟私有云（VPC）](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html)设置和安全组规则。

### 操作和监控注意事项
<a name="w2aac23b9c15c15"></a>

为了保持系统可靠性，工作负载发现还应包括：
+ **备份和恢复策略**：评估现有的备份方法和 Amazon DocumentDB 的备份功能。
+ **AWS Backup 集成** — 利用 AWS Backup 跨 AWS 服务（包括 Amazon DocumentDB）进行集中备份管理。
+ **CloudWatch 指标** — 将 MongoDB 监控指标映射到 Amazon DocumentDB 的 CPU、内存、连接和存储的指标。 CloudWatch 
+ **性能详情**：实施 Amazon DocumentDB 性能详情，以通过详细的查询分析，可视化数据库负载并分析性能问题。
+ **探查器**：配置 Amazon DocumentDB 探查器以捕获运行缓慢的操作（与 MongoDB 的探查器类似，但使用特定于 Amazon DocumentDB 的设置）。
  + 通过参数组启用并设置适当的阈值。
  + 分析探查器数据以识别优化机会
+ **CloudWatch 事件** — 为 Amazon DocumentDB 集群事件设置事件驱动型监控。
  + 为备份事件、维护时段和失效转移配置通知。
  + 与 Amazon SNS 集成，以提供警报和自动响应 AWS Lambda 。
+ **审计日志记录**：规划审计日志记录配置，以跟踪用户活动和安全相关事件。
+ **增强型监控**：启用增强型监控，以 1 秒间隔获取精细操作系统级别指标。

## 索引迁移
<a name="mig-runbook-index"></a>

从 MongoDB 迁移到 Amazon DocumentDB 不仅需要传输数据，还需要传输索引，以保持查询性能和优化数据库操作。本节概述了在确保兼容性和效率的同时，将索引从 MongoDB 迁移到 Amazon DocumentDB 的详细 step-by-step过程。

### 使用 Amazon DocumentDB 索引工具
<a name="w2aac23b9c17b5"></a>

**克隆[索引工具](https://github.com/awslabs/amazon-documentdb-tools/blob/master/index-tool/README.md)**

```
git clone https://github.com/aws-samples/amazon-documentdb-tools.git
cd amazon-documentdb-tools/index-tool
```

```
pip install -r requirements.txt
```

**从 MongoDB 导出索引（如果从 MongoDB 迁移）**

```
python3 migrationtools/documentdb_index_tool.py --dump-indexes --dir mongodb_index_export --uri
'mongodb://localhost:27017'
```

**从 Amazon DocumentDB 导出索引（如果从 Amazon DocumentDB 迁移）**

```
python3 migrationtools/documentdb_index_tool.py --dump-indexes --dir docdb_index_export --uri
'mongodb://user:password@mydocdb.cluster-cdtjj00yfi95.eu-west-
2.docdb.amazonaws.com:27017/?tls=true&tlsCAFile=rds-combined-ca-
bundle.pem&replicaSet=rs0&retryWrites=false'
```

**导入索引**

```
python3 migrationtools/documentdb_index_tool.py --restore-indexes --skip-incompatible --dir
mongodb_index_export --uri 'mongodb://user:password@mydocdb.cluster-cdtjj00yfi95.eu-west-
2.docdb.amazonaws.com:27017/?tls=true&tlsCAFile=rds-combined-ca-
bundle.pem&replicaSet=rs0&retryWrites=false'
```

**验证索引**

```
python3 migrationtools/documentdb_index_tool.py --show-issues --dir mongodb_index_export
```

## 用户迁移
<a name="mig-runbook-user"></a>

将用户从 MongoDB 迁移到 Amazon DocumentDB 对于维护访问控制、身份验证和数据库安全至关重要。本节概述了使用 Amazon DocumentDB 导出用户工具成功迁移 MongoDB 用户，同时保留其角色和权限的详细步骤。

### 使用 Amazon DocumentDB 导出用户工具
<a name="w2aac23b9c19b5"></a>

将用户和角色从 MongoDB 或 Amazon DocumentDB [https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/export-users](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/export-users)导出 JavaScript 到文件中，然后可以使用这些文件在另一个集群中重新创建它们。

**先决条件**

```
# Clone the repository
git clone https://github.com/awslabs/amazon-documentdb-tools.git
cd amazon-documentdb-tools/migration/export-users
```

```
# Install required dependencies
pip install pymongo
```

**步骤 1：导出用户和角色**

```
# Export users and roles to JavaScript files
python3 docdbExportUsers.py \
--users-file mongodb-users.js \
--roles-file mongodb-roles.js \
--uri "mongodb://admin:password@source-host:27017/"
```

**步骤 2：编辑用户文件**

```
// Example of how to update the users.js file
// Find each user creation statement and add the password
db.getSiblingDB("admin").createUser({
user: "appuser",
// Add password here
pwd: "newpassword",
roles: [
{ role: "readWrite", db: "mydb" }
]
})
```

**步骤 3：将自定义角色恢复到 Amazon DocumentDB**

```
# Import roles first
mongo --ssl \
--host target-host:27017 \
--sslCAFile rds-combined-ca-bundle.pem \
--username admin \
--password password \
mongodb-roles.js
```

**步骤 4：将用户恢复到 Amazon DocumentDB**

```
# Import users after roles are created
mongo --ssl \
--host target-host:27017 \
--sslCAFile rds-combined-ca-bundle.pem \
--username admin \
--password password \
mongodb-users.js
```

**重要提示**
+ 出于安全考虑，不会导出密码，必须手动将密码添加到 users.js 文件中。
+ 必须先导入角色再导入用户，以确保角色分配正确。
+ 该工具生成可以直接使用 mongo shell 执行的 JavaScript 文件。
+ 迁移期间会保留自定义角色及其权限。
+ 此方法允许在导入之前查看和修改用户权限。

此方法提供了一种安全且灵活的途径将用户和角色从 MongoDB 迁移到 Amazon DocumentDB，同时允许在迁移过程中重置密码。

## 数据迁移
<a name="mig-runbook-data"></a>

**Topics**
+ [在线迁移](#w2aac23b9c21b5)
+ [离线迁移](#w2aac23b9c21b7)
+ [先决条件](#w2aac23b9c21c11)
+ [准备 Amazon DocumentDB 集群](#w2aac23b9c21c13)
+ [执行数据转储（mongodump）](#w2aac23b9c21c15)
+ [将转储文件传输到恢复环境](#w2aac23b9c21c17)
+ [将数据恢复到 Amazon DocumentDB（mongorestore）](#w2aac23b9c21c19)

### 在线迁移
<a name="w2aac23b9c21b5"></a>

本节提供了从 MongoDB 到 Amazon DocumentDB 的在线迁移的详细步骤，以最大限度地减少停机时间并实现 AWS DMS 持续复制。首先，您需要将 Amazon DocumentDB 集群设置为目标，并确保将 MongoDB 实例正确配置为源，通常需要副本集模式才能捕获变更数据。接下来，您将创建 DMS 复制实例，并使用必要的连接详细信息定义源端点和目标端点。验证端点后，配置并启动迁移任务，该任务可能包括完全数据加载和/或持续复制。

#### 配置目标（Amazon DocumentDB）
<a name="w2aac23b9c21b5b5"></a>

**注意**  
如果您已预置要迁移到的 Amazon DocumentDB 集群，则可以跳过此步骤。

**创建自定义参数组**

请参阅中的 AWS 管理控制台 或 AWS CLI 程序[创建 Amazon DocumentDB 集群参数组](cluster_parameter_groups-create.md)。

**创建 Amazon DocumentDB 集群**

**注意**  
虽然本指南中还有其他用于创建 Amazon DocumentDB 集群的过程，但本节中的步骤专门适用于将大量数据迁移到新集群的任务。

1. [登录 AWS 管理控制台，然后在 /docdb 上打开亚马逊文档数据库控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/docdb)

1. 在导航窗格中，选择**集群**。
**提示**  
如果您在屏幕左侧没有看到导航窗格，请在页面左上角选择菜单图标 (![\[Hamburger menu icon with three horizontal lines.\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/docdb-menu-icon.png))。

1. 在 Amazon DocumentDB 管理控制台上，**集群**下，选择**创建**。

1. 在**创建 Amazon DocumentDB 集群**页面上，在**集群类型**部分中选择**基于实例的集群**（这是默认选项）。

1. 在集群配置部分中：
   + 在**集群标识符**中，输入唯一名称，例如 **mydocdbcluster**。请注意，无论如何输入，控制台都会将所有集群的名称更改为小写。
   + 对于**引擎版本**，选择 5.0.0。

1. 在**集群存储配置**部分中，按原样保留 **Amazon DocumentDB 标准**设置（此为默认选项）。

1. 在**实例配置**部分：
   + 对于**数据库实例类**，选择**内存优化类（包括 r 类）**（这是默认值）。
   + 对于**实例类**，根据工作负载选择实例类。例如：
     + db.r6g.large：适用于较小的工作负载
     + db.r6g.4xlarge：适用于较大的工作负载

     作为最佳实践，我们建议选择尽可能大的实例以获得最佳的完全加载吞吐量，并在迁移完成后缩减规模。
   + 对于**实例数**，选择 1 个实例。选择一个实例有助于成本最小化。我们建议您在完成完全加载迁移后，扩展到三个实例以实现高可用性。

1. 在**身份验证**部分中，输入主要用户的用户名，然后选择**自行管理**。输入密码，然后确认密码。

1. 在**网络设置**部分中，选择 VPC 和子网组，然后配置 VPC 安全组。通过更新入站规则，确保您的 Amazon DocumentDB 安全组允许来自 DMS 实例安全组的入站连接。

1. 在 **E ncryption-at-rest** 部分中，启用加密（推荐），然后选择或输入 KMS 密钥。

1. 在**备份**部分中，设置备份保留期（1 到 35 天）。

1.  检查您的配置，然后选择**创建集群**。

   部署时间通常在 10 到 15 分钟之间，

#### 配置源
<a name="w2aac23b9c21b5b7"></a>

MongoDB 和 Amazon DocumentDB 都可以充当迁移源，具体取决于您的场景：
+ **MongoDB 作为**源 — 从本地或自行管理的 MongoDB 迁移到 Amazon DocumentDB 或其他数据库服务时很常见。 AWS 需要在副本集模式下运行并具有足够大的 oplog（确保其大小可以容纳完全加载期间的所有操作），以支持迁移期间的变更数据捕获。
+ **Amazon DocumentDB 作为源**：通常用于跨区域复制、版本升级或迁移到 MongoDB Atlas 等其他数据库服务。需要 [启用变更流](change_streams.md#change_streams-enabling)，在集群参数组中设置 `change_stream_log_retention_duration` 参数以捕获迁移期间的持续变更。确保您的 `change_stream_log_retention_duration` 设置足够大，足以覆盖完成完全加载所需要的时间。

在开始迁移之前，请将源配置为允许 AWS DMS 访问。

创建具有适当权限的 MongoDB 用户：

```
db.createUser({
user: "dmsUser",
pwd: "yourSecurePassword",
roles: [{ role: "readAnyDatabase", db: "admin" }]
})
```

配置网络和身份验证。

在为 MongoDB 到 DMS 的迁移配置网络连接时：

**EC2 托管的 MongoDB 源**
+ 修改 EC2 安全组以允许来自 DMS 复制实例安全组的入站流量。
+ 为 TCP 端口 27017（或您的自定义 MongoDB 端口）添加规则。
+ 使用 DMS 复制实例的安全组 ID 作为源，以实现精确访问控制。
+ 确保 EC2 实例的子网可路由至 DMS 复制实例的子网。

**本地 MongoDB 源**
+ 配置您的防火墙以允许来自 DMS 复制实例的公有 IP 地址的入站连接。
+ 如果使用 Direct Connect 或 VPN，请确保您的网络和包含 DMS 实例的 VPC 之间路由正确。
+ 使用 telnet 或 nc 命令测试从 DMS 子网到 MongoDB 服务器的连接。

**MongoDB Atlas 源**
+ 将 DMS 复制实例 IP 地址添加到 MongoDB Atlas IP 允许列表。
+ 如果 Atlas 正在运行，则在 AWS VPC 和 MongoDB Atlas VPC 之间配置 VPC 对等互连。 AWS
+ 如果在其他云提供商上运行，请设置 AWS PrivateLink 私有连接（企业级）。
+ 创建具有适当 read/write 权限的专用用户。
+ 使用 MongoDB Atlas 连接字符串，将“SSL 模式”设置为“verify-full”。
+ 确保迁移期间有足够的 oplog 大小。

**Amazon DocumentDB 源**

配置您的源 Amazon DocumentDB 安全组，以允许来自 DMS 复制实例安全组的入站流量。

#### 创建 DMS 复制实例
<a name="w2aac23b9c21b5b9"></a>

我们建议使用 [DMS Buddy](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/dms_buddy) 来预置您的 DMS 基础设施，因为这样可以创建具有最佳 DMS 设置和实例大小的最佳迁移基础设施。

如果您更喜欢手动配置，请执行以下步骤：

1. 打开 AWS DMS 控制台，选择**创建复制实例**。

1. 输入复制实例的详细信息：
   + **实例名称**：选择唯一名称。
   + **实例类**：根据工作负载进行选择。示例：dms.r5.large（小型工作负载），dms.r5.4xlarge（大型工作负载）。
   + **引擎版本**：3.5.4
   + **分配的存储空间**：默认值为 100GB（如果需要可增加）。这取决于文档大小 updates/second 和满载持续时间。
   + **多可用区部署**：如果需要，启用以实现高可用性。
   + 选择与 Amazon DocumentDB 相同的 VPC。
   + 确保**安全组**允许来自源和 Amazon DocumentDB 的入站流量。

1. 单击**创建复制实例**，等待状态变为可用。

#### 创建 DMS 端点
<a name="w2aac23b9c21b5c11"></a>

##### 创建源端点
<a name="w2aac23b9c21b5c11b3"></a>

**对于 MongoDB 源**

1. 在 DMS 控制台的导航窗格中，选择**迁移或复制**，然后选择**端点**。

1. 选择**创建端点**。

1. 在**创建端点**页面上，选择**源端点**。

1. 在**端点配置**部分中：
   + 输入唯一且有意义的**端点标识符**（例如，“mongodb-source”）。
   + 选择 **MongoDB** 作为**源引擎**。
   + 对于**端点数据库的访问权限**，请选择**手动提供访问信息**。
   + 在**服务器名称**中，输入您的*MongoDB server DNS name/IP address*。
   + 对于**端口**，输入 **27017**（默认 MongoDB 端口）。
   + 对于**身份验证模式**，为您的应用程序选择适当的模式（密码/SSL）（默认为 Secrets Manager）。
   + 如果**身份验证模式**为**密码**，请提供：
     + **用户名**和**密码**：输入 MongoDB 凭证。
     + **数据库名称**：您的源数据库名称。
     + **身份验证机制**：SCRAM-SHA-1（默认）或适当的机制

1. 对于**元数据模式**，保留**文档**的默认设置。

1. 其他连接属性：
   + authSource=admin（如果身份验证数据库不同）
   + replicaset=< your-replica-set-name >（CDC 是必需的）

**对于 Amazon DocumentDB 源**

1. 在 DMS 控制台的导航窗格中，选择**迁移或复制**，然后选择**端点**。

1. 选择**创建端点**。

1. 在**创建端点**页面上，选择**源端点**。

1. 在**端点配置**部分中：
   + 输入唯一且有意义的**端点标识符**（例如，“docdb-source”）。
   + 选择 **Amazon DocumentDB** 作为**源引擎**。
   + 对于**端点数据库的访问权限**，请选择**手动提供访问信息**。
   + 在**服务器名称**中，输入您的*source Amazon DocumentDB cluster endpoint*。
   + 对于**端口**，输入 **27017**（默认的 Amazon DocumentDB 端口）。
   + 对于 **SSL 模式**，选择 **verify-full**（推荐用于 Amazon DocumentDB）。
   + 对于 **CA 证书**，选择 Amazon RDS 根 CA 证书。
   + 对于**身份验证模式**，为您的应用程序选择适当的模式（密码/SSL）（默认为 Secrets Manager）。
   + 如果**身份验证模式**为**密码**，请提供：
     + **用户名**和**密码**：输入 Amazon DocumentDB 凭证。
     + **数据库名称**：您的源数据库名称。
     + **身份验证机制**：SCRAM-SHA-1（默认）或适当的机制

1. 对于**元数据模式**，保留**文档**的默认设置。

##### 创建目标端点（Amazon DocumentDB）
<a name="w2aac23b9c21b5c11b5"></a>

1. 在 DMS 控制台的导航窗格中，选择**迁移或复制**，然后选择**端点**。

1. 选择**创建端点**。

1. 在**创建端点**页面中，选择**目标端点**。

1. 在**端点配置**部分中：
   + 输入唯一且有意义的**端点标识符**（例如，“docdb-target”）。
   + 选择 **Amazon DocumentDB** 作为**目标引擎**。
   + 对于**访问端点数据库**，选择要用于对数据库的访问进行身份验证的方法：
     + 如果您选择 **AWS Secrets Manager**，请在**密钥**字段中选择其中存储有 Amazon DocumentDB 凭证的密钥。
     + 如果您选择**手动提供访问信息**：
       + 在**服务器名称**中，输入您的*target Amazon DocumentDB cluster endpoint*。
       + 对于**端口**，输入 **27017**（默认的 Amazon DocumentDB 端口）。
       + 对于 **SSL 模式**，选择 **verify-full**（推荐用于 Amazon DocumentDB）。
       + 对于 **CA 证书**，下载并指定用于 SSL 验证的 CA 证书捆绑包。
       + 对于**身份验证模式**，为您的应用程序选择适当的模式（密码/SSL）（默认为 Secrets Manager）。
       + 如果**身份验证模式**为**密码**，请提供：
         + **用户名**和**密码**：输入 Amazon DocumentDB 凭证。
         + **数据库名称**：您的源数据库名称。
         + **身份验证机制**：SCRAM-SHA-1（默认）或适当的机制

1. 对于**元数据模式**，保留**文档**的默认设置。

#### 创建复制任务
<a name="w2aac23b9c21b5c13"></a>

1. 在 DMS 控制台的导航窗格中，选择**迁移或复制**，然后选择**任务**。

1. 选择**创建任务**。

1. 在**创建任务**页面的**任务配置**部分中：
   + 输入唯一且有意义的**任务标识符**（例如，mongodb-docdb-replication“”）。
   + 在**源数据库端点**下拉菜单中选择您之前创建的源端点。
   + 在**目标数据库端点**下拉菜单中选择您之前创建的目标端点。
   + 对于**任务类型**，选择**迁移和复制**。

1. 在**设置**部分中：
   + 对于**目标表准备模式**，保留默认设置。
   + 对于**在完全加载完成后停止任务**，保留默认设置。
   + 对于 **LOB 列设置**，按原样保留**受限 LOB 模式**设置。
   + 对于**数据验证**，保留默认设置**关闭**。
   + 对于**任务日志**，请选中 “**打开日 CloudWatch**志” 复选框。
   + 对于**批处理优化的应用**，保留默认设置为未选中（关闭）。

1. 回到**任务设置**部分的顶部，在**编辑模式**中选择 **JSON 编辑器**并设置以下属性：

   ```
   {
     "TargetMetadata": {
       "ParallelApplyThreads": 5
     },
     "FullLoadSettings": {
       "MaxFullLoadSubTasks": 16
     }
   }
   ```

1. 在**表映射**部分中，添加新选择规则：
   + 对于**架构名称**，添加要迁移的源数据库。使用 % 指定多个数据库。
   + 对于**架构表**名称，添加要迁移的源集合。使用 % 指定多个集合。
   + 对于**操作**，保留默认设置**包含**

1. 对于大型集合（超过 100GB），添加**表设置规则**：
   + 对于**架构名称**，添加要迁移的源数据库。使用 % 指定多个数据库。
   + 对于**架构表**名称，添加要迁移的源集合。使用 % 指定多个集合。
   + 对于**分区数**，输入 16（应小于 `MaxFullLoadSubTask`）。

1. 在**迁移前评测**部分中，确保将其关闭。

### 离线迁移
<a name="w2aac23b9c21b7"></a>

本节概述了使用原生 MongoDB 工具 `mongodump` 和 `mongorestore` 执行从自行管理的 MongoDB 实例到 Amazon DocumentDB 的离线迁移流程。

### 先决条件
<a name="w2aac23b9c21c11"></a>

**源 MongoDB 要求**
+ 使用适当的权限访问源 MongoDB 实例。
+ 如果需要，请安装 `mongodump`（在 MongoDB 安装期间进行安装）。
+ 确保有足够的磁盘空间来存放转储文件。

**目标 Amazon DocumentDB 要求**
+ 确保您已预置 Amazon DocumentDB 集群。
+ 确保在与 Amazon DocumentDB 相同的 VPC 中存在 EC2 实例，以方便迁移。
+ 您的源环境与 Amazon DocumentDB 之间必须有可用的网络连接。
+ **mongorestore** 必须安装在迁移 EC2 实例上。
+ 必须配置适当的 IAM 权限才能访问 Amazon DocumentDB，

**一般要求**
+ AWS CLI 必须配置（如果使用 AWS 服务进行中间存储）
+ 必须有足够的带宽可用于数据传输。
+ 应批准停机时间（如果要进行实时迁移，请考虑其他方法）

### 准备 Amazon DocumentDB 集群
<a name="w2aac23b9c21c13"></a>

在 AWS中创建 Amazon DocumentDB 集群：
+ 根据您的工作负载选择合适的实例大小。
+ 配置 VPC、子网和安全组。
+ 通过参数组启用必要的参数。

### 执行数据转储（mongodump）
<a name="w2aac23b9c21c15"></a>

选择以下选项之一来创建转储文件：
+ **选项 1：基本**

  ```
  mongodump --
  uri="mongodb://<source_user>:<source_password>@<source_host>:<source_port>/<database>" --
  out=/path/to/dump
  ```
+ **选项 2：更优的控制和性能**

  ```
  mongodump \
  --uri="mongodb://<source_user>:<source_password>@<sourcehost>:<source_port>" \
  --out=/path/to/dump \
  --gzip \# Compress output
  --numParallelCollections=4 \# Parallel collections dump
  --ssl \# If using SSL
  --authenticationDatabase=admin \ # If auth is required
  --readPreference=secondaryPreferred # If replica set
  ```
+ **选项 3：大型数据库**

  ```
  mongodump \
  --host=<source_host> \
  --port=<source_port> \
  --username=<source_user> \
  --password=<source_password> \
  --db=<specific_db> \# Only dump specific DB
  --collection=<specific_collection> \ # Only dump specific collection
  --query='{ "date": { "$gt": "2020-01-01" } }' \ # Filter documents
  --archive=/path/to/archive.gz \# Single archive output
  --gzip \
  --ssl
  ```

### 将转储文件传输到恢复环境
<a name="w2aac23b9c21c17"></a>

根据您的转储大小选择适当的方法：
+ **小**：直接复制到您的迁移机器（您之前创建的 EC2 实例）：

  ```
  scp -r /path/to/dump user@migration-machine:/path/to/restore
  ```
+ **中**：使用 Amazon S3 作为中间存储：

  ```
  aws s3 cp --recursive /path/to/dump s3://your-bucket/mongodb-dump/
  ```
+ **大型** — 对于非常大的数据库，可以考虑 AWS DataSync 物理传输。

### 将数据恢复到 Amazon DocumentDB（mongorestore）
<a name="w2aac23b9c21c19"></a>

在开始恢复过程之前，请在 Amazon DocumentDB 中创建索引。您可以使用 [Amazon DocumentDB 索引工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/index-tool)导出和导入索引。

选择以下选项之一来恢复数据：
+ **选项 1：基本恢复**

  ```
  mongorestore --uri="mongodb://<docdb_user>:<docdb_password>@<docdb_endpoint>:27017"
  /path/to/dump
  ```
+ **选项 2：更优的控制和性能**

  ```
  mongorestore \
  --uri="mongodb://<docdb_user>:<docdb_password>@<docdb_endpoint>:27017" \
  --ssl \
  --sslCAFile=/path/to/rds-combined-ca-bundle.pem \ # DocumentDB CA cert
  --gzip \# If dumped with gzip
  --numParallelCollections=4 \# Parallel restoration
  --numInsertionWorkersPerCollection=4 \# Parallel documents insertion
  --noIndexRestore \# skip indexes as they are pre-created
  /path/to/dump
  ```
+ **选项 3：大型数据库或特定控件**

  ```
  mongorestore \
  --host=<docdb_endpoint> \
  --port=27017 \
  --username=<docdb_user> \
  --password=<docdb_password> \
  --ssl \
  --sslCAFile=/path/to/rds-combined-ca-bundle.pem \
  --archive=/path/to/archive.gz \# If using archive format
  --gzip \
  --nsInclude="db1.*" \# Only restore specific namespaces
  --nsExclude="db1.sensitive_data" \ # Exclude specific collections if needed
  --noIndexRestore \# skip indexes as they are pre-created
  --writeConcern="{w: 'majority'}" # Ensure write durability
  ```

## 监控
<a name="mig-runbook-monitoring"></a>

本节提供了详细的监控流程，用于跟踪正在进行的迁移的进度、性能和运行状况：

从 **MongoDB** 迁移到 **Amazon DocumentDB**

或者

从 **Amazon DocumentDB** 迁移到 **Amazon DocumentDB**

无论采用哪种迁移方法（AWS DMS、mongodump/mongorestore 或其他工具），监控步骤都适用。

### AWS DMS 迁移监控（如果适用）
<a name="w2aac23b9c23c13"></a>

监控以下关键 CloudWatch 指标：

**完全加载阶段指标**
+ **FullLoadThroughputBandwidthTarget**— 满负荷期间的网络带宽（KB/秒）
+ **FullLoadThroughputRowsTarget**— 每秒 rows/documents 加载的次数
+ **FullLoadThroughputTablesTarget**— 每分钟 tables/collections 完成的次数
+ **FullLoadProgressPercent**— 满载完成的百分比
+ **TablesLoaded**— tables/collections 成功加载的数量
+ **TablesLoading**— tables/collections 当前加载的数量
+ **TablesQueued**— tables/collections 等待加载的次数
+ **TablesErrored**— 加载 tables/collections 失败的数量

**CDC 阶段指标**
+ **CDCLatency目标**-源更改和目标应用程序之间的时间延迟（秒）
+ **CDCLatency来源-源**变更与 DMS 读取源之间的时间延迟（秒）
+ **CDCThroughputRowsTarget**— 正在进行的复制期间应用的每秒行数
+ **CDCThroughputBandwidthTarget**— CDC 期间的网络带宽（KB/秒）
+ **CDCIncoming更改**-从源收到的变更事件的数量
+ **CDCChangesMemoryTarget**— 用于在目标端存储更改的内存 (MB)

**资源指标**
+ **CPUUtilization**— 复制实例的 CPU 使用率
+ **FreeableMemory**— 复制实例上的可用内存
+ **FreeStorageSpace**— 复制实例上的可用存储空间
+ **NetworkTransmitThroughput**— 复制实例的网络吞吐量
+ **NetworkReceiveThroughput**— 复制实例的网络吞吐量

**错误指标**
+ **ErrorsCount**— 迁移期间的错误总数
+ **TableErrorsCount**— 特定于表格的错误数量
+ **RecordsErrorsCount**— 特定于记录的错误数量

为诸如迁移性能下降之类的关键指标创建 CloudWatch 警报`CPUUtilization`，`CDCLatencyTarget`并在迁移性能下降时接收通知。

#### DMS 日志（日CloudWatch 志）
<a name="w2aac23b9c23c13c23"></a>



1. 前往 Amazon CloudWatch 日志控制台。

1. 在您的日志组中进行查找和选择。看起来类似于“dms-tasks –”。

1. 查找可能包含错误信息的日志流：
   + 名称中带有“error”的流
   + 带有任务 IDs 或终端节点名称的直播
   + 迁移期间的最新日志流

1. 在这些流中，搜索关键词，例如：
   + “error”
   + “exception”
   + “failed”
   + “warning”

#### DMS 任务状态（使用 AWS CLI）
<a name="w2aac23b9c23c13c25"></a>



```
aws dms describe-replication-tasks --filters Name=replication-task id,Values=<task_id> --query
"ReplicationTasks[0].Status"
```

预期的状态流：

正在创建 → 就绪 → 正在运行 → 正在停止 → 已停止（或失败）

#### 监视器使用 `docdb-dashboarder`
<a name="w2aac23b9c23c13c27"></a>

该`docdb-dashboarder`工具通过自动生成包含基本性能指标的 CloudWatch 控制面板，为 Amazon DocumentDB 集群提供全面监控。这些控制面板显示关键的集群级别指标（副本延迟、操作计数器）、实例级别指标（CPU、内存、连接）以及存储指标（卷使用率、备份存储）。对于迁移场景，该工具提供专用控制面板，可通过 CDC 复制延迟和操作率等指标来跟踪迁移进度。仪表板可以同时监控多个集群，并支持 NVMe由支持的实例。通过可视化这些指标，团队可以主动识别性能瓶颈，优化资源分配，并确保其 Amazon DocumentDB 部署顺利运行。该工具无需手动创建控制面板，同时在所有环境中提供一致的监控。有关设置说明和高级配置选项，请参阅 [Amazon DocumentDB 仪表板](https://github.com/awslabs/amazon-documentdb-tools/tree/master/monitoring/docdb-dashboarder)工具存储库。 GitHub 

## 验证
<a name="mig-runbook-validation"></a>

**Topics**
+ [验证核对清单](#w2aac23b9c25c15)
+ [架构和索引验证](#w2aac23b9c25c17)
+ [数据采样和字段级别验证](#w2aac23b9c25c19)
+ [使用 DataDiffer 工具进行验证](#w2aac23b9c25c21)

本节提供详细的验证流程，以确保以下迁移后的数据一致性、完整性和应用程序兼容性：

从 **MongoDB** 迁移到 **Amazon DocumentDB**

或者

从 **Amazon DocumentDB** 迁移到 **Amazon DocumentDB**

无论采用哪种迁移方法（AWS DMS、mongodump/mongorestore 或其他工具），验证步骤都适用。

### 验证核对清单
<a name="w2aac23b9c25c15"></a>

验证每个集合中的文档数量在源与目标之间是否匹配：

**MongoDB 源**

```
mongo --host <source_host> --port <port> --username <user> -- password <password> --eval
"db.<collection>.count()"
```

**Amazon DocumentDB 目标**

```
mongo --host <target_host> --port <port> --username <user> -- password <password> --eval
"db.<collection>.count()"
```

### 架构和索引验证
<a name="w2aac23b9c25c17"></a>

请确保：
+ 所有集合都存在于目标中。
+ 索引已正确复制。
+ 架构定义（如果强制执行）相同。

**检查集合（源与目标）**

```
mongo --host <source_host> --eval "show collections"
mongo --host <target_host> --ssl --eval "show collections"
```

**检查索引（源与目标）**

```
mongo --host <source_host> --eval" db.<collection>.getIndexes()"
mongo --host <target_host> --ssl –eval" db.<collection>.getIndexes()"
```

比较集合列表，确保没有缺失或多余的集合。

通过检查索引名称、键定义、唯一约束和 TTL 索引（如果有）来验证索引。

**检查架构验证规则（如果在 MongoDB 中使用架构验证）**

```
mongo --host <source_host> --eval" db.getCollectionInfos({name: '<collection>'})
[0].options.validator"
   mongo --host <target_host> --ssl –eval" db.getCollectionInfos({name: '<collection>'})[0].options.validator"
```

### 数据采样和字段级别验证
<a name="w2aac23b9c25c19"></a>

您可以对文档进行随机采样，并比较源与目标之间的字段。

**手动采样**

获取五个随机文档（源）：

```
mongo --host <source_host> --eval "db.<collection>.aggregate([{ \$sample: { size: 5 } }])"
```

获取相同的文档 IDs （目标）：

```
mongo --host <target_host> --ssl –eval "db.<collection>.find({ _id: { \$in: [<list_of_ids>] } })"
```

**自动采样**

```
import pymongo
# Connect to source and target
source_client = pymongo.MongoClient("<source_uri>")
target_client = pymongo.MongoClient("<target_uri>", ssl=True)
source_db = source_client["<db_name>"]
target_db = target_client["<db_name>"]
# Compare 100 random documents
for doc in source_db.<collection>.aggregate([{ "$sample":
{ "size": 100 } }]):
target_doc = target_db.<collection>.find_one({ "_id":
doc["_id"] })
if target_doc != doc:
print(f"❌ Mismatch in _id: {doc['_id']}")
else:
print(f"✅ Match: {doc['_id']}")
```

### 使用 DataDiffer 工具进行验证
<a name="w2aac23b9c25c21"></a>

该[DataDiffer 工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/data-differ)提供了一种在源数据库和目标数据库之间比较数据的可靠方法。

#### 先决条件
<a name="w2aac23b9c25c21b5"></a>

安装该 DataDiffer 工具之前，必须满足以下先决条件：
+ Python 3.7\$1
+ PyMongo 图书馆
+ 到源 MongoDB 集群和目标 Amazon DocumentDB 集群的网络连接

#### 设置和安装
<a name="w2aac23b9c25c21b7"></a>

**克隆存储库并导航到该 DataDiffer 目录**

```
git clone https://github.com/awslabs/amazon-documentdb-tools.git
cd amazon-documentdb-tools/migration/data-differ
```

**安装所需的依赖项**

```
pip install -r requirements.txt
```

#### 运行数据验证
<a name="w2aac23b9c25c21b9"></a>

**创建包含连接详细信息的配置文件（例如 config.json）**

```
{
"source": {
"uri": "mongodb://username:password@source-mongodb-
host:27017/?replicaSet=rs0",
"db": "your_database",
"collection": "your_collection"
},
"target": {
"uri": "mongodb://username:password@target-docdb-
cluster.region.docdb.amazonaws.com:27017/?tls=true&tlsCAFile=global-
bundle.pem&replicaSet=rs0",
"db": "your_database",
"collection": "your_collection"
},
"options": {
"batch_size": 1000,
"threads": 4,
"sample_size": 0,
"verbose": true
}
}
```

**运行该 DataDiffer 工具**

```
python differ.py --config config.json
```

**对于大型集合，使用采样来验证数据子集**

```
python differ.py --config config.json --sample-size 10000
```

**要验证多个集合，请创建单独的配置文件或使用批处理模式**

```
python differ.py --batch-config batch_config.json
```

#### 解析 结果
<a name="w2aac23b9c25c21c11"></a>

工具将输出：
+ 源和目标中的文档总数量
+ 匹配文档的数量
+ 缺失文档的数量
+ 存在差异的文档的数量
+ 详细的差异报告（如果有）

#### 最佳实践
<a name="w2aac23b9c25c21c13"></a>

以下是使用该 DataDiffer 工具时的最佳做法：
+ **分阶段运行**：首先验证文档数量，然后对关键文档进行采样，最后根据需要进行全面比较。
+ **检查架构差异**：与 MongoDB 相比，Amazon DocumentDB 有一些限制。该工具将突出显示不兼容的数据类型或结构。
+ **在静默期间进行验证**：在写入操作最少时运行验证以确保一致性。
+ **监控资源使用情况**：比较过程可能占用大量资源。相应地调整批处理大小和线程数。
+ **验证索引**：数据验证后，确保已在目标 Amazon DocumentDB 集群上创建所有必需的索引。
+ **文档验证结果**：记录每个集合的验证结果，将其作为迁移文档的一部分。

# 从 Couchbase 服务器迁移
<a name="migration-from-couchbase"></a>

**Topics**
+ [简介](#introduction)
+ [与亚马逊 DocumentDB 的比较](#comparison-to-amazon-documentdb)
+ [Discovery](#discovery)
+ [规划](#planning)
+ [迁移](#migration)
+ [验证](#validation)

## 简介
<a name="introduction"></a>

本指南介绍了从 Couchbase Server 迁移到 Amazon DocumentDB 时需要考虑的要点。它解释了迁移的发现、规划、执行和验证阶段的注意事项。它还说明了如何执行离线和在线迁移。

## 与亚马逊 DocumentDB 的比较
<a name="comparison-to-amazon-documentdb"></a>


|  | **Couchbase 服务器** | **Amazon DocumentDB** | 
| --- | --- | --- | 
| 数据组织 | 在 7.0 及更高版本中，数据按存储桶、范围和集合进行组织。在早期版本中，数据被组织到存储桶中。 | 数据被组织成数据库和集合。 | 
| 兼容性 | 每项服务（例如数据、索引、搜索等）都有单独 APIs 的服务。二级查找使用 SQL\$1\$1（以前称为 N1QL）；这是一种基于 ANSI 标准 SQL 的查询语言，因此许多开发人员都很熟悉。 | 亚马逊 DocumentDB [与 MongoDB API 兼容](compatibility.html)。 | 
| 架构 | 存储空间已连接到每个集群实例。您不能独立于存储来扩展计算。 | Amazon DocumentDB 专为云而设计，可避免传统数据库架构的限制。[计算层和存储层在 Amazon DocumentDB 中是分开](db-clusters-understanding.html)的，计算层可以[独立于存储进行扩展。](how-it-works.html) | 
| 按需添加读取容量 | 可以通过添加实例来扩展集群。由于存储连接到运行服务的实例，因此横向扩展所需的时间取决于需要移动到新实例或重新平衡的数据量。 | 您可以通过在集群中[创建多达 15 个 Amazon DocumentDB 副本来实现对您的 Amazon DocumentDB](db-cluster-manage-performance.html#db-cluster-manage-scaling-reads) 集群的读取扩展。对存储层没有影响。 | 
| 从节点故障中快速恢复 | 集群具有自动故障转移功能，但是使集群恢复到最大容量所需的时间取决于需要移动到新实例的数据量。 | 无论集群中的数据量如何，Amazon DocumentDB 通常可以在 30 秒内对[主集群进行故障转移](failover.html)，并在 8-10 分钟内将集群恢复到最大容量。 | 
| 随着数据的增长扩展存储 | 适用于自行管理的集群存储， IOs 不要自动扩展。 | 亚马逊 DocumentDB [存储和自动 IOs 扩展。](db-cluster-manage-performance.html#db-cluster-manage-scaling-storage) | 
| 在不影响性能的情况下备份数据 | 备份由备份服务执行，默认情况下不启用。由于存储和计算不是分开的，因此可能会对性能产生影响。 | 默认情况下，Amazon DocumentDB 备份处于启用状态，无法关闭。备份由存储层处理，因此它们对计算层的影响为零。Amazon DocumentDB 支持[从集群快照](backup_restore-restore_from_snapshot.html)[还原和还原到某个时间点。](backup_restore-point_in_time_recovery.html) | 
| 数据持久性 | 一个集群中最多可以有 3 个副本数据副本，总共有 4 个副本。运行数据服务的每个实例都将有活动数据副本和 1、2 或 3 个副本副本。 | 无论有多少计算实例，Amazon DocumentDB 都会维护 6 个数据副本，写入法定人数为 4，并保持不变。存储层保存 4 个数据副本后，客户端会收到确认信息。 | 
| 一致性 | 支持 K/V 操作的即时一致性。Couchbase SDK 会将 K/V 请求路由到包含数据活动副本的特定实例，因此在确认更新后，可以保证客户端读取该更新。将更新复制到其他服务（索引、搜索、分析、事件）最终是一致的。 | Amazon DocumentDB 副本最终是一致的。如果需要立即读取一致性，则客户端可以从主实例读取。 | 
| 复制 | 跨数据中心复制 (XDCR) 在许多:多拓扑中提供经过筛选的、主动-被动/主动-主动的数据复制。 | [Amazon DocumentDB 全球集群](global-clusters.html)在 1：多（最多 10 个）拓扑中提供主动-被动复制。 | 

## Discovery
<a name="discovery"></a>

迁移到 Amazon DocumentDB 需要对现有数据库工作负载有透彻的了解。工作负载发现是分析您的 Couchbase 集群配置和操作特征（数据集、索引和工作负载）的过程，以帮助确保在最小中断的情况下实现无缝过渡。

### 集群配置
<a name="cluster-configuration"></a>

Couchbase 使用以服务为中心的架构，其中每项功能都对应一项服务。对您的 Couchbase 集群执行以下命令以确定正在使用哪些服务（请参阅[获取节点信息](https://docs.couchbase.com/server/current/rest-api/rest-node-get-info.html)）：

```
curl -v -u <administrator>:<password> \
  http://<ip-address-or-hostname>:<port>/pools/nodes | \
  jq '[.nodes[].services[]] | unique'
```

示例输出：

```
[
  "backup",
  "cbas",
  "eventing",
  "fts",
  "index",
  "kv",
  "n1ql"
]
```

Couchbase 服务包括以下内容：

#### 数据服务 (kv)
<a name="data-service-kv"></a>

数据服务提供对内存和磁盘上数据的 read/write 访问。

[亚马逊 DocumentDB 支持通过 MongoDB API 对 JSON 数据进行 K/V 操作。](java-crud-operations.html)

#### 查询服务 (n1ql)
<a name="query-service-n1ql"></a>

查询服务支持通过 SQL\$1\$1 查询 JSON 数据。

亚马逊 DocumentDB 支持通过 MongoDB API 查询 JSON 数据。

#### 索引服务（索引）
<a name="index-service-index"></a>

索引服务创建和维护数据索引，从而实现更快的查询。

亚马逊 DocumentDB 支持默认主索引和通过 MongoDB API 在 JSON 数据上创建二级索引。

#### 搜索服务 (fts)
<a name="search-service-fts"></a>

搜索服务支持创建用于全文搜索的索引。

Amazon DocumentDB 的原生全文搜索功能允许您通过 MongoDB [API 使用特殊用途的文本索引对大型文本数据集执行文本搜索](text-search.html)。对于高级搜索用例，[Amazon DocumentDB Zero-etl 与亚马逊 OpenSearch 服务的集成](https://aws.amazon.com/blogs/big-data/amazon-documentdb-zero-etl-integration-with-amazon-opensearch-service-is-now-available/)提供了对亚马逊文档数据库数据的高级搜索功能，例如模糊搜索、跨馆藏搜索和多语言搜索。

#### 分析服务 (cba)
<a name="analytics-service-cbas"></a>

分析服务支持近乎实时地分析 JSON 数据。

亚马逊 DocumentDB 支持通过 MongoDB API 对 JSON 数据进行临时查询。您还可以[使用在亚马逊 EMR 上运行的 Apache Spark 对亚马逊文档数据库中的 JSON 数据进行复杂查询](https://aws.amazon.com/blogs/database/run-complex-queries-on-massive-amounts-of-data-stored-on-your-amazon-documentdb-clusters-using-apache-spark-running-on-amazon-emr/)。

#### 活动服务（活动）
<a name="eventing-service-eventing"></a>

事件服务执行用户定义的业务逻辑以响应数据更改。

Amazon DocumentDB 通过在[您的 Amazon DocumentDB 集群中每次数据发生变化时调用 AWS Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/with-documentdb-tutorial.html)来自动执行事件驱动的工作负载。

#### 备份服务（备份）
<a name="backup-service-backup"></a>

备份服务计划完整和增量数据备份，并合并以前的数据备份。

Amazon DocumentDB 会持续将您的数据备份到 Amazon S3，保留期为 1-35 天，这样您就可以快速恢复到备份保留期内的任何时间。作为持续备份过程的一部分，Amazon DocumentDB 还会自动拍摄数据快照。您还可以使用[管理 Amazon DocumentDB 的备份和恢复](https://aws.amazon.com/blogs/storage/manage-backup-and-restore-of-amazon-documentdb-with-aws-backup/)。 AWS Backup。

### 操作特征
<a name="operational-characteristics"></a>

使用[适用于 Couchbase 的发现工具](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/discovery-tool-for-couchbase)获取有关您的数据集、索引和工作负载的以下信息。这些信息将帮助您调整亚马逊文档数据库集群的规模。

#### 数据集
<a name="data-set"></a>

该工具检索以下存储桶、范围和集合信息：

1. 存储桶名称

1. 存储桶类型

1. 作用域名称

1. 集合名称

1. 总大小（字节）

1. 商品总数

1. 项目大小（字节）

#### 索引
<a name="indexes"></a>

该工具检索以下索引统计数据以及所有存储桶的所有索引定义。请注意，不包括主索引，因为 Amazon DocumentDB 会自动为每个集合创建主索引。

1. 存储桶名称

1. 作用域名称

1. 集合名称

1. 索引名

1. 索引大小（字节）

#### 工作负载
<a name="workload"></a>

该工具检索 K/V 和 N1QL 查询指标。 K/V 指标值在存储桶级别收集，SQL\$1\$1 指标在集群级别收集。

工具命令行选项如下所示：

```
python3 discovery.py \
  --username <source cluster username> \
  --password <source cluster password> \
  --data_node <data node IP address or DNS name> \
  --admin_port <administration http REST port> \
  --kv_zoom <get bucket statistics for specified interval> \
  --tools_path <full path to Couchbase tools> \
  --index_metrics <gather index definitions and SQL++ metrics> \
  --indexer_port <indexer service http REST port> \
  --n1ql_start <start time for sampling> \
  --n1ql_step <sample interval over the sample period>
```

以下是一个示例命令：

```
python3 discovery.py \
  --username username \
  --password ******** \
  --data_node "http://10.0.0.1" \
  --admin_port 8091 \
  --kv_zoom week \
  --tools_path "/opt/couchbase/bin" \
  --index_metrics true \
  --indexer_port 9102 \
  --n1ql_start -60000 \
  --n1ql_step 1000
```

K/V 指标值将基于过去一周每 10 分钟采样一次（参见 [HTTP 方法和 URI](https://docs.couchbase.com/server/current/rest-api/rest-bucket-stats.html#http-method-and-uri)）。SQL\$1\$1 指标值将基于过去 60 秒内每 1 秒的样本（参见[常规标签](https://docs.couchbase.com/server/current/rest-api/rest-statistics-single.html#general-labels)）。该命令的输出将在以下文件中：

**collection-stats.csv** — 存储桶、范围和集合信息

```
bucket,bucket_type,scope_name,collection_name,total_size,total_items,document_size
beer-sample,membase,_default,_default,2796956,7303,383
gamesim-sample,membase,_default,_default,114275,586,196
pillowfight,membase,_default,_default,1901907769,1000006,1902
travel-sample,membase,inventory,airport,547914,1968,279
travel-sample,membase,inventory,airline,117261,187,628
travel-sample,membase,inventory,route,13402503,24024,558
travel-sample,membase,inventory,landmark,3072746,4495,684
travel-sample,membase,inventory,hotel,4086989,917,4457
...
```

**index-stats.csv** — 索引名称和大小

```
bucket,scope,collection,index-name,index-size
beer-sample,_default,_default,beer_primary,468144
gamesim-sample,_default,_default,gamesim_primary,87081
travel-sample,inventory,airline,def_inventory_airline_primary,198290
travel-sample,inventory,airport,def_inventory_airport_airportname,513805
travel-sample,inventory,airport,def_inventory_airport_city,487289
travel-sample,inventory,airport,def_inventory_airport_faa,526343
travel-sample,inventory,airport,def_inventory_airport_primary,287475
travel-sample,inventory,hotel,def_inventory_hotel_city,497125
...
```

**kv-stats.csv** — 获取、设置和删除所有存储桶的指标

```
bucket,gets,sets,deletes
beer-sample,0,0,0
gamesim-sample,0,0,0
pillowfight,369,521,194
travel-sample,0,0,0
```

**n1ql-stats.csv** — SQL\$1\$1 为集群选择、删除和插入指标

```
selects,deletes,inserts
0,132,87
```

<bucket-name>ind@@ **exes-.txt** — 存储桶中所有索引的索引定义。请注意，不包括主索引，因为 Amazon DocumentDB 会自动为每个集合创建主索引。

```
CREATE INDEX `def_airportname` ON `travel-sample`(`airportname`)
CREATE INDEX `def_city` ON `travel-sample`(`city`)
CREATE INDEX `def_faa` ON `travel-sample`(`faa`)
CREATE INDEX `def_icao` ON `travel-sample`(`icao`)
CREATE INDEX `def_inventory_airport_city` ON `travel-sample`.`inventory`.`airport`(`city`)
CREATE INDEX `def_inventory_airport_faa` ON `travel-sample`.`inventory`.`airport`(`faa`)
CREATE INDEX `def_inventory_hotel_city` ON `travel-sample`.`inventory`.`hotel`(`city`)
CREATE INDEX `def_inventory_landmark_city` ON `travel-sample`.`inventory`.`landmark`(`city`)
CREATE INDEX `def_sourceairport` ON `travel-sample`(`sourceairport`)
...
```

## 规划
<a name="planning"></a>

在规划阶段，您将确定 Amazon DocumentDB 集群要求以及 Couchbase 存储桶、范围和馆藏与亚马逊文档数据库和馆藏的映射。

### 亚马逊 DocumentDB 集群要求
<a name="amazon-documentdb-cluster-requirements"></a>

使用在发现阶段收集的数据来调整您的 Amazon DocumentDB 集群的大小。有关[调整您的 Amazon DocumentDB 集群规模的更多信息，请参阅实例](best_practices.html#best_practices-instance_sizing)大小调整。

### 将存储桶、作用域和集合映射到数据库和集合
<a name="mapping-buckets-scopes-and-collections-to-databases-and-collections"></a>

确定将存在于您的 Amazon DocumentDB 集群中的数据库和馆藏。根据您的 Couchbase 集群中数据的组织方式，考虑以下选项。这些不是唯一的选择，但它们提供了可供您考虑的起点。

#### Couchbase Server 6.x 或更早版本
<a name="couchbase-6x-or-earlier"></a>

##### Couchbase 存储到亚马逊 DocumentDB 馆藏中
<a name="couchbase-buckets-to-amazon-documentdb-collections"></a>

将每个存储桶迁移到不同的亚马逊文档数据库集合。在这种情况下，Couchbase 文档`id`值将用作亚马逊 `_id` DocumentDB 的值。

![\[Couchbase Server 6.x 或更早版本的存储桶存入亚马逊 DocumentDB 馆藏\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/buckets-to-collections.png)


#### Couchbase Server 7.0 或更高版本
<a name="couchbase-70-or-later"></a>

##### Couchbase 馆藏到亚马逊 DocumentDB 馆藏
<a name="couchbase-collections-to-amazon-documentdb-collections"></a>

将每个馆藏迁移到不同的亚马逊 DocumentDB 馆藏。在这种情况下，Couchbase 文档`id`值将用作亚马逊 `_id` DocumentDB 的值。

![\[Couchbase Server 7.0 或更高版本的馆藏到亚马逊 DocumentDB 馆藏\]](http://docs.aws.amazon.com/zh_cn/documentdb/latest/developerguide/images/collections-to-collections.png)


## 迁移
<a name="migration"></a>

### 索引迁移
<a name="index-migration"></a>

迁移到 Amazon DocumentDB 不仅需要传输数据，还需要传输索引，以保持查询性能和优化数据库操作。本节概述了在确保兼容性和效率的同时将索引迁移到 Amazon DocumentDB 的详细 step-by-step过程。

使用 [Amazon Q](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/chat-with-q.html) 将 SQL\$1\$1 `CREATE INDEX` 语句转换为亚马逊 DocumentDB 命令`createIndex()`。

1. 上传**索引——由 Couchbase 的发现工具创建的.txt** <bucket name>文件。

1. 输入以下提示：

   `Convert the Couchbase CREATE INDEX statements to Amazon DocumentDB createIndex commands`

Amazon Q 将生成等效的亚马逊 DocumentDB 命令`createIndex()`。请注意，您可能需要根据将 [Couchbase 存储桶、范围和集合映射到 Amazon DocumentDB 馆藏的方式来更新馆藏](#mapping-buckets-scopes-and-collections-to-databases-and-collections)名称。

例如：

**indexes-beer-sample.txt**

```
CREATE INDEX `beerType` ON `beer-sample`(`type`)
CREATE INDEX `code` ON `beer-sample`(`code`) WHERE (`type` = "brewery")
```

Amazon Q 输出示例（摘录）：

```
db.beerSample.createIndex(
  { "type": 1 },
  {
    "name": "beerType",
    "background": true
  }
)

db.beerSample.createIndex(
  { "code": 1 },
  {
    "name": "code",
    "background": true,
    "partialFilterExpression": { "type": "brewery" }
  }
)
```

有关 Amazon Q 无法转换的任何索引，请参阅[管理 Amazon DocumentDB 索引](managing-indexes.html)、[索引和索引属性](mongo-apis.html#mongo-apis-index)了解更多信息。

### 重构代码以使用 MongoDB APIs
<a name="refactor-code-to-use-the-mongodb-apis"></a>

客户使用 Couchbase 连接 SDKs 到 Couchbase 服务器。亚马逊 DocumentDB 客户端使用 MongoDB 驱动程序连接到亚马逊 DocumentDB。MongoDB 驱动程序也支持 Couchbase SDKs 支持的所有语言。有关适用于[您的语言的驱动程序的更多信息，请参阅 MongoDB](https://www.mongodb.com/docs/drivers/) 驱动程序。

 APIs 由于 Couchbase Server 和 Amazon DocumentDB 不同，因此您需要重构代码才能使用相应的 MongoDB。 APIs你可以使用 [Amazon Q](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/chat-with-q.html) 将 K/V API 调用和 SQL\$1\$1 查询转换为等效的 MongoDB： APIs

1. 上传源代码文件。

1. 输入以下提示：

   `Convert the Couchbase API code to Amazon DocumentDB API code`

使用 [Hello Couchbase Python](https://docs.couchbase.com/python-sdk/current/hello-world/start-using-sdk.html#hello-couchbase) 代码示例，Amazon Q 生成以下内容（摘录）：

```
from datetime import timedelta
from pymongo import MongoClient

# Connection parameters
database_name = "travel-sample"

# Connect to Amazon DocumentDB cluster
client = MongoClient('<Amazon DocumentDB connection string>')

# Get reference to database and collection
db = client['travel-sample']
airline_collection = db['airline']

# upsert document function
def upsert_document(doc):
    print("\nUpsert Result: ")
    try:
        # key will equal: "airline_8091"
        key = doc["type"] + "_" + str(doc["id"])
        doc['_id'] = key # Amazon DocumentDB uses _id as primary key
        result = airline_collection.update_one(
            {'_id': key},
            {'$set': doc},
            upsert=True
        )
        print(f"Modified count: {result.modified_count}")
    except Exception as e:
        print(e)

# get document function
def get_airline_by_key(key):
    print("\nGet Result: ")
    try:
        result = airline_collection.find_one({'_id': key})
        print(result)
    except Exception as e:
        print(e)

# query for document by callsign
def lookup_by_callsign(cs):
    print("\nLookup Result: ")
    try:
        result = airline_collection.find(
            {'callsign': cs},
            {'name': 1, '_id': 0}
        )
        for doc in result:
            print(doc['name'])
    except Exception as e:
        print(e)

# Test document
airline = {
    "type": "airline",
    "id": 8091,
    "callsign": "CBS",
    "iata": None,
    "icao": None,
    "name": "Couchbase Airways",
}

upsert_document(airline)
get_airline_by_key("airline_8091")
lookup_by_callsign("CBS")
```

有关使用 Python、Node.js、PHP、Go、Java、C\$1/NET、R 和 Ruby 连接[亚马逊文档数据库的示例，请参阅以编程方式](connect_programmatically.html)连接到亚马逊文档数据库。

### 选择迁移方法
<a name="select-the-migration-approach"></a>

将数据迁移到 Amazon DocumentDB 时，有两种选择：

1. [离线迁移](#offline-migration)

1. [在线迁移](#online-migration)

#### 离线迁移
<a name="offline-migration"></a>

在以下情况下，可以考虑离线迁移：
+ **停机时间是可以接受的：**离线迁移包括停止对源数据库的写入操作，导出数据，然后将其导入到 Amazon DocumentDB。此过程会导致您的应用程序停机。如果您的应用程序或工作负载可以容忍这段不可用期，那么离线迁移是一个可行的选择。
+ **迁移较小的数据集或进行概念验证：**对于较小的数据集，导出和导入过程所需的时间相对较短，这使得离线迁移成为一种快速而简单的方法。它也非常适合开发、测试和停机时间不太重要的 proof-of-concept环境。
+ **简单性是重中之重：**使用 cbexport 和 mongoimport 的离线方法通常是迁移数据的最直接方法。它避免了在线迁移方法中涉及的变更数据捕获 (CDC) 的复杂性。
+ **无需复制正在进行的更改：**如果源数据库在迁移期间没有主动接收更改，或者如果在迁移过程中捕获这些更改并将其应用于目标数据库并不重要，则可以使用离线方法。

**Topics**
+ [Couchbase Server 6.x 或更早版本](#couchbase-6x-or-earlier-offline)
+ [Couchbase Server 7.0 或更高版本](#couchbase-70-or-later-offline)

##### Couchbase Server 6.x 或更早版本
<a name="couchbase-6x-or-earlier-offline"></a>

##### Couchbase 存储桶到亚马逊 DocumentDB 馆藏
<a name="couchbase-bucket-to-amazon-documentdb-collection-offline"></a>

使用 [cbexport json](https://docs-archive.couchbase.com/server/6.6/tools/cbexport-json.html) 导出数据，为存储桶中的所有数据创建 JSON 转储。对于该`--format`选项，你可以使用`lines`或`list`。

```
cbexport json \
  --cluster <source cluster endpoint> \
  --bucket <bucket name> \
  --format <lines | list> \
  --username <username> \
  --password <password> \
  --output export.json \
  --include-key _id
```

使用 [mongoimport 将数据导](backup_restore-dump_restore_import_export_data.html#backup_restore-dump_restore_import_export_data-mongoimport)入亚马逊文档数据库集合，并使用相应的选项来导入行或列表：

台词：

```
mongoimport \
  --db <database> \
  --collection <collection> \
  --uri "<Amazon DocumentDB cluster connection string>" \
  --file export.json
```

清单：

```
mongoimport \
  --db <database> \
  --collection <collection> \
  --uri "<Amazon DocumentDB cluster connection string>" \
  --jsonArray \
  --file export.json
```

##### Couchbase Server 7.0 或更高版本
<a name="couchbase-70-or-later-offline"></a>

要执行离线迁移，请使用 cbexport 和 mongoimport 工具：

##### 带有默认范围和默认集合的 Couchbase 存储桶
<a name="couchbase-bucket-with-default-scope-and-default-collection-offline"></a>

使用 [cbexport json](https://docs.couchbase.com/server/current/tools/cbexport-json.html) 导出数据，创建存储桶中所有集合的 JSON 转储。对于该`--format`选项，你可以使用`lines`或`list`。

```
cbexport json \
  --cluster <source cluster endpoint> \
  --bucket <bucket name> \
  --format <lines | list> \
  --username <username> \
  --password <password> \
  --output export.json \
  --include-key _id
```

使用 [mongoimport 将数据导](backup_restore-dump_restore_import_export_data.html#backup_restore-dump_restore_import_export_data-mongoimport)入亚马逊文档数据库集合，并使用相应的选项来导入行或列表：

台词：

```
mongoimport \
  --db <database> \
  --collection <collection> \
  --uri "<Amazon DocumentDB cluster connection string>" \
  --file export.json
```

清单：

```
mongoimport \
  --db <database> \
  --collection <collection> \
  --uri "<Amazon DocumentDB cluster connection string>" \
  --jsonArray \
  --file export.json
```

##### Couchbase 馆藏到亚马逊 DocumentDB 馆藏
<a name="couchbase-collections-to-amazon-documentdb-collections-offline"></a>

使用 [cbexport json 导出数据，为每个](https://docs.couchbase.com/server/current/tools/cbexport-json.html)集合创建一个 JSON 转储。使用该`--include-data`选项导出每个集合。对于该`--format`选项，你可以使用`lines`或`list`。使用`--scope-field`和`--collection-field`选项将作用域和集合的名称存储在每个 JSON 文档的指定字段中。

```
cbexport json \
  --cluster <source cluster endpoint> \
  --bucket <bucket name> \
  --include-data <scope name>.<collection name> \
  --format <lines | list> \
  --username <username> \
  --password <password> \
  --output export.json \
  --include-key _id \
  --scope-field "_scope" \
  --collection-field "_collection"
```

由于 cbexport 将`_scope`和`_collection`字段添加到每个导出的文档中，因此您可以通过搜索和替换或任何您喜欢的方法将它们从导出文件中的每个文档中删除。`sed`

使用 [mongoimport 将每个馆藏的数据导入到 Amazon Documpor](backup_restore-dump_restore_import_export_data.html#backup_restore-dump_restore_import_export_data-mongoimport) t 集合中，并使用相应的选项来导入行或列表：

台词：

```
mongoimport \
--db <database> \
--collection <collection> \
--uri "<Amazon DocumentDB cluster connection string>" \
--file export.json
```

清单：

```
mongoimport \
--db <database> \
--collection <collection> \
--uri "<Amazon DocumentDB cluster connection string>" \
--jsonArray \
--file export.json
```

#### 在线迁移
<a name="online-migration"></a>

当您需要最大限度地减少停机时间并且需要近乎实时地将正在进行的更改复制到 Amazon DocumentDB 时，可以考虑在线迁移。

请参阅[如何执行从 Couchbase 到亚马逊 DocumentDB 的实时迁移，了解如何实时迁移到亚马逊](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/migration-utility-for-couchbase) DocumentDB。本文档将指导您部署解决方案以及将存储桶实时迁移到 Amazon DocumentDB 集群。

**Topics**
+ [Couchbase Server 6.x 或更早版本](#couchbase-6x-or-earlier-online)
+ [Couchbase Server 7.0 或更高版本](#couchbase-70-or-later-online)

##### Couchbase Server 6.x 或更早版本
<a name="couchbase-6x-or-earlier-online"></a>

##### Couchbase 存储桶到亚马逊 DocumentDB 馆藏
<a name="couchbase-bucket-to-amazon-documentdb-collection-online"></a>

[Couchbase 的迁移实用程序](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/migration-utility-for-couchbase)已预先配置为将 Couchbase 存储桶在线迁移到亚马逊 DocumentDB 集合。查看[接收器连接器](https://github.com/awslabs/amazon-documentdb-tools/blob/master/migration/migration-utility-for-couchbase/migration-utility-connectors.yaml)配置，`document.id.strategy`参数配置为使用消息键值作为`_id`字段值（参见 Sin [k 连接器 ID 策略属性](https://www.mongodb.com/docs/kafka-connector/current/sink-connector/configuration-properties/id-strategy/#std-label-sink-configuration-id-strategy)）：

```
ConnectorConfiguration:
  document.id.strategy: 'com.mongodb.kafka.connect.sink.processor.id.strategy.ProvidedInKeyStrategy'
```

##### Couchbase Server 7.0 或更高版本
<a name="couchbase-70-or-later-online"></a>

##### 带有默认范围和默认集合的 Couchbase 存储桶
<a name="couchbase-bucket-with-default-scope-and-default-collection-online"></a>

[Couchbase 的迁移实用程序](https://github.com/awslabs/amazon-documentdb-tools/tree/master/migration/migration-utility-for-couchbase)已预先配置为将 Couchbase 存储桶在线迁移到亚马逊 DocumentDB 集合。查看[接收器连接器](https://github.com/awslabs/amazon-documentdb-tools/blob/master/migration/migration-utility-for-couchbase/migration-utility-connectors.yaml)配置，`document.id.strategy`参数配置为使用消息键值作为`_id`字段值（参见 Sin [k 连接器 ID 策略属性](https://www.mongodb.com/docs/kafka-connector/current/sink-connector/configuration-properties/id-strategy/#std-label-sink-configuration-id-strategy)）：

```
ConnectorConfiguration:
  document.id.strategy: 'com.mongodb.kafka.connect.sink.processor.id.strategy.ProvidedInKeyStrategy'
```

##### Couchbase 馆藏到亚马逊 DocumentDB 馆藏
<a name="couchbase-collections-to-amazon-documentdb-collections-online"></a>

将[源连接器](https://github.com/awslabs/amazon-documentdb-tools/blob/master/migration/migration-utility-for-couchbase/migration-utility-connectors.yaml)配置为将每个作用域中的每个 Couchbase 集合流式传输到单独的主题（请参阅[源配置选项](https://docs.couchbase.com/kafka-connector/current/source-configuration-options.html#couchbase.collections)）。例如：

```
ConnectorConfiguration:
  # add couchbase.collections configuration
  couchbase.collections: '<scope 1>.<collection 1>, <scope 1>.<collection 2>, ...'
```

将[接收器连接器](https://github.com/awslabs/amazon-documentdb-tools/blob/master/migration/migration-utility-for-couchbase/migration-utility-connectors.yaml)配置为从每个主题流式传输到单独的 Amazon DocumentDB 集合（请参阅[接收器连接器配置属性](https://github.com/mongodb-labs/mongo-kafka/blob/master/docs/sink.md#sink-connector-configuration-properties)）。例如：

```
ConnectorConfiguration:
  # remove collection configuration  
  #collection: 'test'
  
  # modify topics configuration
  topics: '<bucket>.<scope 1>.<collection 1>, <bucket>.<scope 1>.<collection 2>, ...'

  # add topic.override.%s.%s configurations for each topic 
  topic.override.<bucket>.<scope 1>.<collection 1>.collection: '<collection>'
  topic.override.<bucket>.<scope 1>.<collection 2>.collection: '<collection>'
```

## 验证
<a name="validation"></a>

本节提供了详细的验证流程，用于在迁移到 Amazon DocumentDB 后验证数据的一致性和完整性。无论采用何种迁移方法，验证步骤都适用。

**Topics**
+ [验证目标中是否存在所有集合](#validation-checklist-step-1)
+ [验证源群集和目标群集之间的文档数量](#validation-checklist-step-2)
+ [比较源群集和目标群集之间的文档](#validation-checklist-step-3)

### 验证目标中是否存在所有集合
<a name="validation-checklist-step-1"></a>

#### Couchbase 来源
<a name="source-verify-collections"></a>

选项 1：查询工作台

```
SELECT RAW `path`
  FROM system:keyspaces
  WHERE `bucket` = '<bucket>'
```

选项 2：[cbq 工具](https://docs.couchbase.com/server/current/cli/cbq-tool.html)

```
cbq \
  -e <source cluster endpoint> \
  -u <username> \
  -p <password> \
  -q "SELECT RAW `path`
       FROM system:keyspaces
       WHERE `bucket` = '<bucket>'"
```

#### Amazon DocumentDB 目标
<a name="target-verify-collections"></a>

mongosh（参见 Connect [连接到你的亚马逊 DocumentDB 集群](connect-ec2-manual.html#manual-connect-ec2.connect-use)）：

```
db.getSiblingDB('<database>')
db.getCollectionNames()
```

### 验证源群集和目标群集之间的文档数量
<a name="validation-checklist-step-2"></a>

#### Couchbase 来源
<a name="source-verify-document-count"></a>

##### Couchbase Server 6.x 或更早版本
<a name="source-verify-document-count-couchbase-6x-or-earlier"></a>

选项 1：查询工作台

```
SELECT COUNT(*)
FROM `<bucket>`
```

选项 2：[cbq](https://docs.couchbase.com/server/current/cli/cbq-tool.html)

```
cbq \
  -e <source cluster endpoint> \
  -u <username> \
  -p <password> \
  -q "SELECT COUNT(*)
       FROM `<bucket:>`"
```

##### Couchbase Server 7.0 或更高版本
<a name="source-verify-document-count-couchbase-70-or-later"></a>

选项 1：查询工作台

```
SELECT COUNT(*)
FROM `<bucket>`.`<scope>`.`<collection>`
```

选项 2：[cbq](https://docs.couchbase.com/server/current/cli/cbq-tool.html)

```
cbq \
  -e <source cluster endpoint> \
  -u <username> \
  -p <password> \
  -q "SELECT COUNT(*)
       FROM `<bucket:>`.`<scope>`.`<collection>`"
```

#### Amazon DocumentDB 目标
<a name="target-verify-document-count"></a>

mongosh（参见 Connect [连接到你的亚马逊 DocumentDB 集群](connect-ec2-manual.html#manual-connect-ec2.connect-use)）：

```
db = db.getSiblingDB('<database>')
db.getCollection('<collection>').countDocuments()
```

### 比较源群集和目标群集之间的文档
<a name="validation-checklist-step-3"></a>

#### Couchbase 来源
<a name="source-compare-documents"></a>

##### Couchbase Server 6.x 或更早版本
<a name="source-compare-documents-couchbase-6x-or-earlier"></a>

选项 1：查询工作台

```
SELECT META().id as _id, *
FROM `<bucket>`
LIMIT 5
```

选项 2：[cbq](https://docs.couchbase.com/server/current/cli/cbq-tool.html)

```
cbq \
  -e <source cluster endpoint> 
  -u <username> \
  -p <password> \
  -q "SELECT META().id as _id, *
       FROM `<bucket>` \
       LIMIT 5"
```

##### Couchbase Server 7.0 或更高版本
<a name="source-compare-documents-couchbase-70-or-later"></a>

选项 1：查询工作台

```
SELECT COUNT(*)
FROM `<bucket>`.`<scope>`.`<collection>`
```

选项 2：[cbq](https://docs.couchbase.com/server/current/cli/cbq-tool.html)

```
cbq \
  -e <source cluster endpoint> \
  -u <username> \
  -p <password> \
  -q "SELECT COUNT(*)
       FROM `<bucket:>`.`<scope>`.`<collection>`"
```

#### Amazon DocumentDB 目标
<a name="target-compare-documents"></a>

mongosh（参见 Connect [连接到你的亚马逊 DocumentDB 集群](connect-ec2-manual.html#manual-connect-ec2.connect-use)）：

```
db = db.getSiblingDB('<database>')
db.getCollection('<collection>').find({
  _id: {
    $in: [
      <_id 1>, <_id 2>, <_id 3>, <_id 4>, <_id 5>
    ]
  }
})
```