为 Azure SQL Server VM 上的可用性组配置 ILB 侦听器

概述

重要

Azure 具有用于创建和处理资源的两个不同部署模型:Azure 资源管理器部署模型和经典部署模型。 本文介绍经典部署模型的用法。 我们建议在大多数新部署中使用 Resource Manager 模型。

若要在 Resource Manager 模型中配置 Always On 可用性组的侦听器,请参阅在 Azure 中配置 Always On 可用性组的负载均衡器

可用性组可以仅包含本地副本或 Azure 副本,也可以跨越本地和 Azure 以实现混合配置。 Azure 副本可以位于同一区域,也可以跨越使用多个虚拟网络的多个区域。 本文中的过程假设已配置可用性组,但未配置侦听器。

内部侦听器的准则和限制

在 Azure 中使用内部负载均衡器 (ILB) 的可用性组侦听器遵循以下准则:

  • Windows Server 2008 R2、Windows Server 2012 和 Windows Server 2012 R2 支持可用性组侦听器。
  • 每个云服务只支持一个内部可用性组侦听器,因为该侦听器将配置给 ILB,而每个云服务只有一个 ILB。 但是,可以创建多个外部侦听器。 有关详细信息,请参阅在 Azure 中配置 Always On 可用性组的外部侦听器

确定侦听器的可访问性

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

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

重要

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

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

本文重点介绍如何创建使用 ILB 的侦听器。 如果需要一个公共或外部侦听器,请参阅本文的另一个版本,其中介绍了如何设置外部侦听器

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

首先通过运行本部分稍后的脚本创建 ILB。

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

  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. 对于 ILB,请分配一个静态 IP 地址。 运行以下命令检查当前虚拟网络配置:

    (Get-AzureVNetConfig).XMLConfiguration
    
  9. 记下包含副本所在 VM 的子网的 Subnet 名称。 脚本中的 $SubnetName 参数将要使用此名称。

  10. 记下包含副本所在 VM 的子网的 VirtualNetworkSite 名称和起始 AddressPrefix。 再通过将这两个值传递给 Test-AzureStaticVNetIP 命令并检查 AvailableAddresses 来查找可用的 IP 地址。 例如,如果虚拟网络名为 MyVNet,并包含从 172.16.0.128 开始的子网地址范围,则以下命令将列出可用地址:

    (Test-AzureStaticVNetIP -VNetName "MyVNet"-IPAddress 172.16.0.128).AvailableAddresses
    
  11. 选择一个可用地址,并将其用于下一步骤中的脚本的 $ILBStaticIP 参数。

  12. 将以下 PowerShell 脚本复制到文本编辑器,并根据环境设置变量值。 已经为某些参数提供了默认值。

    使用地缘组的现有部署不能添加 ILB。 有关 ILB 要求的详细信息,请参阅内部负载均衡器概述

    此外,如果可用性组跨多个 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
    $SubnetName = "<MySubnetName>" # subnet name that the replicas use in the virtual network
    $ILBStaticIP = "<MyILBStaticIPAddress>" # static IP address for the ILB in the subnet
    $ILBName = "AGListenerLB" # customize the ILB name or use this default value
    
    # Create the ILB
    Add-AzureInternalLoadBalancer -InternalLoadBalancerName $ILBName -SubnetName $SubnetName -ServiceName $ServiceName -StaticVNetIPAddress $ILBStaticIP
    
    # Configure a load-balanced endpoint for each node in $AGNodes by using ILB
    ForEach ($node in $AGNodes)
    {
        Get-AzureVM -ServiceName $ServiceName -Name $node | Add-AzureEndpoint -Name "ListenerEndpoint" -LBSetName "ListenerEndpointLB" -Protocol tcp -LocalPort 1433 -PublicPort 1433 -ProbePort 59999 -ProbeProtocol tcp -ProbeIntervalInSeconds 10 -InternalLoadBalancerName $ILBName -DirectServerReturn $true | Update-AzureVM
    }
    
  13. 设置变量后,将脚本从文本编辑器复制到 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. 对于 ILB,必须使用前面创建的 ILB 的 IP 地址。 在 PowerShell 中使用以下脚本获取此 IP 地址:

    # Define variables
    $ServiceName="<MyServiceName>" # the name of the cloud service that contains the AG nodes
    (Get-AzureInternalLoadBalancer -ServiceName $ServiceName).IPAddress
    
  2. 在某个 VM 上,将操作系统的 PowerShell 脚本复制到文本编辑器中,然后将变量设置为之前记下的值。

    对于 Windows Server 2012 或更高版本,请使用以下脚本:

    # Define variables
    $ClusterNetworkName = "<MyClusterNetworkName>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher to find the name)
    $IPResourceName = "<IPResourceName>" # the IP address resource name
    $ILBIP = "<X.X.X.X>" # the IP address of the ILB
    
    Import-Module FailoverClusters
    
    Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$ILBIP";"ProbePort"="59999";"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
    

    对于 Windows Server 2008 R2,请使用以下脚本:

    # Define variables
    $ClusterNetworkName = "<MyClusterNetworkName>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher to find the name)
    $IPResourceName = "<IPResourceName>" # the IP address resource name
    $ILBIP = "<X.X.X.X>" # the IP address of the ILB
    
    Import-Module FailoverClusters
    
    cluster res $IPResourceName /priv enabledhcp=0 address=$ILBIP probeport=59999  subnetmask=255.255.255.255
    
  3. 设置变量之后,打开提升的 Windows PowerShell 窗口,然后将文本编辑器中的脚本粘贴到 Azure PowerShell 会话中运行。 如果提示符仍然显示 >> ,请再次按 Enter,确保脚本开始运行。

  4. 针对每个 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 群集参数。 这些参数可以减少故障转移后的重新连接时间,这样可以防止连接超时。 有关这些参数以及示例代码的详细信息,请参阅创建或配置可用性组侦听器

测试可用性组侦听器(在同一虚拟网络中)

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

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

  • 对于与侦听器的客户端连接,其源计算机所驻留的云服务必须不同于托管 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 身份验证访问数据库的权限。

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

后续步骤

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

注意

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

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