配置一个或多个 Always On 可用性组侦听程序

适用于:Azure VM 上的 SQL Server

提示

部署可用性组的方法有很多种。 通过在同一 Azure 虚拟网络中的多个子网中创建 SQL Server 虚拟机 (VM),可以简化部署,使 Always On 可用性组不再需要 Azure 负载均衡器或分布式网络名称 (DNN)。 如果已在单个子网中创建可用性组,可以将其迁移到多子网环境

本文档演示如何使用 PowerShell 执行以下任务之一:

  • 创建负载均衡器
  • 将 IP 地址添加到 SQL Server 可用性组的现有负载均衡器。

可用性组侦听器是客户端为了访问数据库而连接的虚拟网络名称。 在单个子网中的 Azure 虚拟机上,负载均衡器持有侦听器的 IP 地址。 负载均衡器将流量路由到侦听探测端口的 SQL Server 实例。 通常情况下,可用性组使用内部负载均衡器。 Azure 内部负载均衡器可以托管一个或多个 IP 地址。 每个 IP 地址使用特定的探测端口。

将多个 IP 地址分配到内部负载均衡器是 Azure 的一项新增功能,只能在资源管理器模型中使用。 若要完成此任务,需要在资源管理器模型中的 Azure 虚拟机上部署 SQL Server 可用性组。 这两个 SQL Server 虚拟机必须属于同一个可用性集。 可以手动配置 Always On 可用性组

若要完成本文中的步骤,需已配置可用性组。

相关主题包括:

注意

本文使用 Azure Az PowerShell 模块,这是与 Azure 交互时推荐使用的 PowerShell 模块。 若要开始使用 Az PowerShell 模块,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

启动 PowerShell 会话

运行 Connect-Az Account cmdlet,然后便会看到可输入凭据的登录屏幕。 使用与登录 Azure 门户相同的凭据。

Connect-AzAccount -Environment AzureChinaCloud

如果有多个订阅,请使用 Set-AzContext cmdlet 选择 PowerShell 会话应使用的订阅。 若要查看当前 PowerShell 会话正在使用哪个订阅,请运行 Get-AzContext。 若要查看所有订阅,请运行 Get-AzSubscription

Set-AzContext -SubscriptionId '4cac86b0-1e56-bbbb-aaaa-000000000000'

验证 PowerShell 版本

本文中的示例是使用 Azure PowerShell 模块版本 5.4.1 测试的。

请验证你的 PowerShell 模块是否为 5.4.1 或更高版本。

请参阅安装 Azure PowerShell 模块

配置 Windows 防火墙

配置 Windows 防火墙以允许 SQL Server 访问。 防火墙规则允许到端口(由 SQL Server 实例使用)的 TCP 连接,并且允许侦听器探测。 有关详细的说明,请参阅为数据库引擎访问配置 Windows 防火墙。 为 SQL Server 端口和探测端口创建入站规则。

如果要限制 Azure 网络安全组的访问权限,请确保“允许”规则包含后端 SQL Server VM IP 地址、可用性组侦听器的负载均衡器浮动 IP 地址、群集核心 IP 地址(如适用)。

确定所需的负载均衡器 SKU

Azure 负载均衡器以两种 SKU 提供:“基本”和“标准”。 建议使用标准负载均衡器,因为基本 SKU 计划于 2025 年 9 月 30 日停用。 可用性区域中的虚拟机需要使用标准负载均衡器。 标准负载均衡器要求所有 VM IP 地址都使用标准 IP 地址。

注意

如果将标准负载均衡器和 Azure 存储用于云见证,则需要配置服务终结点

本文中的示例指定了一个标准负载均衡器。 在示例中,脚本包括了 -sku Standard

$ILB= New-AzLoadBalancer -Location $Location -Name $ILBName -ResourceGroupName $ResourceGroupName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -LoadBalancingRule $ILBRule -Probe $SQLHealthProbe -sku Standard

若要创建基本负载均衡器,请从创建负载均衡器的行中删除 -sku Standard。 例如:

$ILB= New-AzLoadBalancer -Location $Location -Name $ILBName -ResourceGroupName $ResourceGroupName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -LoadBalancingRule $ILBRule -Probe $SQLHealthProbe

示例脚本:使用 PowerShell 创建内部负载均衡器

以下 PowerShell 脚本创建内部负载均衡器、配置负载均衡规则,并设置负载均衡器的 IP 地址。 要运行该脚本,请打开 Windows PowerShell ISE,然后将脚本粘贴到“脚本”窗格中。 使用 Connect-AzAccount -Environment AzureChinaCloud 登录到 PowerShell。 如果有多个 Azure 订阅,请使用 Select-AzSubscription 设置订阅。

# Connect-AzAccount -Environment AzureChinaCloud
# Select-AzSubscription -SubscriptionId <xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>

$ResourceGroupName = "<Resource Group Name>" # Resource group name
$VNetName = "<Virtual Network Name>"         # Virtual network name
$SubnetName = "<Subnet Name>"                # Subnet name
$ILBName = "<Load Balancer Name>"            # ILB name
$Location = "<Azure Region>"                 # Azure location
$VMNames = "<VM1>","<VM2>"                   # Virtual machine names

$ILBIP = "<n.n.n.n>"                         # IP address
[int]$ListenerPort = "<nnnn>"                # AG listener port
[int]$ProbePort = "<nnnn>"                   # Probe port

$LBProbeName ="ILBPROBE_$ListenerPort"       # The Load balancer Probe Object Name              
$LBConfigRuleName = "ILBCR_$ListenerPort"    # The Load Balancer Rule Object Name

$FrontEndConfigurationName = "FE_SQLAGILB_1" # Object name for the front-end configuration 
$BackEndConfigurationName ="BE_SQLAGILB_1"   # Object name for the back-end configuration

$VNet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName 

$Subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $VNet -Name $SubnetName 

$FEConfig = New-AzLoadBalancerFrontendIpConfig -Name $FrontEndConfigurationName -PrivateIpAddress $ILBIP -SubnetId $Subnet.id

$BEConfig = New-AzLoadBalancerBackendAddressPoolConfig -Name $BackEndConfigurationName 

$SQLHealthProbe = New-AzLoadBalancerProbeConfig -Name $LBProbeName -Protocol tcp -Port $ProbePort -IntervalInSeconds 15 -ProbeCount 2

$ILBRule = New-AzLoadBalancerRuleConfig -Name $LBConfigRuleName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -Probe $SQLHealthProbe -Protocol tcp -FrontendPort $ListenerPort -BackendPort $ListenerPort -LoadDistribution Default -EnableFloatingIP 

$ILB= New-AzLoadBalancer -Location $Location -Name $ILBName -ResourceGroupName $ResourceGroupName -FrontendIpConfiguration $FEConfig -BackendAddressPool $BEConfig -LoadBalancingRule $ILBRule -Probe $SQLHealthProbe 

$bepool = Get-AzLoadBalancerBackendAddressPoolConfig -Name $BackEndConfigurationName -LoadBalancer $ILB 

foreach($VMName in $VMNames)
    {
        $VM = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName 
        $NICName = ($vm.NetworkProfile.NetworkInterfaces.Id.split('/') | select -last 1)
        $NIC = Get-AzNetworkInterface -name $NICName -ResourceGroupName $ResourceGroupName
        $NIC.IpConfigurations[0].LoadBalancerBackendAddressPools = $BEPool
        Set-AzNetworkInterface -NetworkInterface $NIC
        start-AzVM -ResourceGroupName $ResourceGroupName -Name $VM.Name 
    }

示例脚本:使用 PowerShell 将 IP 地址添加到现有负载均衡器

要使用多个可用性组,请将附加的 IP 地址添加到负载均衡器。 每个 IP 地址都需要有自身的负载均衡规则、探测端口和前端端口。 仅将 VM 的主要 IP 地址添加到负载均衡器的后端池,因为VM 的次要 IP 地址不支持浮动 IP

前端端口是应用程序用来连接到 SQL Server 实例的端口。 不同可用性组的 IP 地址可以使用相同的前端端口。

注意

对于 SQL Server 可用性组,每个 IP 地址需要一个特定的探测端口。 例如,如果负载均衡器上有一个 IP 地址使用探测端口 59999,该负载均衡器上的其他任何 IP 地址就不能使用探测端口 59999。

以下脚本将新的 IP 地址添加到现有负载均衡器。 ILB 使用侦听程序端口作为负载均衡前端端口。 此端口可以是 SQL Server 正在侦听的端口。 对于 SQL Server 的默认实例,此端口为 1433。 可用性组的负载均衡规则需要浮动 IP(直接服务器返回),因此后端端口与前端端口相同。 请更新环境的变量。

# Connect-AzAccount -Environment AzureChinaCloud
# Select-AzSubscription -SubscriptionId <xxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>

$ResourceGroupName = "<ResourceGroup>"          # Resource group name
$VNetName = "<VirtualNetwork>"                  # Virtual network name
$SubnetName = "<Subnet>"                        # Subnet name
$ILBName = "<ILBName>"                          # ILB name                      

$ILBIP = "<n.n.n.n>"                            # IP address
[int]$ListenerPort = "<nnnn>"                   # AG listener port
[int]$ProbePort = "<nnnnn>"                     # Probe port 

$ILB = Get-AzLoadBalancer -Name $ILBName -ResourceGroupName $ResourceGroupName 

$count = $ILB.FrontendIpConfigurations.Count+1
$FrontEndConfigurationName ="FE_SQLAGILB_$count"  

$LBProbeName = "ILBPROBE_$count"
$LBConfigrulename = "ILBCR_$count"

$VNet = Get-AzVirtualNetwork -Name $VNetName -ResourceGroupName $ResourceGroupName 
$Subnet = Get-AzVirtualNetworkSubnetConfig -VirtualNetwork $VNet -Name $SubnetName

$ILB | Add-AzLoadBalancerFrontendIpConfig -Name $FrontEndConfigurationName -PrivateIpAddress $ILBIP -SubnetId $Subnet.Id 

$ILB | Add-AzLoadBalancerProbeConfig -Name $LBProbeName  -Protocol Tcp -Port $Probeport -ProbeCount 2 -IntervalInSeconds 15  | Set-AzLoadBalancer 

$ILB = Get-AzLoadBalancer -Name $ILBname -ResourceGroupName $ResourceGroupName

$FEConfig = get-AzLoadBalancerFrontendIpConfig -Name $FrontEndConfigurationName -LoadBalancer $ILB

$SQLHealthProbe  = Get-AzLoadBalancerProbeConfig -Name $LBProbeName -LoadBalancer $ILB

$BEConfig = Get-AzLoadBalancerBackendAddressPoolConfig -Name $ILB.BackendAddressPools[0].Name -LoadBalancer $ILB 

$ILB | Add-AzLoadBalancerRuleConfig -Name $LBConfigRuleName -FrontendIpConfiguration $FEConfig  -BackendAddressPool $BEConfig -Probe $SQLHealthProbe -Protocol tcp -FrontendPort  $ListenerPort -BackendPort $ListenerPort -LoadDistribution Default -EnableFloatingIP | Set-AzLoadBalancer   

配置侦听器

可用性组侦听器是 SQL Server 可用性组侦听的 IP 地址和网络名称。 创建可用性组侦听程序:

  1. 获取群集网络资源的名称:

    a. 使用 RDP 连接到托管主副本的 Azure 虚拟机。

    b. 打开“故障转移群集管理器”。

    c. 选择“网络”节点,并记下群集网络名称。 在 PowerShell 脚本的 $ClusterNetworkName 变量中使用此名称。 在下图中,群集网络名称为“群集网络 1”:

    屏幕截图显示故障转移群集管理器中的群集网络名称。

  2. 添加客户端接入点。 客户端接入点是应用程序用来连接到可用性组中的数据库的网络名称。

    a. 在“故障转移群集管理器”中,展开群集名称,然后选择“角色”。

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

    故障转移群集管理器的屏幕截图,其中显示了选择可用性组快捷菜单上的“客户端接入点”命令。

    c. 在“名称”框中,创建新侦听器的名称。 新侦听器的名称是应用程序用来连接 SQL Server 可用性组中数据库的网络名称。

    d. 要完成侦听器的创建,请选择“下一步”两次,然后选择“完成”。 此时不要使侦听器或资源联机。

  3. 使可用性组的群集角色脱机。 在“故障转移群集管理器”的“角色”下,右键单击角色,然后选择“停止角色”。

  4. 配置可用性组的 IP 资源:

    a. 选择“资源”选项卡,并展开创建的客户端接入点。 客户端接入点处于脱机状态。

    故障转移群集管理器的屏幕截图,其中显示了客户端接入点的脱机状态。

    b. 右键单击 IP 资源,然后选择“属性”。 记下 IP 地址的名称,将其用在 PowerShell 脚本的 $IPResourceName 变量中。

    c. 在“IP 地址”下,选择“静态 IP 地址”。 将 IP 地址设置为在 Azure 门户中设置负载均衡器地址时所用的同一地址。

    故障转移群集管理器的屏幕截图,其中显示了选择的 IP 地址。

  5. 使 SQL Server 可用性组依赖于客户端接入点:

    a. 在故障转移群集管理器中,选择“角色”,然后选择可用性组。

    b. 在“资源”选项卡的“其他资源”下,右键单击可用性组资源,然后选择“属性”。

    c. 在“依赖项”选项卡上,添加客户端接入点(侦听器)的名称。

    故障转移群集管理器的屏幕截图,其中显示了在“依赖项”选项卡上添加名称。

    d. 选择“确定”。

  6. 使客户端接入点依赖于 IP 地址:

    a. 在故障转移群集管理器中,选择“角色”,然后选择可用性组。

    b. 在“资源”选项卡上,右键单击“服务器名称”下的客户端接入点,然后选择“属性”。

    故障转移群集管理器的屏幕截图,其中显示了侦听器名称的“属性”菜单选项。

    c. 选择“依赖项”选项卡。验证 IP 地址是否为依赖项。 如果不是,则设置 IP 地址的依赖项。 如果列出了多个资源,请验证 IP 地址具有 OR 而不是 AND 依赖项。 然后选择“确定” 。

    显示可用性组 IP 资源的“依赖项”选项卡屏幕截图。

    提示

    可以验证是否正确配置了依赖项。 在故障转移群集管理器中,转到“角色”,右键单击可用性组,选择“更多操作”,然后选择“显示依赖项报告”。 正确配置依赖项后,可用性组将依赖于网络名称,网络名称将依赖于 IP 地址。

  7. 在 PowerShell 中设置群集参数:

    a. 将以下 PowerShell 脚本复制到某个 SQL Server 实例。 请更新环境的变量。

    • $ClusterNetworkName 通过选择“网络”,找到“故障转移群集管理器”中的名称,右键单击网络,并选择“属性”。 $ClusterNetworkName 位于“常规”选项卡上的“名称”下。

    • $IPResourceName 是故障转移群集管理器中 IP 地址资源的名称。 通过选择“角色”在“故障转移群集管理器”中找到此项,选择“SQL Server AG 或 FCI 名称”,选择“服务器名称”下的“资源”选项卡,右键单击 IP 地址资源并选择“属性”。 正确的值位于“常规”选项卡的“名称”下。

    • $ListenerILBIP 是在 Azure 负载均衡器上为可用性组侦听程序创建的 IP 地址。 在与 SQL Server AG/FCI 侦听器资源名称相同的属性页上,在故障转移群集管理器中找到 $ListenerILBIP。

    • $ListenerProbePort 是在 Azure 负载均衡器上为可用性组侦听程序配置的端口,例如 59999。 任何未使用的 TCP 端口都有效。

    $ClusterNetworkName = "<MyClusterNetworkName>" # The cluster network name. Use Get-ClusterNetwork on Windows Server 2012 or later to find the name.
    $IPResourceName = "<IPResourceName>" # The IP address resource name.
    $ListenerILBIP = "<n.n.n.n>" # The IP address of the internal load balancer. This is the static IP address for the load balancer that you configured in the Azure portal.
    [int]$ListenerProbePort = <nnnnn>
    
    Import-Module FailoverClusters
    
    Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$ListenerILBIP";"ProbePort"=$ListenerProbePort;"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
    

    b. 通过在某个群集节点上运行 PowerShell 脚本设置群集参数。

    注意

    如果 SQL Server 实例位于不同的区域,则需要运行 PowerShell 脚本两次。 第一次运行时,请从第一个区域中选择 $ListenerILBIP$ListenerProbePort 值。 第二次运行时,请从第二个区域中选择 $ListenerILBIP$ListenerProbePort 值。 每个区域的群集网络名称和群集 IP 资源名称也不同。

  8. 使可用性组的群集角色联机。 在“故障转移群集管理器”的“角色”下,右键单击角色,然后选择“启动角色”。

如有必要,请重复上述步骤,为 Windows Server 故障转移群集的 IP 地址设置群集参数:

  1. 获取 Windows Server 故障转移群集的 IP 地址名称。 在“故障转移群集管理器”中的“群集核心资源”下,找到“服务器名称”。

  2. 右键单击“IP 地址”,然后选择“属性”。

  3. 从“名称”中复制 IP 地址的名称。 它可能是群集 IP 地址。

  4. 在 PowerShell 中设置群集参数:

    a. 将以下 PowerShell 脚本复制到某个 SQL Server 实例。 请更新环境的变量。

    • $ClusterCoreIP 是在 Azure 负载均衡器上为 Windows Server 故障转移群集核心群集资源创建的 IP 地址。 它不同于可用性组侦听程序的 IP 地址。

    • $ClusterProbePort 是在 Azure 负载均衡器上为 Windows Server 故障转移群集的运行状况探测配置的端口。 它不同于可用性组侦听程序的探测。

    $ClusterNetworkName = "<MyClusterNetworkName>" # The cluster network name. Use Get-ClusterNetwork on Windows Server 2012 or later to find the name.
    $IPResourceName = "<ClusterIPResourceName>" # The IP address resource name.
    $ClusterCoreIP = "<n.n.n.n>" # The IP address of the cluster IP resource. This is the static IP address for the load balancer that you configured in the Azure portal.
    [int]$ClusterProbePort = <nnnnn> # The probe port from WSFCEndPointprobe in the Azure portal. This port must be different from the probe port for the availability group listener.
    
    Import-Module FailoverClusters
    
    Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$ClusterCoreIP";"ProbePort"=$ClusterProbePort;"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
    

    b. 通过在某个群集节点上运行 PowerShell 脚本设置群集参数。

如果将任何 SQL 资源配置为使用介于 49152 和 65536 之间的端口(TCP/IP 的默认动态端口范围),请为每个端口添加排除项。 此类资源可能包括:

  • SQL Server 数据库引擎
  • Always On 可用性组侦听程序
  • 故障转移群集实例的运行状况探测
  • 数据库镜像终结点
  • 群集核心 IP 资源

添加排除项将防止其他系统进程被动态地分配到相同端口。 对于这种场景,应在所有群集节点中配置以下排除项:

  • netsh int ipv4 add excludedportrange tcp startport=58888 numberofports=1 store=persistent
  • netsh int ipv4 add excludedportrange tcp startport=59999 numberofports=1 store=persistent

请务必在端口未使用时配置端口排除项。 否则命令将失败,并显示类似“进程无法访问该文件,因为另一个进程正在使用该文件”的消息。若要确认正确配置了排除项,请使用以下命令:netsh int ipv4 show excludedportrange tcp

警告

可用性组侦听程序的运行状况探测的端口必须不同于群集核心 IP 地址的运行状况探测的端口。 在这些示例中,侦听器端口为 59999,群集核心 IP 地址的运行状况探测端口为 58888。 这两个端口都要求“允许入站”防火墙规则。

在 SQL Server Management Studio 中设置侦听器端口

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

  2. 导航到“Always On 高可用性”>“可用性组”>“可用性组侦听器”。

  3. 现在应看到在故障转移群集管理器中创建的侦听器名称。 右键单击侦听程序名称,并选择“属性”。

  4. 在“端口”框中,通过使用先前使用的 $EndpointPort 为可用性组侦听程序指定端口号(默认值为 1433),并选择“确定”。

测试与侦听器的连接

若要测试连接,请执行以下操作:

  1. 使用远程桌面协议 (RDP) 连接到同一虚拟网络中不拥有副本的 SQL Server。 这可能是群集中的其他 SQL Server。

  2. 使用 sqlcmd 实用工具测试连接。 例如,以下脚本通过侦听器与 Windows 身份验证来与主副本建立 sqlcmd 连接:

    sqlcmd -S <listenerName> -E
    

    如果侦听器使用的端口不是默认端口 (1433),请在连接字符串中指定该端口。 例如,以下 sqlcmd 命令连接到位于端口 1435 的侦听器:

    sqlcmd -S <listenerName>,1435 -E
    

SQLCMD 连接自动连接到托管主副本的 SQL Server 实例。

注意

确保指定的端口已在两个 SQL Server 的防火墙上打开。 这两个服务器需要所用 TCP 端口的入站规则。 有关详细信息,请参阅添加或编辑防火墙规则

如果位于辅助副本 VM 上且无法连接到侦听器,则可能是探测端口未正确配置。

可以使用以下脚本来验证是否已为可用性组正确配置探测端口:

Clear-Host
Get-ClusterResource `
| Where-Object {$_.ResourceType.Name -like "IP Address"} `
| Get-ClusterParameter `
| Where-Object {($_.Name -like "Network") -or ($_.Name -like "Address") -or ($_.Name -like "ProbePort") -or ($_.Name -like "SubnetMask")}

指导原则和限制

请注意有关 Azure 中使用内部负载均衡器的可用性组侦听器的以下指导原则:

  • 使用内部负载均衡器只能从同一个虚拟网络中访问侦听器。

  • 如果要使用 Azure 网络安全组来限制访问权限,请确保允许规则包括:

    • 后端 SQL Server VM IP 地址
    • 负载均衡器浮动 AG 侦听程序的 IP 地址
    • 群集核心 IP 地址(如果适用)。
  • 将标准负载均衡器与 Azure 存储一起用作云见证时,请创建服务终结点。 有关详细信息,请参阅从虚拟网络授予访问权限

PowerShell cmdlet

使用以下 PowerShell cmdlet 为 Azure 虚拟机创建内部负载均衡器。

后续步骤

若要了解更多信息,请参阅以下文章: