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

适用于: Azure VM 上的 SQL Server

提示

在同一 Azure 虚拟网络中的多个子网中创建 SQL Server VM,使得 Always On 可用性 (AG) 组不再需要 Azure 负载均衡器。

本文档演示如何使用 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 提供:“基本”和“标准”。 建议使用标准负载均衡器。 如果虚拟机在可用性集中,则可以使用基本负载均衡器。 如果虚拟机在可用性区域中,则需要使用标准负载均衡器。 标准负载均衡器要求所有 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. 在依赖关系选项卡上,添加客户端接入点(侦听器)资源的名称。

    IP 资源

    d. 单击 “确定”

  6. 使客户端接入点资源依赖于 IP 地址。

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

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

    IP 资源

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

    IP 资源

    提示

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

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

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

    • $ListenerILBIP 是在 Azure 负载均衡器上为可用性组侦听程序创建的 IP 地址。

    • $ListenerProbePort 是在 Azure 负载均衡器上为可用性组侦听程序配置的端口。

    $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
    $ListenerILBIP = "<n.n.n.n>" # the IP Address of the Internal Load Balancer (ILB). This is the static IP address for the load balancer 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. 使可用性组群集角色联机。 在“故障转移群集管理器” 的“角色” 下,右键单击角色,然后选择“启动角色” 。

如有必要,重复上述步骤以设置 WSFC 群集 IP 地址的群集参数。

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

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

  3. 记下 IP 地址的名称。 该项可能为 Cluster IP Address

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

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

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

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

    $ClusterNetworkName = "<MyClusterNetworkName>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher 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 you configured in the Azure portal.
    [int]$ClusterProbePort = <nnnnn> # The probe port from the WSFCEndPointprobe in the Azure portal. This port must be different from the probe port for the availability group listener probe port.
    
    Import-Module FailoverClusters
    
    Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$ClusterCoreIP";"ProbePort"=$ClusterProbePort;"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"EnableDhcp"=0}
    

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

警告

可用性组侦听程序运行状况探测端口必须不同于群集核心 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 端口的入站规则。 有关详细信息,请参阅 添加或编辑防火墙规则

指导原则和限制

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

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

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

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

PowerShell cmdlet

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

后续步骤

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