为Azure SQL服务器 VM 上的可用性组配置外部侦听器

本主题说明如何为 AlwaysOn 可用性组配置一个可以通过 Internet 从外部访问的侦听器。 这通过将云服务的公共虚拟 IP (VIP) 地址与侦听器关联来实现。

重要

Azure 具有用于创建和处理资源的两个不同的部署模型:资源管理器部署模型和经典部署模型。 本文介绍如何使用经典部署模型。 Microsoft 建议大多数新部署使用资源管理器模型。

可用性组可以仅包含本地副本或 Azure 副本,也可以跨越本地和 Azure 以实现混合配置。 Azure 副本可以位于同一区域,也可以跨越使用多个虚拟网络 (VNet) 的多个区域。 下面的步骤假设已经配置可用性组,但未配置侦听器。

外部侦听器的准则和限制

使用云服务的公共 VIP 地址部署时,请注意有关 Azure 中可用性组侦听器的以下准则:

  • Windows Server 2008 R2、Windows Server 2012 和 Windows Server 2012 R2 支持可用性组侦听器。
  • 客户端应用程序必须位于与包含可用性组 VM 的云服务不同的云服务中。 Azure 不支持客户端和服务器位于同一个云服务中的直接服务器返回。
  • 默认情况下,本文中的步骤说明如何将一个侦听器配置为使用云服务虚拟 IP (VIP) 地址。 但是,可以为云服务保留和创建多个 VIP 地址。 这样就可以使用本文中的步骤创建多个侦听器,每个侦听器与不同的 VIP 相关联。 有关如何创建多个 VIP 地址的信息,请参阅每个云服务具有多个 VIP
  • 如果要为混合环境创建侦听器,则本地网络必须连接到公共 Internet,还通过 Azure 虚拟网络连接到站点到站点 VPN。 位于 Azure 子网中时,只能通过相应云服务的公共 IP 地址来访问该可用性组侦听器。
  • 不支持在其中也有使用内部负载均衡器 (ILB) 的内部侦听器的同一云服务中创建外部侦听器。

确定侦听器的可访问性

必须认识到有两种方法可以在 Azure 中配置可用性组侦听器。 这些方法在创建侦听器时使用的 Azure 负载均衡器的类型方面有所不同。 下表描述了差异:

负载均衡器类型 实现 何时使用:
外部 使用托管虚拟机 (VM) 的云服务的“公用虚拟 IP 地址”。 需要从虚拟网络外部访问侦听器,包括从 Internet 访问。
内部 使用“内部负载均衡器”,其地址专用于侦听器。 只能从同一个虚拟网络访问侦听器。 该访问包括混合方案中的站点到站点 VPN。

重要

对于使用云服务公共 VIP(外部负载均衡器)的侦听器,只要客户端、侦听器和数据库位于同一个 Azure 区域中,就不会产生传出费用。 否则,通过侦听器返回的任何数据会被视为传出数据,因此需要支付正常的数据传输费。

ILB 只能在具有区域范围的虚拟网络上配置。 已配置关联组的现有虚拟网络无法使用 ILB。 有关详细信息,请参阅内部负载均衡器概述

本文重点介绍如何创建使用外部负载均衡的侦听器。 如果要创建专用于虚拟网络的侦听器,请参阅本文的另一个版本,其中提供了设置使用 ILB 的侦听器的步骤

创建支持直接服务器返回的负载均衡 VM 终结点

外部负载均衡使用托管 VM 的云服务的公共虚拟 IP 地址。 因此,在这种情况下,不需要创建或配置负载均衡器。

必须为每个托管 Azure 副本的 VM 创建一个负载均衡的终结点。 如果在多个区域中拥有副本,该区域的每个副本必须位于同一个 VNet 的同一个云服务中。 跨越多个 Azure 区域创建可用性组副本需要配置多个 Vnet。 有关配置跨 VNet 连接的详细信息,请参阅 配置 VNet 到 VNet 连接

  1. 在 Azure 门户中,导航到托管副本的每个 VM 并查看详细信息。

  2. 对于每个 VM,单击“终结点”选项卡。

  3. 验证所要使用侦听器终结点的“名称”“公共端口”未在使用中。 在下面的示例中,名称为“MyEndpoint”,端口为“1433”。

  4. 在本地客户端上,下载并安装 最新的 PowerShell 模块

  5. 启动 Azure PowerShell。 将打开新 PowerShell 会话,其中加载了 Azure 管理模块。

  6. 运行 Get-AzurePublishSettingsFile。 此 cmdlet 你将定向到浏览器,以将发布设置文件下载到本地目录。 系统可能会提示输入 Azure 订阅的登录凭据。

  7. 结合下载的发布设置文件的路径运行 Import-AzurePublishSettingsFile 命令:

    Import-AzurePublishSettingsFile -PublishSettingsFile <PublishSettingsFilePath>
    

    导入发布设置文件后,便可以在 PowerShell 会话中管理 Azure 订阅。

  8. 将以下 PowerShell 脚本复制到文本编辑器中,并根据环境设置变量值(这里为某些参数提供了默认值)。 请注意,如果可用性组跨多个 Azure 区域,则必须在每个数据中心内为云服务以及位于其中的节点运行该脚本一次。

    # Define variables
    $ServiceName = "<MyCloudService>" # the name of the cloud service that contains the availability group nodes
    $AGNodes = "<VM1>","<VM2>","<VM3>" # all availability group nodes containing replicas in the same cloud service, separated by commas
    
    # Configure a load balanced endpoint for each node in $AGNodes, with direct server return enabled
    ForEach ($node in $AGNodes)
    {
        Get-AzureVM -ServiceName $ServiceName -Name $node | Add-AzureEndpoint -Name "ListenerEndpoint" -Protocol "TCP" -PublicPort 1433 -LocalPort 1433 -LBSetName "ListenerEndpointLB" -ProbePort 59999 -ProbeProtocol "TCP" -DirectServerReturn $true | Update-AzureVM
    }
    
  9. 设置变量后,将脚本从文本编辑器复制到 Azure PowerShell 会话中运行。 如果提示符仍然显示 >>,再次按 Enter,确保脚本开始运行。

如果需要,请验证是否已安装 KB2854082

接下来,如果群集中的任何服务器运行的是 Windows Server 2008 R2 或 Windows Server 2012,则必须验证群集中的每个本地服务器或 Azure VM 上是否安装了修补程序 KB2854082。 位于群集中但不在可用性组中的任何服务器或 VM 也应安装此修补程序。

在每个群集节点的远程桌面会话中,将 KB2854082 下载到本地目录。 然后,按顺序在每个群集节点上安装该修补程序。 如果群集节点上当前运行了群集服务,修补程序安装结束后会重新启动服务器。

警告

停止群集服务或重新启动服务器会影响群集和可用性组的仲裁运行状况,并可能导致群集进入脱机状态。 若要在安装过程中维持群集的高可用性,请确保:

  • 群集处于最佳仲裁运行状况。
  • 在任何节点上安装此修补程序之前,所有群集节点均处于联机状态。
  • 在集群中的任何其他节点上安装此修补程序之前,请允许在一个节点上完成此修补程序的整个安装过程,包括完全重启服务器。

在可用性组节点中打开防火墙端口

在此步骤中,创建一个防火墙规则以打开负载均衡终结点的探测端口(同样采用之前指定的 59999)和另一规则来打开可用性组侦听器端口。 由于在包含可用性组副本的 VM 上创建了负载均衡的终结点,需要打开相应 VM 上的探测端口和侦听器端口。

  1. 在托管副本的虚拟机上,启动“具有高级安全性的 Windows 防火墙”。

  2. 右键单击“入站规则”,然后单击“新建规则”

  3. 在“规则类型”页中,选择“端口”,并单击“下一步”。

  4. 在“协议和端口”页面中,选择“TCP”,并选择“特定本地端口”框中的类型“59999”,再单击“下一步”。

  5. 在“操作”页上,保持选中“允许连接”,并单击“下一步”。

  6. 在“配置文件”页上,接受默认设置,并单击“下一步”。

  7. 在“名称”页的“名称”文本框中指定规则名称,例如 Always On Listener Probe Port,并单击“完成”。

  8. 为可用性组侦听器端口重复上述步骤(按之前在脚本的 $EndpointPort 参数中指定的那样),并指定合适的规则名称,例如 Always On Listener Port

创建可用性组侦听器

通过两个步骤创建可用性组侦听器。 首先,创建客户端接入点群集资源并配置依赖关系。 其次,使用 PowerShell 配置群集资源。

创建客户端接入点和配置群集依赖关系

在此步骤中,在故障转移群集管理器和 SQL Server Management Studio 中手动创建可用性组侦听器。

  1. 从托管主副本的节点打开故障转移群集管理器。

  2. 选择“网络”节点,并记下群集网络名称。 此名称用于 PowerShell 脚本的 $ClusterNetworkName 变量中。

  3. 展开群集名称,并单击“角色”。

  4. 在“角色”窗格中,右键单击可用性组名称,并选择“添加资源”>“客户端接入点”。

    为可用性组添加客户端接入点

  5. 在“名称”框中,为此新的侦听器创建一个名称,单击“下一步”两次,并单击“完成”。
    不要在此时使侦听器或资源联机。

  6. 单击“资源”选项卡,并展开刚创建的客户端接入点。 会显示群集中每个群集网络的 IP 地址资源。 如果这是仅适用于 Azure 的解决方案,则只显示一个 IP 地址资源。

  7. 执行以下操作之一:

    • 若要配置混合解决方案,请执行以下操作:

      a. 右键单击与本地子网对应的 IP 地址资源,并选择“属性”。 记下 IP 地址名称和网络名称。

      b. 选择“静态 IP 地址”,分配未使用的 IP 地址,并单击“确定”。

    • 若要配置仅限 Azure 的解决方案,请执行以下操作:

      a. 右键单击与 Azure 子网对应的 IP 地址资源,并选择“属性”。

      注意

      如果随后侦听器因 DHCP 选择的 IP 地址冲突而无法联机,可以在此属性窗口中配置有效的静态 IP 地址。

      b. 在同一个“IP 地址”属性窗口中,更改“IP 地址名称”
      该名称用于 PowerShell 脚本的 $IPResourceName 变量中。 如果解决方案跨多个 Azure 虚拟网络,请对每个 IP 资源重复此步骤。

在 PowerShell 中配置群集资源

  1. 对于外部负载均衡,必须获取包含副本的云服务的公共虚拟 IP 地址。 登录到 Azure 门户。 导航到包含可用性组 VM 的云服务。 打开“仪表板”视图。

  2. 记下“公用虚拟 IP (VIP)地址”下显示的地址。 如果解决方案跨 VNet,请针对包含副本所在 VM 的每个云服务重复此步骤。

  3. 在某个 VM 上,将以下 PowerShell 脚本复制到文本编辑器中,将变量设置为之前记下的值。

    # Define variables
    $ClusterNetworkName = "<ClusterNetworkName>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher to find the name)
    $IPResourceName = "<IPResourceName>" # the IP Address resource name
    $CloudServiceIP = "<X.X.X.X>" # Public Virtual IP (VIP) address of your cloud service
    
    Import-Module FailoverClusters
    
    # If you are using Windows Server 2012 or higher, use the Get-Cluster Resource command. If you are using Windows Server 2008 R2, use the cluster res command. Both commands are commented out. Choose the one applicable to your environment and remove the # at the beginning of the line to convert the comment to an executable line of code.
    
    # Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$CloudServiceIP";"ProbePort"="59999";"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"OverrideAddressMatch"=1;"EnableDhcp"=0}
    # cluster res $IPResourceName /priv enabledhcp=0 overrideaddressmatch=1 address=$CloudServiceIP probeport=59999  subnetmask=255.255.255.255
    
  4. 设置变量之后,打开提升的 Windows PowerShell 窗口,然后从文本编辑器复制脚本,并将其粘贴到 Azure PowerShell 会话中运行。 如果提示符仍然显示 >>,再次按 Enter,确保脚本开始运行。

  5. 在每个 VM 上重复此过程。 此脚本将使用云服务的 IP 地址来配置 IP 地址资源,同时设置探测端口等其他参数。 在 IP 地址资源联机后,它可以响应我们在本教程前面部分创建的负载均衡终结点在探测端口上的轮询。

使侦听器联机

  1. 在故障转移群集管理器中,展开“角色”,并突出显示可用性组。

  2. 在“资源”选项卡上,右键单击侦听器名称,并单击“属性”。

  3. 单击“ 依赖项 ”选项卡。如果列出了多个资源,请验证 IP 地址是否具有 OR(而不是 AND)依赖项。

  4. 单击“确定”。

  5. 右键单击侦听器名称,并单击“联机”。

  6. 侦听器处于联机状态后,请在“资源”选项卡上右键单击可用性组,并单击“属性”。

    配置可用性组资源

  7. 在侦听器名称资源(而不是 IP 地址资源名称)上创建依赖项,并单击“确定”。

    在侦听器名称上添加依赖项

  8. 启动 SQL Server Management Studio,并连接到主副本。

  9. 转到 AlwaysOn 高可用性>><AvailabilityGroupName>>可用性组侦听器
    此时会显示在故障转移群集管理器中创建的侦听器名称。

  10. 右键单击侦听器名称,并单击“属性”。

  11. 在“端口”框中,通过使用先前使用过的 $EndpointPort 为可用性组侦听器指定端口号(在本教程中,默认值是 1433),并单击“确定”。

后续操作项

创建可用性组侦听器之后,可能需要调整侦听器资源的 RegisterAllProvidersIP 和 HostRecordTTL 群集参数。 这些参数可以减少故障转移后的重新连接时间,这样可以防止连接超时。 有关这些参数以及示例代码的详细信息,请参阅创建或配置可用性组侦听器

测试可用性组侦听器(在同一 VNet 中)

在此步骤中,使用同一网络上运行的客户端应用程序测试可用性组侦听器。

客户端连接具有以下要求:

  • 对于与侦听器的客户端连接,其源计算机所驻留的云服务必须不同于托管 AlwaysOn 可用性副本的云服务。
  • 如果 Always On 副本位于不同子网中,客户端必须在连接字符串中指定 MultisubnetFailover=True。 此条件会导致尝试并行连接到各个子网中的副本。 此方案包括跨区域 AlwaysOn 可用性组部署。

例如,从同一个 Azure 虚拟网络的一个虚拟机(而不是托管副本的虚拟机)连接到侦听器。 完成此测试一个简单的方法是尝试将 SQL Server Management Studio 连接到可用性组侦听器。 另一个简单的方法是运行 SQLCMD.exe,如下所示:

sqlcmd -S "<ListenerName>,<EndpointPort>" -d "<DatabaseName>" -Q "select @@servername, db_name()" -l 15

注意

如果 EndpointPort 值为 1433,则不需在调用时指定它。 前面的调用还假定客户端计算机加入了同一个域,并且调用方已被授予使用 Windows 身份验证访问数据库的权限。

在测试侦听器时,请务必对可用性组进行故障转移,以确保客户端可以在故障转移之间连接到侦听器。

测试可用性组侦听器(通过 Internet)

若要从虚拟网络外部访问侦听器,必须使用外部/公共负载均衡(如本主题中所述)而不是 ILB,因为 ILB 只能在同一 VNet 中进行访问。 在连接字符串中指定云服务名称。 例如,如果云服务名为 mycloudservice,则 sqlcmd 语句将如下所示:

sqlcmd -S "mycloudservice.cloudapp.net,<EndpointPort>" -d "<DatabaseName>" -U "<LoginId>" -P "<Password>"  -Q "select @@servername, db_name()" -l 15

与前面的示例不同,现在必须使用 SQL 身份验证,因为调用方无法通过 Internet 使用 Windows 身份验证。 有关详细信息,请参阅 Azure VM 中的 Always On 可用性组:客户端连接方案。 使用 SQL 身份验证时,请确保在两个副本上创建相同的登录名。 有关排查可用性组登录问题的详细信息,请参阅如何映射登录名或使用包含的 SQL 数据库用户连接到其他副本并映射到可用性数据库

如果 Always On 副本位于不同子网中,客户端必须在连接字符串中指定 MultisubnetFailover=True。 这会导致尝试并行连接到不同子网中的副本。 请注意,这种情况下包括跨区域 AlwaysOn 可用性组部署。

后续步骤

除了自动将客户端连接到主副本外,侦听器还可用于将只读工作负荷重定向到辅助副本。 这样使用可以提高整个解决方案的性能和可伸缩性。 有关详细信息,请参阅 Use ReadIntent Routing with Azure Always On availability group listener(将 ReadIntent 路由与 Azure AlwaysOn 可用性组侦听器配合使用)。

注意

有关 Azure 侦听器的故障排除提示,请参阅 AlwaysOn 支持团队博客中的 Azure 可用性组侦听器疑难解答

有关在 Azure 中使用 SQL Server 的详细信息,请参阅 Azure 虚拟机上的 SQL Server