在本教程中,使用 Visual Studio Code 中的 Azure DocumentDB 迁移扩展来创建和管理从 MongoDB 的本地或云实例到 Azure DocumentDB 的迁移作业。 此扩展提供开发人员友好的界面来执行迁移,而不会中断服务。 该扩展无需额外的基础结构,并提供安全连接、零成本使用情况,以及精细控制要迁移的数据库和集合。
本文重点介绍如何使用扩展的集成工作流直接在 Visual Studio Code 中简化迁移步骤。 此方法非常适合需要简化的托管体验且复杂性最低且可靠性最高的方案。
先决条件
- 一份 Azure 订阅。 如果没有 Azure 订阅,请创建一个试用帐户。
现有 Azure DocumentDB 群集
- 如果没有群集,请 创建新群集
- 在计算机上安装 Azure DocumentDB 迁移扩展。 此安装会自动安装其必备组件 DocumentDB for Visual Studio Code 扩展。
在开始迁移之前,请准备 Azure DocumentDB 帐户和现有的 MongoDB 实例进行迁移。
MongoDB 实例(源)
- 完成预迁移评估,检查源实例和目标帐户之间的不兼容和警告。
- 添加一个具有
readAnyDatabase和clusterMonitor权限的用户,除非已存在。 在扩展中创建迁移作业时使用此凭据。
Azure DocumentDB(target)
- 收集 Azure DocumentDB 帐户凭据。
- 确保用户具有
createCollection、dropCollection、createIndex和insertlistCollections权限。
所需的最低权限
使用以下最低角色以创建和运行迁移作业。
| 最低角色 | Scope | 适用于连接模式 | Purpose |
|---|---|---|---|
| 读取器 | Subscription | 公共和专用 | 列出订阅和资源组。 每个迁移作业都是必需的。 |
| Azure 数据库迁移服务 参与者 | 资源组 | 公共和专用 | 创建Azure 数据库迁移服务(DMS)。 无需为每个迁移创建新的 DMS。 每个地区一个 DMS 就足够了。 |
| 参与者 | Subscription | 公共和专用 | 在订阅中注册 DMS。 这是一次性活动,可以委托给另一个用户。 |
| 用户访问管理员 | 虚拟网络 | 仅限专用 | 将网络参与者角色分配给 DMS 对象主体。 这是每个虚拟网络的一次性活动,可以委托给其他用户。 |
| 参与者 | Azure DocumentDB | 公共和专用 | 触发迁移作业。 |
有关提供程序注册详细信息,请参阅 在您的订阅中注册 Microsoft.DataMigration 资源提供程序。
重要
迁移作业当前不支持Microsoft Entra ID身份验证。 使用原生 DocumentDB 身份验证。
执行迁移
有关迁移大小、速度和直接转换的规划指南,请参阅 迁移最佳做法。
连接到源
- 打开 DocumentDB for VS Code 扩展。
- 添加要迁移到 “文档数据库连接 ”列表的 MongoDB 服务器。
- 选择“ 添加新连接”。
- 在导航栏上,选择Connection String。
- 请粘贴您的连接字符串:
mongodb://<YOUR_USERNAME>:<YOUR_PASSWORD>@localhost:10260/?tls=true&tlsAllowInvalidCertificates=true&authMechanism=SCRAM-SHA-256 - 从 DocumentDB 连接列表中,选择一个连接并展开以进行连接。
调用迁移扩展
可以从 DocumentDB 连接调用迁移扩展。
右键单击展开的(已连接)连接。
从上下文菜单中选择 “数据迁移 ”。
在 Visual Studio Code 中的上下文菜单的屏幕截图。
在命令面板中,选择迁移到 Azure DocumentDB。
然后选择 迁移到 Azure DocumentDB。 命令面板的
迁移向导将引导您完成此过程。
创建迁移作业
使用迁移作业将一组集合从源迁移到目标Azure DocumentDB。 创建迁移作业向导有七个步骤。
步骤 1:创建作业
在此步骤中,输入作业的基本详细信息。
作业名称:输入用户友好名称以标识迁移作业。
迁移模式:选择最适合用例的迁移模式。
- 联机 迁移复制收集数据,并确保在此过程中也会复制更新。 此方法可最大程度地减少停机时间,使运营保持业务连续性。 如果正在进行的操作至关重要,需要优先考虑减少停机时间,则可以使用此选项。
- 脱机 迁移在开始时捕获数据库的快照,提供了一种更简单、更可预测的方法。 如果可以接受使用数据库的静态副本,实时更新并不重要,则可以使用这种方法。
重要
若要确保从 MongoDB 成功联机迁移,必须在源 MongoDB 服务器上启用 ChangeStream。 如果没有 ChangeStream,迁移过程不会捕获初始迁移后对数据所做的任何修改。 因此,仅在源 MongoDB 服务器上启用了 ChangeStream 时,才使用联机迁移模式。
连接:根据组织的安全授权和网络设置,从 “公共 ”和 “专用”中进行选择。
- 当通过公共 IP 通过 Internet 访问源服务器和目标服务器时使用公共服务器。 它支持需要外部辅助功能的服务。
- 当源服务器或目标服务器只能通过虚拟网络中的专用 IP 进行访问时使用 专用 服务器。 它通过消除对公共 Internet 的曝光来提高安全性。
选择“下一步”继续操作。
步骤 2:选择目标
选择现有 Azure DocumentDB 帐户并提供其连接字符串。
从下拉列表中选择订阅、资源组和 Azure DocumentDB 帐户。
输入 Azure DocumentDB 帐户的连接字符串。
确保Azure DocumentDB 防火墙上允许屏幕上列出的 IP。
选择“下一步”继续操作。
步骤 3:选择数据库迁移服务(DMS)
Azure 数据库迁移服务是一项服务,它使用云基础结构进行数据传输,而不是依赖本地资源,将数据迁移到Azure数据平台。 从下拉列表中选择现有的Azure 数据库迁移服务实例,或选择 Create DMS 创建新的迁移服务。
重要
请确保 Microsoft.DataMigration 资源提供程序已在您的订阅中注册。 每个订阅只需操作一次。
选择“下一步”继续操作。
步骤 4:配置连接
此屏幕取决于在步骤 1 中选择的连接模式。
若要启用公共连接,请:
在迁移向导中,选择 “公共 ”作为连接模式。
请注意向导中显示的静态 IP 地址。
将这些 IP 地址添加到源 MongoDB 服务器上的防火墙允许列表。
将这些 IP 地址添加到 Azure DocumentDB 防火墙。
若要启用专用连接,请:
在迁移向导中,选择“ 专用 ”作为连接模式。
为源环境选择订阅、资源组和虚拟网络。
为目标环境选择订阅、资源组和虚拟网络。
在 “DMS 配置 ”部分中,选择不与虚拟网络或任何可访问的本地地址空间重叠的 CIDR 范围。
运行向导中提供的 PowerShell 脚本,以实现虚拟网络集成和对等互连。
有关详细信息,请参阅 公共连接、 专用连接和 连接故障排除。
选择“下一步”继续操作。
步骤 5:选择集合
选择要包含在迁移作业中的集合。 使用搜索选项从集合列表中选择。 目标中已存在的集合会自动在“目标中的存在”列中标记为“是”。
小窍门
请确保选择要包括的所有集合,因为创建迁移作业后无法添加集合。
选择“下一步”继续操作。
步骤 6:配置集合
配置每个所选集合迁移到目标的方式。 对于每个集合,请设置以下选项:
- 覆盖目标集合:指定是否覆盖目标中已存在的集合。 分片和索引选项仅在将 Overwrite 目标集合设置为“是”时适用。
- 分片策略:选择是分片目标集合还是将其保留为未分片。 对目标集合进行分片时,它将使用与源集合相同的分片键。
-
索引策略:选择在目标集合上构建索引的方式:
- 不要创建索引:跳过索引创建。
- 从源复制索引:从源集合复制所有索引。 在初始数据加载之前复制唯一索引,在初始数据加载后复制非唯一索引。
使用内联编辑器为单个集合配置这些设置,或选择 “批量更新 ”将相同的设置应用于多个集合。
选择“下一步”继续操作。
步骤 7:确认并启动
选择 “开始迁移”之前,请查看迁移作业详细信息。 如果需要更新详细信息,请使用 “编辑详细信息 ”按钮。
创建迁移作业后,会自动重定向到“ 查看现有作业 ”页。
小窍门
Azure 数据库迁移服务运行数据迁移任务。 因此,在数据迁移期间,无需连接到源环境和目标环境。 仪表板会定期更新状态。
监视现有迁移作业
使用“ 查看现有作业 ”选项卡监视已初始化作业的迁移状态。 所选 DMS 确定作业列表。 使用 “更改 DMS ”按钮更改所选内容。
状态会定期自动更新。 将所选集合快照复制到目标后,脱机作业会自动完成。 但是,需要手动切换联机迁移。
可以 暂停 迁移作业,以在逻辑点暂时停止迁移作业。 当您准备好继续时,请选择 恢复,从作业停止处继续。
若要查看集合状态,请从表中选择一行。
监视在线迁移
与离线迁移不同,在线迁移不会自动完成。 相反,它们会持续运行,直到你通过选择 直接转换手动完成它们。
要完成在线迁移,请按给定顺序执行以下步骤:
所有集合的初始数据加载完成后,将启用 “直接转换 ”按钮。 在此阶段,作业处于复制阶段,持续将更新从源实例复制到目标实例,以使其保持最新状态并同步最新更改。
准备好执行迁移直接转换时,停止要迁移的源集合的所有传入事务。
自 上次更改以来的时间 显示上次更新与当前时间之间的时间差距。
监视表中的复制更改,并等待 复制更改应用 指标稳定。 稳定的 复制更改播放 指标指示源中的所有更新已成功复制到目标。
在所有集合的复制间隔最小且复制更改播放指标稳定时,请选择“直接转换”。
手动验证源集合和目标集合之间的行计数是否相同。
注释
如果在不验证源和目标同步的情况下执行直接转换操作,则可能会丢失数据。
迁移方案
Azure DocumentDB 迁移扩展支持多个源环境,包括Azure、本地数据中心和其他云提供商中运行的 MongoDB 实例。 该扩展提供了灵活的连接选项,以适应不同的网络配置和安全要求。
支持的源环境
下表汇总了支持的迁移源:
| 源环境 | Description |
|---|---|
| 在 Azure 中 | 在Azure 虚拟机或其他Azure托管服务上运行的 MongoDB 实例 |
| 本地 | 在本地数据中心或专用基础结构中运行的 MongoDB 服务器 |
| 其他云提供商 | 托管在其他云平台上的 MongoDB 实例 |
公共连接
在公共连接模式下,Azure 数据库迁移服务(DMS)通过公共 Internet 连接到源服务器和目标服务器。 DMS 提供的静态 IP 地址可添加到源服务器和目标服务器上的防火墙允许列表。 DMS 将共享公共虚拟网络用于给定区域中的所有迁移。 虽然此虚拟网络在客户之间共享,但每个迁移作业在其自己的独立专用工作节点上运行,以确保作业级别的隔离。
在以下情况下使用公共连接:
- 源服务器和目标服务器可通过公共 IP 地址访问。
- 组织的安全策略允许通过公共 Internet 建立连接。
- 您需要一种不需要虚拟网络配置的更简单设置。
私有连接
在专用连接模式下,DMS 为每个迁移作业预配专用专用虚拟网络,并将其与源和目标虚拟网络对等互连。 此设置意味着每个作业都获取隔离的工作器节点和隔离网络,确保作业之间没有流量交叉,客户之间不存在共享网络路径。
该扩展最多支持两个虚拟网络:
- 源虚拟网络:可访问源 MongoDB 服务器的虚拟网络。
- Target 虚拟网络:可访问 Azure DocumentDB 群集的虚拟网络。
在以下情况下使用专用连接:
- 源或目标服务器无法通过公共 Internet 访问。
- 你的组织需要所有流量流经专用网络。
- 你需要避免将互联网暴露给公众。
重要
一个虚拟网络一次只能支持一个活动迁移作业,而连接模式是专用的。 若要运行多个并发作业,请对每个作业使用不同的虚拟网络。
在开始迁移作业之前完成以下要求:
- 禁用专用终结点子网的网络策略。 子网级专用终结点网络策略可以阻止源自 DMS 虚拟网络的流量。 在托管目标Azure DocumentDB 专用终结点的子网上禁用它们:
az network vnet subnet update \ --subscription "<SUBSCRIPTION>" -g "<TARGET_RG>" \ --vnet-name "<TARGET_VNET>" -n "<PRIVATE_ENDPOINT_SUBNET>" \ --disable-private-endpoint-network-policies true - 授予 DMS 主体对中心的虚拟网络网关的读取权限。 当 DMS 与中心建立对等连接时,它会验证网关配置以使用
useRemoteGateways。 将 VPN 或 ExpressRoute 网关资源上的 读取者 角色分配给 DMS 服务主体。 如果没有这种访问权限,向导中的对等互连设置步骤会失败。 - 允许列出 DMS CIDR 端到端。 将迁移向导中显示的 DMS CIDR 添加到本地防火墙、路径中的 NSG 和任何 ExpressRoute 路由筛选器。 如果路径中的任何设备无法识别该范围值,则返回到源的流量会被丢弃。
- 不要依赖对等网络的自定义本地 DNS。 本地 DNS 服务器无法解析 DMS 对等中心Azure专用 DNS 区域记录。 在迁移作业中,对源使用基于 IP 的连接字符串以跳过 DNS。
为何选择虚拟网络和 CIDR 范围
专用连接的工作原理是将 DMS 放置在专用网络空间 内 ,以便它可以通过专用 IP 地址(而不是公共 Internet)访问源和目标。 为此,DMS 需要两项操作:要连接到的 虚拟网络 ,以及自己的网络的 CIDR 范围 。 了解每个操作有助于避免最常见的设置错误。
虚拟网络选择执行的操作
DMS 无法自行查看专用终结点。 选择 源虚拟网络 和 目标虚拟网络时,DMS 会创建自己的专用虚拟网络,并将其与所选网络 对等互连 。 对等互连是构建专用路径的内容:对等互连后,DMS 可以通过专用 IP 解析并访问源 MongoDB 服务器和目标Azure DocumentDB 群集。
为每个端选择的虚拟网络必须是实际提供该终结点的网络路径的虚拟网络:
- 源:选择源 MongoDB 服务器可以通过专用 IP 访问的虚拟网络。 如果源位于本地或其他云中,则这是保留 VPN/ExpressRoute 网关(或路由到)的虚拟网络。 如果源位于专用终结点后面Azure,请选择包含该专用终结点的虚拟网络。
- 目标:选择可访问 Azure DocumentDB 专用终结点的虚拟网络。
选择 看起来 相关的但没有路由到终结点的虚拟网络是最常见的错误。 对等互连成功,但流量永远不会到达源或目标,因为没有基础路由。
CIDR 范围的作用
DMS 创建的专用虚拟网络需要自己的专用 IP 地址空间,并将该地址空间作为 CIDR 范围(例如) 10.240.0.0/24提供。 DMS 从此范围分配其工作节点地址,这些地址将成为所有迁移流量的来源。 这就是为什么 CIDR 范围在整个验证和防火墙步骤中出现的原因。
CIDR 范围不得与它需要访问的任何网络重叠。 如果 DMS CIDR 与源虚拟网络、目标虚拟网络或任何可通过网关访问的本地范围重叠,则网络无法判断地址是本地还是远程地址,因此对等互连失败或流量无提示错误路由。
由于 CIDR 范围是所有迁移流量的源,因此还必须允许它通过保护源或目标的每个防火墙或网络安全组(NSG)。 将 CIDR 范围添加到源 MongoDB 防火墙、Azure DocumentDB 防火墙以及网络路径中的任何本地或其他云防火墙。 如果不允许列出 CIDR,即使对等互连和路由正确,也会阻止流量。
要避免的常见错误
- 选择错误的虚拟网络。 选择具有指向终结点的实际路由的虚拟网络,而不仅仅是具有类似名称或同一资源组的虚拟网络。
- 选择重叠 CIDR。 选择与源虚拟网络、目标虚拟网络或本地地址空间不重叠的范围。 首先检查现有地址空间。
- 不允许通过防火墙列出 CIDR。 将 DMS CIDR 范围添加到保护源或目标的每个防火墙和 NSG。 如果 CIDR 不在允许列表中,即使对等互连成功,也会阻止流量。
- 选择太小的 CIDR。 为 DMS 工作器节点提供足够大的范围(这是
/24一个安全的默认值)。 范围太小可能会导致预配失败。 - 重复使用仍在使用的 CIDR。 如果构建 了一个模拟环境 来验证连接,请在启动实际作业之前将其删除。 使用同一 CIDR 的剩余网络与 DMS 尝试创建的网络冲突。
有关这些选择的分步验证,请参阅 排查连接问题。
从其他云提供商或内部部署
使用首选 VPN 工具在Azure与另一个云或本地的源环境之间建立网络连接。 根据网络体系结构,支持以下拓扑。
单个虚拟网络
在此拓扑中,VPN/ExpressRoute 网关和源工作负荷位于同一虚拟网络中。 DMS 与此虚拟网络直接对等互连,并使用 useRemoteGateways 连接到本地环境或其他云中的源。
集线器直连
在此拓扑中,VPN/ExpressRoute 网关位于专用中心虚拟网络中。 DMS 直接与中心建立对等连接,因此它可以通过 useRemoteGateways 原生使用该网关。
采用 TCP 代理的中心辐射型拓扑
如果 DMS 只能与某个辐射虚拟网络建立对等互连,且无法直接与中心建立对等互连,请在与 DMS 建立了对等互连的辐射虚拟网络中部署一台 MongoDB 迁移代理 虚拟机。 代理通过中心的 VPN/ExpressRoute 网关将来自 DMS 的流量转发到源 MongoDB 服务器。
注释
DMS 会创建一个临时虚拟网络,并与您的网络建立对等连接。 在企业中心辐射拓扑中,虚拟网络对等互连是非传递的,因此 DMS 无法自动通过分支虚拟网络访问中心 VPN 网关。 需要路由机制,例如直接中心对等互连或部署在 DMS 对等互连虚拟网络中的 TCP 代理。 有关验证步骤,请参阅 排查连接问题。
从 Azure 中的专用终结点
为源和目标虚拟网络设置专用终结点。
排查连接问题
迁移作业失败时,请使用以下步骤跟踪网络连接中断的位置。 DMS 为每个迁移作业创建一个专用临时虚拟网络,并在作业完成或失败后立即将其清除。 之后无法检查 DMS 虚拟网络,因此可以重现其网络位置来隔离故障。
验证先决条件
| 工具 | Purpose |
|---|---|
Azure CLI (az) |
查询Azure网络资源 |
| PowerShell 或 Bash | 运行验证脚本 |
nc (netcat) 或 Test-NetConnection |
测试 TCP 连接 |
| 网络参与者或读者 RBAC 角色 | 在相关虚拟网络上读取访问权限 |
公共连接验证
在公共模式下,DMS 使用迁移向导显示的静态 IP 通过公共 Internet 连接到源和目标。
验证源防火墙
验证源 MongoDB 服务器是否接受来自 DMS 静态 IP 的入站连接:
# PowerShell
Test-NetConnection -ComputerName <SOURCE_PUBLIC_IP_OR_HOSTNAME> -Port 27017
# Bash / Linux
nc -zv <SOURCE_PUBLIC_IP_OR_HOSTNAME> 27017
预期:TcpTestSucceeded : True 或 Connection succeeded。
验证目标防火墙
验证是否已将 DMS IP 添加到 Azure DocumentDB 防火墙:
az cosmosdb show \
--subscription "<SUBSCRIPTION>" \
-g "<RESOURCE_GROUP>" \
-n "<DOCUMENTDB_ACCOUNT>" \
--query "publicNetworkAccess"
测试目标连接:
Test-NetConnection -ComputerName <DOCUMENTDB_HOSTNAME> -Port 10260
验证 DNS 解析
Resolve-DnsName <SOURCE_HOSTNAME>
Resolve-DnsName <DOCUMENTDB_HOSTNAME>
验证这两个主机名是否解析为 公共 IP。 私有 IP 响应表明存在私有 DNS 覆盖。
公共连接清单
| # | 支票 | 命令 | 预期 |
|---|---|---|---|
| 1 | 源防火墙允许 DMS IP | Test-NetConnection <source> -Port 27017 |
成功 |
| 2 | 目标防火墙允许 DMS IP 地址 | 在门户或 CLI 中验证 | 允许列表中的 DMS IP 地址 |
| 3 | DNS 解析到公网 IP 地址 | Resolve-DnsName <hostname> |
返回的公网 IP |
| 4 | 源 MongoDB 正在监听 | mongosh <connection_string> |
已连接 |
| 5 | 目标 DocumentDB 可访问 | Test-NetConnection <target> -Port 10260 |
成功 |
专用连接验证
专用连接验证有四个阶段:验证基础结构、生成模拟环境、测试模拟的连接以及清理。
阶段 1:验证基础结构
Azure中的源
验证源终结点和目标专用终结点:
# Check source private endpoints
az network private-endpoint list \
--subscription "<SUBSCRIPTION>" -g "<SOURCE_RG>" \
--query "[].{Name:name,Subnet:subnet.id,Status:privateLinkServiceConnections[0].privateLinkServiceConnectionState.status}" \
-o table
# Check target private endpoints
az network private-endpoint list \
--subscription "<SUBSCRIPTION>" -g "<TARGET_RG>" \
--query "[].{Name:name,Subnet:subnet.id,Status:privateLinkServiceConnections[0].privateLinkServiceConnectionState.status}" \
-o table
预期: 两者的状态均 = Approved。
检查虚拟网络与 DMS CIDR 之间的 CIDR 重叠情况:
echo "=== Source VNet ==="
az network vnet show --subscription "<SUB>" -g "<SOURCE_RG>" -n "<SOURCE_VNET>" \
--query "addressSpace.addressPrefixes" -o tsv
echo "=== Target VNet ==="
az network vnet show --subscription "<SUB>" -g "<TARGET_RG>" -n "<TARGET_VNET>" \
--query "addressSpace.addressPrefixes" -o tsv
预期: 在向导中选择的 DMS CIDR 不得与任一虚拟网络重叠。
验证源子网和目标子网上的 NSG 是否允许来自 DMS 虚拟网络 CIDR 的流量:
az network nsg list \
--subscription "<SUB>" -g "<SOURCE_RG>" \
--query "[].{Name:name,Rules:securityRules[?direction=='Inbound'].{Rule:name,Priority:priority,Access:access,Source:sourceAddressPrefix,Port:destinationPortRange}}" \
-o json
验证: 没有 Deny 规则阻止 MongoDB 端口(默认 27017)或 DocumentDB 端口(默认为 10260)上的 DMS 虚拟网络 CIDR。
验证专用 DNS 区域配置:
# Check private DNS zones
az network private-dns zone list \
--subscription "<SUB>" \
--query "[?contains(name,'mongo') || contains(name,'cosmos') || contains(name,'documentdb')].{Zone:name,RecordSets:numberOfRecordSets}" \
-o table
# Verify DNS zone is linked to relevant VNets
az network private-dns link vnet list \
--subscription "<SUB>" -g "<DNS_ZONE_RG>" -z "<ZONE_NAME>" \
--query "[].{Link:name,VNet:virtualNetwork.id,AutoReg:registrationEnabled}" \
-o table
Azure 到 Azure 清单:
| # | 支票 | 预期 |
|---|---|---|
| 1 | 源专用终结点状态 | Approved |
| 2 | 目标专用终结点状态 | Approved |
| 3 | 虚拟网络与 DMS CIDR 之间没有 CIDR 重叠 | 不同的地址范围 |
| 4 | NSG 允许在所需端口上使用 DMS CIDR | 无阻止 Deny 规则 |
| 5 | 链接到你的虚拟网络的专用 DNS 区域 | 区域已关联,记录可解析 |
本地或其他云的源
验证 VPN/ExpressRoute 隧道:
# For VPN Gateway
az network vpn-connection list \
--subscription "<SUB>" -g "<GATEWAY_RG>" \
--query "[].{Name:name,Status:connectionStatus,IngressBytes:ingressBytesTransferred,EgressBytes:egressBytesTransferred}" \
-o table
预期:connectionStatus = Connected,字节数随时间增加。
# For ExpressRoute
az network express-route show \
--subscription "<SUB>" -g "<GATEWAY_RG>" -n "<ER_CIRCUIT_NAME>" \
--query "{Name:name,State:serviceProviderProvisioningState,PeeringState:peerings[0].state}" \
-o table
必须将 DMS 虚拟网络 CIDR 通告到远程网络,并验证 BGP 路由通告:
az network vnet-gateway list-advertised-routes \
--subscription "<SUB>" -g "<GATEWAY_RG>" -n "<VPN_GATEWAY_NAME>" \
--peer <REMOTE_BGP_PEER_IP> -o table
验证 DMS 虚拟网络 CIDR 是否显示在输出中。 如果未设置,请在网关虚拟网络对等互连中设置 allowGatewayTransit=true。
根据拓扑验证路由:
-
单个虚拟网络(无中心辐射): 在虚拟网络对等互连上验证
allowGatewayTransit=true。 - 中心直接: 与单个虚拟网络相同,但检查中心虚拟网络对等互连。
- TCP 代理:如果 DMS 只能与某个辐射网络建立对等互连,且无法直接与中心网络建立对等互连,请在与 DMS 对等互连的虚拟网络中部署 MongoDB 迁移代理 虚拟机。 代理通过现有的 VPN/ExpressRoute 路径将来自 DMS 的流量转发到源 MongoDB 服务器。 将 DMS 迁移作业配置为使用代理 VM 的私有 IP 和监听端口作为源端点。
# Check VNet peering configuration
az network vnet peering list \
--subscription "<SUB>" -g "<YOUR_VNET_RG>" --vnet-name "<YOUR_VNET>" \
--query "[].{Name:name,State:peeringState,AllowGatewayTransit:allowGatewayTransit}" \
-o table
重要
虚拟网络对等互连不具有传递性。 如果 DMS 与辐射型虚拟网络建立对等互连,则它无法自动连接到中心的 VPN 网关。 若要使 DMS 流量到达本地或其他云中的源,您需要具备以下两者之一:直接与中心虚拟网络对等互连(这样 DMS 就可以通过 useRemoteGateways 原生使用 VPN 网关),或者在与 DMS 对等互连的虚拟网络中部署一个 TCP 代理,通过您现有的网络路径将流量转发到源。
本地或其他云网络必须具有 DMS 虚拟网络 CIDR 的返回路由,验证远程返回路由。 对于 AWS:
aws ec2 describe-route-tables --region <REGION> \
--route-table-ids <ROUTE_TABLE_ID> \
--query "RouteTables[0].Routes[?GatewayId!=null && starts_with(GatewayId,'vgw')].{Destination:DestinationCidrBlock,Gateway:GatewayId,State:State}" \
--output table
对于本地路由器,请验证 DMS CIDR 是否显示在 BGP 路由表中。
远端还必须允许来自 DMS 虚拟网络 CIDR 的 入站 流量通过所需端口(默认情况下,MongoDB 为 27017)。
注释
DMS 为每个迁移作业创建一个具有动态 CIDR 的新虚拟网络。 配置远程防火墙规则时,请使用迁移向导中显示的特定 DMS CIDR。
本地/其他云清单:
| # | 支票 | 预期 |
|---|---|---|
| 1 | VPN/ExpressRoute 隧道状态 |
Connected、字节流动 |
| 2 | Azure通过 BGP 播发 DMS CIDR | 通告路由中的 DMS CIDR |
| 3 | 虚拟网络对等互连允许网关传输 | allowGatewayTransit=true |
| 4 | 远程端具有 DMS CIDR 的返回路由 | 路由表中存在的路由 |
| 5 | 远程防火墙/SG 允许 DMS CIDR | 所需端口上的入站规则 |
| 6 | 目标专用终结点状态 | Approved |
阶段 2:生成模拟环境
DMS 为完成或失败时清除的每个迁移作业创建临时虚拟网络。 若要从 DMS 网络所在位置测试连通性,请创建一个具有相同 CIDR 的用于模拟的虚拟网络,将其与您的各个网络建立对等互连,并部署一台测试 VM。
注释
从现有网关或辐射型虚拟网络中的 VM 进行测试,只能确认 VPN 可正常工作。 它并不证明源自 DMS CIDR 的流量可以正确路由。 模拟虚拟网络复制 DMS 的确切网络位置,因此来自它的连接测试代表实际的迁移流量。
创建测试虚拟网络
在 DMS 迁移向导中,使用您已提供(或计划提供)的相同 CIDR:
SUBSCRIPTION="<YOUR_SUBSCRIPTION>"
TEST_RG="dms-network-test-rg"
LOCATION="<SAME_REGION_AS_DMS>"
DMS_CIDR="<DMS_CIDR_FROM_WIZARD>"
TEST_VNET="dms-test-vnet"
TEST_SUBNET="default"
TEST_SUBNET_CIDR="<SUBNET_WITHIN_DMS_CIDR>"
az group create --subscription "$SUBSCRIPTION" -n "$TEST_RG" -l "$LOCATION"
az network vnet create --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "$TEST_VNET" \
--address-prefix "$DMS_CIDR" \
--subnet-name "$TEST_SUBNET" --subnet-prefix "$TEST_SUBNET_CIDR" \
-l "$LOCATION"
与测试虚拟网络建立对等互连
创建与 DMS 所执行操作相对应的对等互连。 选择符合您的拓扑的对等互连。
对于单个虚拟网络或中心直连(VPN/ExpressRoute 场景):
HUB_RG="<HUB_OR_SINGLE_VNET_RESOURCE_GROUP>"
HUB_VNET="<HUB_OR_SINGLE_VNET_NAME>"
TEST_VNET_ID=$(az network vnet show --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "$TEST_VNET" --query id -o tsv)
HUB_VNET_ID=$(az network vnet show --subscription "$SUBSCRIPTION" \
-g "$HUB_RG" -n "$HUB_VNET" --query id -o tsv)
# Gateway VNet → Test VNet
az network vnet peering create --subscription "$SUBSCRIPTION" \
-g "$HUB_RG" --vnet-name "$HUB_VNET" \
-n "hub-to-dms-test" --remote-vnet "$TEST_VNET_ID" \
--allow-vnet-access true --allow-forwarded-traffic true --allow-gateway-transit true
# Test VNet → Gateway VNet
az network vnet peering create --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" --vnet-name "$TEST_VNET" \
-n "dms-test-to-hub" --remote-vnet "$HUB_VNET_ID" \
--allow-vnet-access true --allow-forwarded-traffic true --use-remote-gateways true
对于Azure中的源(无需 VPN):
SOURCE_RG="<SOURCE_RESOURCE_GROUP>"
SOURCE_VNET="<SOURCE_VNET_NAME>"
SOURCE_VNET_ID=$(az network vnet show --subscription "$SUBSCRIPTION" \
-g "$SOURCE_RG" -n "$SOURCE_VNET" --query id -o tsv)
TEST_VNET_ID=$(az network vnet show --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "$TEST_VNET" --query id -o tsv)
az network vnet peering create --subscription "$SUBSCRIPTION" \
-g "$SOURCE_RG" --vnet-name "$SOURCE_VNET" \
-n "source-to-dms-test" --remote-vnet "$TEST_VNET_ID" \
--allow-vnet-access true --allow-forwarded-traffic true
az network vnet peering create --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" --vnet-name "$TEST_VNET" \
-n "dms-test-to-source" --remote-vnet "$SOURCE_VNET_ID" \
--allow-vnet-access true --allow-forwarded-traffic true
与目标虚拟网络建立对等互连:
TARGET_RG="<TARGET_RESOURCE_GROUP>"
TARGET_VNET="<TARGET_VNET_NAME>"
TARGET_VNET_ID=$(az network vnet show --subscription "$SUBSCRIPTION" \
-g "$TARGET_RG" -n "$TARGET_VNET" --query id -o tsv)
az network vnet peering create --subscription "$SUBSCRIPTION" \
-g "$TARGET_RG" --vnet-name "$TARGET_VNET" \
-n "target-to-dms-test" --remote-vnet "$TEST_VNET_ID" \
--allow-vnet-access true --allow-forwarded-traffic true
az network vnet peering create --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" --vnet-name "$TEST_VNET" \
-n "dms-test-to-target" --remote-vnet "$TARGET_VNET_ID" \
--allow-vnet-access true --allow-forwarded-traffic true
验证对等互连
az network vnet peering list --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" --vnet-name "$TEST_VNET" \
--query "[].{Name:name,State:peeringState,UseRemoteGateways:useRemoteGateways}" \
-o table
预期: 所有对等互连都显示 peeringState = Connected。
部署测试 VM
az vm create --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "dms-test-vm" \
--image Ubuntu2204 --size Standard_B2s \
--vnet-name "$TEST_VNET" --subnet "$TEST_SUBNET" \
--admin-username azureuser --generate-ssh-keys \
--public-ip-address "" --no-wait
VM 没有公共 IP。 通过 Azure Bastion、串行控制台或 az vm run-command invoke 访问它。
阶段 3:测试模拟 VM 的连接
在测试 VM 中使用 az vm run-command invoke 运行以下命令。
测试 DNS 解析
az vm run-command invoke --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "dms-test-vm" \
--command-id RunShellScript \
--scripts "nslookup <SOURCE_HOSTNAME> && echo '---' && nslookup <TARGET_DOCUMENTDB_HOSTNAME>"
预期结果: 两者都解析为 私有 IP。 如果任一 IP 解析为公共 IP,请将专用 DNS 区域链接到测试虚拟网络。
测试 TCP 连接
# Source MongoDB
az vm run-command invoke --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "dms-test-vm" \
--command-id RunShellScript \
--scripts "nc -zv -w 10 <SOURCE_PRIVATE_IP_OR_HOSTNAME> 27017 2>&1"
# Target DocumentDB
az vm run-command invoke --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "dms-test-vm" \
--command-id RunShellScript \
--scripts "nc -zv -w 10 <TARGET_DOCUMENTDB_HOSTNAME> 10260 2>&1"
预期:Connection … succeeded,两者均为。
使用 mongosh 进行测试
az vm run-command invoke --subscription "$SUBSCRIPTION" \
-g "$TEST_RG" -n "dms-test-vm" \
--command-id RunShellScript \
--scripts "
sudo apt-get update -qq && sudo apt-get install -y -qq gnupg curl
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
echo 'deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse' | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt-get update -qq && sudo apt-get install -y -qq mongosh
echo '=== Test Source ==='
mongosh 'mongodb://<USER>:<PASS>@<SOURCE>:27017/?tls=true&tlsAllowInvalidCertificates=true' --eval 'db.runCommand({ping:1})' 2>&1
echo '=== Test Target ==='
mongosh 'mongodb://<USER>:<PASS>@<TARGET>:10260/?tls=true&tlsAllowInvalidCertificates=true' --eval 'db.runCommand({ping:1})' 2>&1
"
预期:{ ok: 1 },两者均为。 如果 nc 成功但 mongosh 失败,则网络正常运行,问题可能与身份验证凭据或 TLS 配置相关。
解读结果
| Result | Meaning | Action |
|---|---|---|
对等互连状态 = Disconnected |
CIDR 重叠或虚拟网络配置问题 | 检查是否存在重叠的地址空间 |
nc 到源超时 |
流量被阻止或未路由 | 检查防火墙规则、返回路由、NSG |
nc 成功, mongosh TLS 错误 |
TLS/证书不匹配 | 检查 tls=true 和证书设置 |
nc 成功, mongosh 身份验证错误 |
凭据错误 | 验证用户名/密码和身份验证数据库 |
| DNS 解析为公共 IP | 专用 DNS 区域未链接 | 将 DNS 区域链接到测试虚拟网络 |
源 CIDR 的有效路由显示None |
无到源的路由 | 检查 VPN 网关/对等互连配置 |
小窍门
如果所有测试都通过,但迁移作业仍然失败,则问题可能在于 DMS 管理的组件,而不是基础结构。 请联系 Azure 技术支持,并提供这些测试结果,以便加快故障排除过程。
阶段 4:清理
重要
在重试迁移作业 之前 清理模拟虚拟网络和 VM。 如果它们仍然存在,则 DMS 由于 IP 地址冲突而无法创建自己的虚拟网络和 VM。
# Remove the test resource group (includes the test VNet and VM)
az group delete --subscription "$SUBSCRIPTION" -n "$TEST_RG" --yes
# Remove peerings on your existing VNets
az network vnet peering delete --subscription "$SUBSCRIPTION" \
-g "<HUB_RG>" --vnet-name "<HUB_VNET>" -n "hub-to-dms-test" 2>/dev/null
az network vnet peering delete --subscription "$SUBSCRIPTION" \
-g "<SOURCE_RG>" --vnet-name "<SOURCE_VNET>" -n "source-to-dms-test" 2>/dev/null
az network vnet peering delete --subscription "$SUBSCRIPTION" \
-g "<TARGET_RG>" --vnet-name "<TARGET_VNET>" -n "target-to-dms-test" 2>/dev/null
常见连接问题
| Issue | 症状 | 解决方案 |
|---|---|---|
| 未通过 BGP 播发 DMS CIDR | VPN 已启动,但迁移报告连接错误 | 在网关虚拟网络对等互连上启用 allowGatewayTransit=true |
| 远程防火墙阻止 DMS CIDR | 其他 Azure 虚拟网络可以访问源,但 DMS 连接超时 | 将向导中的 DMS CIDR 添加到远端防火墙规则中 |
| 缺少返回路由 | 流量离开Azure但永远不会返回;连接超时 | 在远程路由表上启用路由传播,或为 DMS CIDR 添加静态路由 |
| 专用终结点未获批准 | DNS 解析但连接被拒绝 | 在门户或 CLI 中批准专用终结点连接 |
| DNS 无法正确解析 | 主机名解析为公共 IP 而不是专用 IP | 将专用 DNS 区域链接到用于迁移的虚拟网络 |
| CIDR 重叠 | 虚拟网络对等互连失败或一直处于 Disconnected |
选择不与现有虚拟网络冲突的 DMS CIDR |
| 用于多个专用作业的单个虚拟网络 | 第二个任务失败或干扰第一个任务 | 为每个并发迁移作业使用不同的虚拟网络 |
在你的订阅中注册 Microsoft.DataMigration 资源提供程序
要在你的订阅中注册 Microsoft.DataMigration 资源提供程序,请按照以下步骤操作:
Azure 门户
转到Azure portal并导航到订阅。
在左侧菜单中,选择“设置”下的“资源提供程序”。
在顶部的搜索框中搜索 Microsoft.DataMigration 。
如果未注册,请选择它,然后选择“ 注册 ”按钮。
Azure CLI
打开本地终端。
运行以下命令,注册资源提供程序:
az provider register --namespace Microsoft.DataMigration
PowerShell
打开本地 PowerShell。
运行以下命令,注册资源提供程序:
Register-AzResourceProvider -ProviderNamespace "Microsoft.DataMigration"
FAQ
Azure DocumentDB 支持视图时,为什么选择集合屏幕步骤中缺少视图?
Azure DocumentDB 支持创建新视图。 但是,迁移扩展不支持迁移现有视图。
迁移完成后,始终可以重新创建视图。
从 MongoDB 迁移到 Azure DocumentDB 时,迁移过程会跳过哪些集合和数据库?
迁移过程将以下数据库和集合视为 MongoDB 的内部版本:
| 类别 | Description |
|---|---|
| 数据库 | 管理员、本地、系统配置 |
| 收藏 | 具有前缀的任何集合 system. |
迁移作业是否在本地计算机上运行?
VS Code 中的迁移向导需要从本地计算机到源环境和目标环境的网络连接。 向导使用此连接来枚举数据库和集合并提交迁移作业。 提交作业后,可以关闭 VS Code 或断开与源和目标环境的连接。
Azure 数据库迁移服务(DMS)完全执行数据迁移。 DMS 是一种Azure托管服务,用于管理所有数据移动。 DMS 不依赖于本地计算机或 VS Code 来执行作业,因此在提交作业后不需要本地连接。
是否可以在迁移期间重命名数据库和集合?
扩展不支持迁移期间的数据库和集合重命名。
如何配置源服务器防火墙以避免连接问题?
所需的网络配置取决于所选的连接模式:
- 公共模式: 必须允许向导在源防火墙和目标防火墙上显示的 IP 地址才能启用通信。
- Private mode: 必须启用 virtual network 集成,以便 DMS 服务器能够安全地与virtual network中的源终结点和目标终结点通信。
有关详细的验证步骤和故障排除,请参阅 排查连接问题。 另请参阅 VS Code 连接性。
可以在单个迁移中迁移多少个数据库和集合?
可以在单个迁移中包括无限制的集合。
我可以同时运行多少个迁移任务?
使用公共访问时,可以运行多个迁移作业。 但是,使用 专用访问时,单个虚拟网络一 次仅支持一个活动作业。 若要运行具有专用访问权限的多个作业,请对每个作业使用不同的 虚拟网络 。
扩展生成的日志类型是什么?
扩展记录默认日志目录中的错误、警告和其他诊断日志:
-
Windows -
C:\Users\<username>\.dmamongo\logs\ -
Linux -
~/.dmamongo/logs -
macOS -
/Users/<username>/.dmamongo/logs