使用 Azure DocumentDB 迁移扩展将 MongoDB 联机迁移到 Azure DocumentDB

本教程使用 Visual Studio Code 中的 Azure DocumentDB 迁移扩展来创建和管理从 MongoDB 的本地或云实例到 Azure DocumentDB 的迁移作业。 此扩展提供开发人员友好的界面来执行迁移,而不会中断服务。 该扩展无需额外的基础设施,并提供安全连接、零成本使用,以及对要迁移的数据库和集合进行精细控制。

本文的重点是使用扩展的集成工作流直接在 Visual Studio Code 中简化迁移步骤。 此方法非常适合需要简化的托管体验且复杂性最低且可靠性最高的方案。

先决条件

  • 一份 Azure 订阅。 如果没有 Azure 订阅,请创建一个试用帐户

在开始迁移之前,请准备 Azure DocumentDB 帐户和现有的 MongoDB 实例进行迁移。

MongoDB 实例(源)

  • 完成迁移前评估,以确定源实例和目标帐户之间是否存在不兼容和警告信息。
  • 添加一个具有 readAnyDatabaseclusterMonitor 权限的用户,除非已存在。 在扩展中创建迁移作业时,请使用此凭据。

Azure DocumentDB(target)

  • 收集 Azure DocumentDB 帐户凭据
  • 确保用户具有createCollectiondropCollectioncreateIndexinsertlistCollections权限。

所需的最低权限

使用以下最低角色以创建和运行迁移作业。

最低角色 Scope 适用于连接模式 Purpose
读取器 Subscription 公共和专用 列出订阅和资源组。 每个迁移作业都是必需的。
Azure 数据库迁移服务 参与者 资源组 公共和专用 创建Azure 数据库迁移服务(DMS)。 无需为每个迁移创建新的 DMS。 每个地区一个 DMS 就足够了。
参与者 Subscription 公共和专用 在订阅中注册 DMS。 这是一次性活动,可以委托给另一个用户。
用户访问管理员 虚拟网络 仅限专用 将网络参与者角色分配给 DMS 对象主体。 这是每个虚拟网络的一次性活动,可以委托给其他用户。
参与者 Azure DocumentDB 公共和专用 触发迁移作业。

有关提供程序注册详细信息,请参阅 在您的订阅中注册 Microsoft.DataMigration 资源提供程序

重要

迁移作业当前不支持Microsoft Entra ID身份验证。 使用原生 DocumentDB 身份验证。

执行迁移

有关迁移大小、速度和直接转换的规划指南,请参阅 迁移最佳做法

连接到源

  1. 打开 DocumentDB for VS Code 扩展。
  2. 添加要迁移到 “文档数据库连接 ”列表的 MongoDB 服务器。
  3. 选择“ 添加新连接”。
  4. 在导航栏上,选择Connection String
  5. 请粘贴您的连接字符串:mongodb://<YOUR_USERNAME>:<YOUR_PASSWORD>@localhost:10260/?tls=true&tlsAllowInvalidCertificates=true&authMechanism=SCRAM-SHA-256
  6. 从 DocumentDB 连接列表中,选择一个连接并展开以进行连接。

调用迁移扩展

可以从 DocumentDB 连接调用迁移扩展。

  1. 右键单击展开的(已连接)连接。

  2. 从上下文菜单中选择 “数据迁移 ”。

    在 Visual Studio Code 中的上下文菜单的屏幕截图。

  3. 在命令面板中,选择迁移到 Azure DocumentDB 命令面板中列出了 Visual Studio Code 内的迁移工具的截图。

  4. 然后选择 迁移到 Azure DocumentDB。 命令面板的截图,显示了 Visual Studio Code 中的迁移选项。

  5. 迁移向导将引导您完成此过程。

创建迁移作业

迁移作业用于将一组集合从源迁移到目标Azure DocumentDB。 创建迁移作业向导有六个步骤。

步骤 1:创建作业

在此步骤中,你将提供作业的基本详细信息。

  • 作业名称:提供用户友好名称来标识迁移作业。

  • 迁移模式:选择最适合用例的迁移模式。

    • 联机 迁移会复制收集的数据,并确保在此过程中更新内容也能被同步复制。 此方法的优势在于停机时间最小,确保持续运行以实现业务连续性。 如果正在进行的操作至关重要,需要优先考虑减少停机时间,则可以使用此选项。
    • 脱机 迁移在开始时捕获数据库的快照,提供了一种更简单、更可预测的方法。 如果可以接受使用数据库的静态副本,实时更新并不重要,则可以使用这种方法。

    重要

    若要确保从 MongoDB 成功联机迁移,必须在源 MongoDB 服务器上启用 ChangeStream。 如果没有 ChangeStream,则不会捕获初始迁移后对数据所做的任何修改。 因此,仅在源 MongoDB 服务器上启用了 ChangeStream 时,才使用联机迁移模式。

  • 连接:根据组织的安全授权和网络设置,从 “公共 ”和 “专用”中进行选择。

    • 当源服务器和目标服务器可以通过公有IP地址在互联网上访问时,使用公共。 它支持需要外部辅助功能的服务。
    • 当源服务器或目标服务器只能通过virtual network中的专用 IP 访问时,请使用 Private。 它通过消除对公共 Internet 的曝光来提高安全性。

选择“下一步”继续操作。

向导中“创建作业”步骤的屏幕截图。

步骤 2:选择目标

在此步骤中,选择现有 Azure DocumentDB 帐户并提供它的连接字符串。

  1. 从下拉列表中选择订阅、资源组和 Azure DocumentDB 帐户。

  2. 为 Azure DocumentDB 帐户提供连接字符串。

  3. 确保Azure DocumentDB 防火墙上允许屏幕上列出的 IP。

  4. 选择“下一步”继续操作。

向导中选择目标步骤的屏幕截图。

步骤 3:选择数据库迁移服务(DMS)

Azure 数据库迁移服务是一项服务,它使用云基础结构进行数据传输,而不是依赖本地资源,将数据迁移到Azure数据平台。 从下拉列表中选择现有的Azure 数据库迁移服务实例,或选择 Create DMS 创建新的迁移服务。

重要

请确保 Microsoft.DataMigration 资源提供程序已在您的订阅中注册。 每个订阅只需操作一次。

选择“下一步”继续操作。

向导中选择数据库迁移服务步骤的截图。

步骤 4:配置连接

此屏幕取决于在步骤 1 中选择的连接模式。 有关每个模式、网络体系结构和故障排除的详细信息,请参阅 迁移方案查看连接

公共连接

在公共连接中,迁移作业使用公共互联网连接到源和目标。 若要启用通信,需要更新源和目标防火墙。 若要启用来自 DMS 服务器的通信,请将屏幕中列出的 IP 地址添加到源防火墙和目标防火墙。 有关网络模型的详细信息,请参阅 公共连接。 有关防火墙配置指南,请参阅 configure Azure DocumentDB 群集防火墙。

向导中公共连接配置步骤的屏幕截图。

私有连接

在专用连接中,迁移作业在其虚拟网络内运行。 为了安全地与虚拟网络通信,我们使用虚拟网络对等互连。 有关网络模型的详细信息,请参阅 专用连接

  1. 该工具允许进行对等互联连接两个虚拟网络,一个用于源,另一个用于目标。 根据网络配置,从下拉列表中选择订阅、资源组和虚拟网络。

  2. “DMS 配置” 部分中,选择不与虚拟网络冲突的 CIDR 范围。

  3. 运行屏幕上提供的 PowerShell 脚本以启用虚拟网络集成。

  4. 选择“下一步”继续操作。

向导中专用连接配置步骤的屏幕截图。

步骤 5:选择集合

在此步骤中,选择要包含在迁移作业中的集合。 使用提供的搜索选项从集合列表中选择。 目标中已存在的集合会自动在“目标中的存在”列中标记为“是”。

小窍门

在创建迁移作业之前,请务必选择要包括在内的所有集合,因为一旦创建后,无法再添加集合列表。

选择“下一步”继续操作。

向导中“选择集合”步骤的屏幕截图。

步骤 6:确认并启动

选择 “开始迁移”之前,请查看迁移作业详细信息。 如果需要更新详细信息,请使用 “编辑详细信息 ”按钮。

成功创建迁移作业后,会自动重定向到“ 查看现有作业 ”页

小窍门

数据迁移任务在Azure 数据库迁移服务上运行。 因此,在数据迁移期间,无需连接到源环境和目标环境。 该状态在仪表板上频繁更新。

监视现有迁移作业

使用“ 查看现有作业 ”选项卡监视已初始化作业的迁移状态。 任务根据所选的 DMS 列出。 使用 “更改 DMS ”按钮更改所选内容。

状态会定期自动更新。 将所选集合快照复制到目标后,脱机作业会自动完成。 联机迁移需要手动进行切换。

可以 暂停 迁移作业,以在逻辑点暂时停止迁移作业。 当您准备好继续时,请选择 恢复,从作业停止处继续。

查看现有作业界面的截图。

若要查看集合状态,请从表中选择一行。

显示脱机迁移的集合状态的屏幕截图。

监视在线迁移

与离线迁移不同,在线迁移不会自动完成。 相反,它们会持续运行,直到被通过选择“直接转换”手动完成。

要完成在线迁移,请按给定顺序执行以下步骤:

  1. 一旦完成所有集合的初始数据加载,“切换”按钮将被启用。 在此阶段,作业处于复制阶段,持续将更新从源实例复制到目标实例,以使其保持最新状态并同步最新更改。

  2. 准备好执行迁移直接转换时,停止到源集合的所有传入事务。

  3. 上次更改以来的时间 显示上次更新与当前时间之间的时间差距。

  4. 监视表中的复制更改,并等待 复制更改应用 指标稳定。 稳定的 复制更改播放 指标指示源中的所有更新已成功复制到目标。

  5. 在所有集合的复制间隔最小且复制更改播放指标稳定时,请选择“直接转换”。

  6. 手动验证源集合和目标集合之间的行计数是否相同。

注释

在不验证源和目标已同步的情况下执行切换操作可能会导致数据丢失。

显示联机迁移的集合状态的屏幕截图

迁移方案

Azure DocumentDB 迁移扩展支持多个源环境,包括Azure、本地数据中心和其他云提供商中运行的 MongoDB 实例。 该扩展提供了灵活的连接选项,以适应不同的网络配置和安全要求。

支持的源环境

下表汇总了支持的迁移源:

源环境 Description
在 Azure 中 在Azure 虚拟机或其他Azure托管服务上运行的 MongoDB 实例
本地 在本地数据中心或专用基础结构中运行的 MongoDB 服务器
其他云提供商 托管在其他云平台上的 MongoDB 实例

公共连接

在公共连接模式下,Azure 数据库迁移服务(DMS)通过公共 Internet 连接到源服务器和目标服务器。 DMS 提供的静态 IP 地址可添加到源服务器和目标服务器上的防火墙允许列表。 DMS 将共享公共虚拟网络用于给定区域中的所有迁移。 虽然此虚拟网络在客户之间共享,但每个迁移作业在其自己的独立专用工作节点上运行,以确保作业级别的隔离。

在以下情况下使用公共连接:

  • 源服务器和目标服务器可通过公共 IP 地址访问。
  • 组织的安全策略允许通过公共 Internet 建立连接。
  • 您需要一种不需要虚拟网络配置的更简单设置。

展示公共连接网络架构的示意图。

若要启用公共连接,请:

  1. 在迁移向导中,选择 “公共 ”作为连接模式。

  2. 请注意向导中显示的静态 IP 地址。

  3. 将这些 IP 地址添加到源 MongoDB 服务器上的防火墙允许列表。

  4. 将这些 IP 地址添加到 Azure DocumentDB 防火墙

私有连接

在专用连接模式下,DMS 为每个迁移作业预配专用专用虚拟网络,并将其与源和目标虚拟网络对等互连。 这意味着每个作业都获取隔离的工作器节点和隔离网络,确保作业之间没有流量交叉,客户之间不存在共享网络路径。

该扩展最多支持两个虚拟网络:

  • 源虚拟网络:可访问源 MongoDB 服务器的虚拟网络。
  • Target 虚拟网络:可访问 Azure DocumentDB 群集的虚拟网络。

在以下情况下使用专用连接:

  • 源或目标服务器无法通过公共 Internet 访问。
  • 你的组织需要所有流量流经专用网络。
  • 你需要避免将互联网暴露给公众。

从其他云提供商或内部部署

使用首选 VPN 工具在Azure与另一个云或本地的源环境之间建立网络连接。 根据网络体系结构,支持以下拓扑。

单个虚拟网络

在此拓扑中,VPN/ExpressRoute 网关和源工作负荷位于同一虚拟网络中。 DMS 与此虚拟网络直接对等互连,并使用 useRemoteGateways 连接到本地环境或其他云中的源。

显示从本地环境或其他云进行专用连接的单个虚拟网络拓扑的示意图。

集线器直连

在此拓扑中,VPN/ExpressRoute 网关位于专用中心虚拟网络中。 DMS 直接与中心建立对等连接,因此它可以通过 useRemoteGateways 原生使用该网关。

显示从本地或其他云进行专用连接的中心直接拓扑的关系图。

采用 TCP 代理的中心辐射型拓扑

如果 DMS 只能与某个辐射虚拟网络建立对等互连,且无法直接与中心建立对等互连,请在与 DMS 建立了对等互连的辐射虚拟网络中部署一台 MongoDB 迁移代理 虚拟机。 代理通过中心的 VPN/ExpressRoute 网关将来自 DMS 的流量转发到源 MongoDB 服务器。

展示中心辐射拓扑的示意图,其中 TCP 代理用于实现从本地环境或其他云的私有连接。

注释

DMS 会创建一个临时虚拟网络,并与您的网络建立对等连接。 在企业中心辐射拓扑中,虚拟网络对等互连是非传递的,因此 DMS 无法自动通过分支虚拟网络访问中心 VPN 网关。 需要路由机制,例如直接中心对等互连或部署在 DMS 对等互连虚拟网络中的 TCP 代理。 有关验证步骤,请参阅 “查看连接”。

从 Azure 中的专用终结点

为源和目标虚拟网络设置专用终结点。

显示Azure内专用连接的网络体系结构的关系图。

若要启用专用连接,请:

  1. 在迁移向导中,选择“ 专用 ”作为连接模式。

  2. 为源环境选择订阅、资源组和虚拟网络。

  3. 为目标环境选择订阅、资源组和虚拟网络。

  4. “DMS 配置” 部分中,选择不与现有虚拟网络冲突的 CIDR 范围。

  5. 运行向导中提供的 PowerShell 脚本,以实现虚拟网络集成和对等互连。

重要

一个虚拟网络一次只能支持一个活动迁移作业,而连接模式是专用的。 若要运行多个并发作业,请对每个作业使用不同的虚拟网络。

查看连接性

在启动迁移作业或诊断失败作业之前,请验证是否已为 DMS 正确配置网络。 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 : TrueConnection 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 症状 解决方案
DMS CIDR 未通过 BGP 通告 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 门户

  1. 转到Azure portal并导航到订阅。

  2. 在左侧菜单中,选择“设置”下的“资源提供程序”。

  3. 在顶部的搜索框中搜索 Microsoft.DataMigration

  4. 如果未注册,请选择它,然后选择“ 注册 ”按钮。

Azure CLI

  1. 打开本地终端。

  2. 运行以下命令,注册资源提供程序:

    az provider register --namespace Microsoft.DataMigration
    

PowerShell

  1. 打开本地 PowerShell。

  2. 运行以下命令,注册资源提供程序:

    Register-AzResourceProvider -ProviderNamespace "Microsoft.DataMigration"
    

FAQ

Azure DocumentDB 支持视图时,为什么选择集合屏幕步骤中缺少视图?

Azure DocumentDB 支持创建新视图。 但是,迁移扩展不支持迁移现有视图。

迁移完成后,始终可以重新创建视图。

从 MongoDB 迁移到 Azure DocumentDB 时会跳过哪些集合和数据库?

对于 MongoDB,以下数据库和集合被视为内部数据库:

类别 Description
数据库 管理员、本地、系统配置
收藏 具有前缀的任何集合 system.

迁移作业是否在本地计算机上运行?

VS Code 中的迁移向导需要从本地计算机到源环境和目标环境的网络连接。 此连接用于枚举数据库和集合并提交迁移作业。 提交作业后,可以关闭 VS Code 或断开与源和目标环境的连接。

数据迁移完全由 Azure 数据库迁移服务 (DMS)(管理所有数据移动的Azure托管服务)执行。 DMS 不依赖于本地计算机或 VS Code 来执行作业,因此在提交作业后不需要本地连接。

是否可以在迁移期间重命名数据库和集合?

扩展不支持迁移期间的数据库和集合重命名。

如何配置源服务器防火墙以避免连接问题?

所需的网络配置取决于所选的连接模式:

  • 公共模式: 必须允许源防火墙和目标防火墙上向导中显示的 IP 地址才能启用通信。
  • Private mode: 必须启用 virtual network 集成,以便 DMS 服务器能够安全地与virtual network中的源终结点和目标终结点通信。

有关详细的验证步骤和故障排除,请参阅 “查看连接”。 另请参阅 VS Code 连接性

可以在单个迁移中迁移多少个数据库和集合?

可以在单个迁移中包含无限数量的集合。

我可以同时运行多少个迁移任务?

使用公共访问时,可以运行多个迁移作业。 但是,使用private access时,单个虚拟网络一次只能支持一个活动作业。 若要运行具有专用访问的多个作业,需要为每个作业使用不同的虚拟网络。

扩展生成的日志类型是什么?

扩展记录默认日志目录中的错误、警告和其他诊断日志:

  • Windows - C:\Users\<username>\.dmamongo\logs\
  • Linux - ~/.dmamongo/logs
  • macOS - /Users/<username>/.dmamongo/logs

后续步骤