为 Azure SQL 托管实例配置故障转移组

适用于:Azure SQL 托管实例

本文介绍如何使用 Azure 门户和 Azure PowerShell 为 Azure SQL 托管实例配置故障转移组

若要使端到端 PowerShell 脚本在故障转移组中创建这两个实例,请查阅将实例添加到故障转移组

先决条件

请注意以下先决条件:

  • 辅助托管实例必须为空,即不包含任何用户数据库。
  • SQL 托管实例的这两个实例需位于相同的服务层级,并且具有相同的存储大小。 强烈建议让两个实例具有相同的计算大小,以确保辅助实例可以持续处理从主实例复制的更改(包括峰值活动的周期),虽然这不是必需的。
  • 主 IP 实例虚拟网络的地址范围不得与辅助托管实例的虚拟网络的地址范围以及与主虚拟网络或辅助虚拟网络对等互连的任何其他虚拟网络对等互连重叠。
  • 创建辅助托管实例时,必须将主实例的 DNS 区域 ID 指定为参数 DnsZonePartner 的值。 如果你没有给 DnsZonePartner 指定一个值,则在每个虚拟网络中创建第一个实例时,将生成随机字符串形式的区域 ID,同一个 ID 将分配到同一子网中的所有其他实例。 分配后,无法修改 DNS 区域。
  • 托管实例的子网上的网络安全组 (NSG) 规则必须让端口 5022 (TCP) 和范围 11000-11999 (TCP) 的打开出站和入站路径,以便与托管其他托管实例的子网建立入站和出站连接。 这适用于子网、托管主实例和托管辅助实例。
  • 辅助托管实例的排序规则和时区必须与主托管实例的排序规则和时区匹配。
  • 出于性能原因,托管实例应部署在配对区域中。 与未配对区域相比,驻留在异地配对区域中的托管实例受益于明显更高的异地复制速度。

地址空间范围

若要检查主实例的地址空间,请转到主实例的虚拟网络资源,然后在“设置”下选择“地址空间”。 检查地址范围下的范围:

Azure 门户中主虚拟网络的地址空间的屏幕截图。

指定主实例的区域 ID

创建辅助实例时,必须将主实例的区域 ID 指定为 DnsZonePartner

如果要在 Azure 门户中创建辅助实例,请在其他设置选项卡上的异地复制,选择作为故障转移辅助实例,然后从下拉列表中选择主实例:

Azure 门户的屏幕截图,其中在“其他设置”页上将主托管实例指定为故障转移辅助实例。

启用实例之间的连接

必须建立托管主实例和辅助实例的虚拟网络子网之间的连接,确保异地复制通信流不间断。 有多种方法可以在不同 Azure 区域中的托管实例之间建立连接,其中包括:

建议使用全局虚拟网络对等互连,作为在故障转移组中的实例之间建立连接的最高性能和最可靠的方法。 全局虚拟网络对等互连使用 Microsoft 主干基础结构,在对等互连的虚拟网络之间提供低延迟、高带宽的专用连接。 在对等互连的虚拟网络之间通信不需公共 Internet、网关或额外加密。

重要

连接涉及其他网络设备的实例的替代方法可能会使连接故障排除或复制速度问题复杂化,可能需要网络管理员的积极参与,并可能显著延长解决时间。

无论连接机制如何,都必须满足异地复制通信流的要求:

  • 分配给托管实例子网的路由表和网络安全组不会在两个对等互连的虚拟网络之间共享。
  • 托管实例的子网上的网络安全组 (NSG) 规则允许:
    • 来自托管辅助实例的子网的端口 5022 和端口范围 11000-11999 上的入站流量。
    • 发往托管辅助实例的子网的端口 5022 和端口范围 11000-11999 上的出站流量。
  • 托管辅助实例的子网上的网络安全组 (NSG) 规则允许:
    • 来自托管主实例的子网的端口 5022 和端口范围 11000-11999 上的入站流量。
    • 发往托管主实例的子网的端口 5022 和端口范围 11000-11999 上的出站流量。
  • 托管主实例和辅助实例的 VNet 的 IP 地址范围不得重叠。
  • 托管主实例和辅助实例的 VNet 之间,或者它们通过本地虚拟网络对等互连或其他方式与之对等互连的其他 VNet 之间没有间接的 IP 地址范围重叠。

此外,如果使用其他机制(而不是使用建议的全局虚拟网络对等互连)来提供实例之间的连接,则需要确保:

  • 使用的任何网络设备(例如防火墙或网络虚拟设备 (NVA))都不会阻止前面提到的端口上的流量。
  • 路由已正确配置,并且避免了非对称路由。
  1. Azure 门户中转到主托管实例的“虚拟网络”资源。
  2. 选择“设置”下的“对等互连”,然后选择“+ 添加”。

Azure 门户中虚拟网络 A 的对等互连页的屏幕截图。

  1. 为以下设置输入或选择值:

    设置 说明
    此虚拟网络
    对等互连链接名称 对等互连的名称在虚拟网络中必须唯一。
    到远程虚拟网络的流量 若要通过默认的 VirtualNetwork 流来启用两个虚拟网络之间的通信,请选择“允许(默认)”。 启用虚拟网络之间的通信可允许资源连接到任意虚拟网络,并以相同的带宽和延迟互相进行通信,就如同它们是连接到同一个虚拟网络一样。 这两个虚拟网络中的资源之间的所有通信都在 Azure 专用网络上进行。
    从远程虚拟网络转接的流量 “允许(默认)”和“阻止”选项都将适用于本教程。 有关详细信息,请参阅创建对等互连
    虚拟网络网关或路由服务器 选择“无”。 有关其他可用选项的详细信息,请参阅创建对等互连
    远程虚拟网络
    对等互连链接名称 要在托管辅助实例的虚拟网络中使用的同一对等互连的名称。
    虚拟网络部署模型 选择“资源管理器”。
    我知道我的资源 ID 将此复选框保留为未选中状态。
    订阅 选择虚拟网络的 Azure 订阅,该虚拟网络托管的辅助实例是你要与之对等互连的。
    虚拟网络 选择虚拟网络,该虚拟网络托管的辅助实例是你要与之对等互连的。 如果列出了虚拟网络,但它显示为灰色,则可能是因为该虚拟网络的地址空间与此虚拟网络的地址空间重叠。 如果虚拟网络地址空间重叠,则它们无法进行对等互连。
    到远程虚拟网络的流量 选择“允许(默认)”
    从远程虚拟网络转接的流量 “允许(默认)”和“阻止”选项都将适用于本教程。 有关详细信息,请参阅创建对等互连
    虚拟网络网关或路由服务器 选择“无”。 有关其他可用选项的详细信息,请参阅创建对等互连
  2. 选择“添加”,以配置与所选虚拟网络的对等互连。 几秒钟后,选择“刷新”按钮,对等连接状态将从“正在更新”更改为“已连接”。

    Azure 门户中对等互连页上虚拟网络对等互连状态的屏幕截图。

创建故障转移组

使用 Azure 门户或 PowerShell 为托管实例创建故障转移组。

使用 Azure 门户为 SQL 托管实例创建故障转移组。

  1. Azure 门户的左侧菜单中选择“Azure SQL”。 如果 Azure SQL 不在列表中,请选择“所有服务”,然后在搜索框中键入“Azure SQL” 。 (可选)选择“Azure SQL”旁边的星号,将其作为收藏项添加到左侧导航栏。

  2. 选择要添加到故障转移组中的主托管实例。

  3. 在“设置”下,导航到“实例故障转移组”,然后选择“添加组”以打开实例故障转移组创建页。

    显示在 Azure 门户中添加故障转移组页的屏幕截图。

  4. 在“实例故障转移组”页上键入故障转移组的名称,然后从下拉列表中选择辅助托管实例。 选择“创建”以创建故障转移组。

    显示在 Azure 门户中创建故障转移组的屏幕截图。

  5. 故障转移组部署完成后,你将返回到故障转移组页。

测试故障转移

使用 Azure 门户或 PowerShell 测试故障转移组的故障转移。

使用 Azure 门户测试故障转移组的故障转移。

  1. Azure 门户中导航到你的辅助托管实例,然后在“设置”下选择“实例故障转移组”。

  2. 记下主角色和辅助角色中的托管实例。

  3. 选择“故障转移”,然后在有关正在断开 TDS 会话的警告中选择“是”。

    显示在 Azure 门户中转移故障转移组的屏幕截图。

  4. 记下主角色和辅助角色中的托管实例。 如果故障转移成功,这两个实例的角色应会交换。

    故障转移后已切换的实例角色的故障转移组状态的屏幕截图。

重要

如果角色未切换,请检查实例与相关 NSG 之间的连接以及防火墙规则。 仅当角色切换后才继续执行下一步。

  1. 转到新的辅助托管实例,再次选择“故障转移”,将主实例故障回复为主角色。

定位侦听器终结点

配置故障转移组后,将应用程序的连接字符串更新为侦听器终结点。 它会使你的应用程序保持连接到故障转移组侦听器,而不是连接到主数据库、弹性池或实例数据库。 这样,就不必在每次数据库实体发生故障转移时都手动更新连接字符串,并且流量将路由到当前充当主实体的任何实体。

侦听器终结点采用 fog-name.database.chinacloudapi.cn 格式,查看故障转移组时,它会显示在 Azure 门户中:

显示在 Azure 门户中查找故障转移组连接字符串的位置的屏幕截图。

在不同订阅的实例之间创建组

只要订阅与同一个 Microsoft Entra 租户关联,就可以在两个不同订阅中的 SQL 托管实例之间创建故障转移组。

  • 使用 PowerShell API 时,可以通过为辅助 SQL 托管实例指定 PartnerSubscriptionId 参数来执行此操作。
  • 使用 REST API 时,properties.managedInstancePairs 参数中包含的每个实例 ID 都可以具有自己的订阅 ID。
  • Azure 门户不支持创建跨不同订阅的故障转移组。

重要

Azure 门户不支持创建跨不同订阅的故障转移组。 对于跨不同订阅和/或资源组的故障转移组,不能通过 Azure 门户从主 SQL 托管实例手动启动故障转移。 改为从异地辅助实例启动它。

防止关键数据丢失

由于广域网的延迟时间较长,异地复制使用了异步复制机制。 如果主数据库发生故障,异步复制会导致数据丢失不可避免。 为了防止这些关键事务数据丢失,应用程序开发人员可以在提交事务后立即调用 sp_wait_for_database_copy_sync 存储过程。 调用 sp_wait_for_database_copy_sync 会阻止调用线程,直到最后提交的事务已传输并强制执行到辅助数据库的事务日志中。 但是,它不会等待传输的事务在辅助数据库上进行重播(恢复)。 sp_wait_for_database_copy_sync 范围限定为特定异地复制链接。 对主数据库具有连接权限的任何用户都可以调用此过程。

注意

sp_wait_for_database_copy_sync 防止特定事务异地故障转移后数据丢失,但不保证完全同步进行读取访问。 sp_wait_for_database_copy_sync 过程调用导致的延迟可能很明显,具体取决于调用时主数据库上尚未传输的事务日志大小。

更改次要区域

假设实例 A 是主实例,实例 B 是现有的辅助实例,实例 C 是第三个区域中的新辅助实例。 若要进行转换,请执行以下步骤:

  1. 在同一个 DNS 区域中创建大小与 A 相同的实例 C。
  2. 删除实例 A 与 B 之间的故障转移组。此时,尝试登录开始失败,因为故障转移组侦听器的 SQL 别名已删除,因此网关无法识别故障转移组名称。 辅助数据库从主实例断开连接,并成为读写数据库。
  3. 在实例 A 与 C 之间创建同名的故障转移组。按照配置故障转移组指南中的说明操作。 这是一个与数据大小相关的操作,实例 A 中的所有数据库都已设定种子并同步后,则此操作完成。
  4. 如果不需要实例 B,请将其删除,以免产生不必要的费用。

注意

完成步骤 2 到 3 后,如果实例 A 发生灾难性故障,其中的数据库将仍不受保护。

更改主要区域

假设实例 A 是主实例,实例 B 是现有的辅助实例,实例 C 是第三个区域中的新主实例。 若要进行转换,请执行以下步骤:

  1. 在同一个 DNS 区域中创建大小与 B 相同的实例 C。
  2. 连接到实例 B,并手动故障转移以将主实例切换到 B。实例 A 自动成为新的辅助实例。
  3. 删除实例 A 和 B 之间的故障转移组。此时,使用故障转移组终结点的登录尝试会失败。 A 上的辅助数据库与主数据库断开连接,并成为读写数据库。
  4. 在实例 B 与 C 之间创建同名的故障转移组。按照故障转移组指南中的说明操作。 这是一个与数据大小相关的操作,实例 A 中的所有数据库都已设定种子并同步后,则此操作完成。 此时,登录尝试将不再失败。
  5. 手动故障转移以将 C 实例切换到主角色。 实例 B 自动成为新的辅助实例。
  6. 如果不需要实例 A,请将其删除,以免产生不必要的费用。

注意

完成步骤 3 到 4 后,如果实例 A 发生灾难性故障,其中的数据库将仍不受保护。

重要

删除故障转移组时,也会删除侦听器终结点的 DNS 记录。 此时,其他人有可能创建同名的故障转移组。 由于故障转移组名称必须全局唯一,因此这将阻止你再次使用相同名称。 为最大程度地降低这种风险,请勿使用通用的故障转移组名称。

启用依赖于系统数据库中的对象的方案

系统数据库不会复制到故障转移组中的辅助实例。 若要启用依赖于系统数据库中的对象的方案,请确保在辅助实例上创建相同的对象并让辅助实例与主实例保持同步。

例如,如果你计划在辅助实例上使用相同的登录名,请确保使用相同的 SID 创建它们。

-- Code to create login on the secondary instance
CREATE LOGIN foo WITH PASSWORD = '<enterStrongPasswordHere>', SID = <login_sid>;

有关详细信息,请参阅复制登录名和代理作业

同步实例属性和保留策略实例

故障转移组中的实例保持独立的 Azure 资源,对主实例配置所做的任何更改都不会自动复制到辅助实例。 确保同时在主要和辅助实例上执行所有相关更改。 例如,如果在主实例上更改备份存储冗余或长期备份保留策略,请确保在辅助实例上也进行更改。

缩放实例

可以在同一 服务层级 内将主实例和辅助实例纵向扩展或缩减到不同的计算大小,或纵向扩展或缩减到不同的服务层级。 在同一服务层级内纵向扩展时,建议先纵向扩展异地辅助数据库,然后再纵向扩展主数据库。 在同一服务层级内纵向缩减时,按相反顺序操作:先纵向缩减主数据库,再纵向缩减辅助数据库。 将实例缩放到不同服务层级时,将强制执行此建议操作。

特别建议按此顺序进行,以避免出现以下问题:较低 SKU 的异地辅助数据库过载,并且必须在升级或降级过程中重新设定种子。

权限

通过 Azure 基于角色的访问控制 (Azure RBAC) 管理故障转移组的权限。

创建和管理故障转移组需要具有 Azure RBAC 写入访问权限。 SQL 托管实例参与者角色拥有管理故障转移组所需的全部权限。

下表列出了 Azure SQL 托管实例的特定权限范围:

操作 权限 范围
创建故障转移组 Azure RBAC 写入访问权限 主托管实例
辅助托管实例
更新故障转移组 Azure RBAC 写入访问权限 故障转移组
托管实例内的所有数据库
对故障转移组进行故障转移 Azure RBAC 写入访问权限 新的主托管实例上的故障转移组

限制

注意以下限制:

  • 无法在同一 Azure 区域中的两个实例之间创建故障转移组。
  • 无法重命名故障转移组。 需要删除该组,并使用不同的名称重新创建它。
  • 故障转移组正好包含两个托管实例。 不支持将其他实例添加到故障转移组。
  • 一个实例在任何时候只能参与一个故障转移组。
  • 无法在属于不同 Azure 租户的两个实例之间创建故障转移组。
  • 不能使用 Azure 门户或 Azure CLI 在属于不同 Azure 订阅的两个实例之间创建故障转移组。 请改用 Azure PowerShell 或 REST API 来创建此类故障转移组。 创建后,跨订阅故障转移组将在 Azure 门户中定期显示,所有后续操作(包括故障转移)都可以从 Azure 门户或 Azure CLI 启动。
  • 故障转移组中的数据库不支持数据库重命名。 需要临时删除故障转移组,才能重命名数据库。
  • 系统数据库不会复制到故障转移组中的辅助实例。 因此,依赖于系统数据库中对象(例如服务器登录和代理作业)的方案要求在辅助实例上手动创建对象,并在对主实例进行更改后手动保持同步。 唯一的例外是 SQL 托管实例的服务主密钥 (SMK),它在创建故障转移组期间自动复制到辅助实例。 但是,在主实例上进行的任何后续 SMK 更改都不会复制到辅助实例。 若要了解详细信息,请参阅如何启用依赖于系统数据库中的对象的方案
  • 如果任一实例位于实例池中,则无法在实例之间创建故障转移组。

以编程方式管理故障转移组

也可以使用 Azure PowerShell、Azure CLI 和 REST API 以编程方式管理故障转移组。 下表描述了可用的命令集。 故障转移组包含一组用于管理的 Azure Resource Manager API,其中包括 Azure SQL 数据库 REST APIAzure PowerShell cmdlet。 这些 API 需要使用资源组,并支持 Azure 基于角色的访问控制 (Azure RBAC)。 有关如何实现访问角色的详细信息,请参阅 Azure 基于角色的访问控制 (Azure RBAC)

Cmdlet 说明
New-AzSqlDatabaseInstanceFailoverGroup 此命令会创建故障转移组,并将其同时注册到主实例和辅助实例
Set-AzSqlDatabaseInstanceFailoverGroup 修改故障转移组的配置
Get-AzSqlDatabaseInstanceFailoverGroup 检索故障转移组的配置
Switch-AzSqlDatabaseInstanceFailoverGroup 触发故障转移组到辅助实例的故障转移
Remove-AzSqlDatabaseInstanceFailoverGroup 删除故障转移组

后续步骤

有关配置故障转移组的步骤,请参阅将托管实例添加到故障转移组指南。

有关该功能的概述,请参阅自动故障转移组。 若要了解如何节省许可成本,请参阅配置备用副本