提示
部署可用性组的方法有很多种。 通过在同一 Azure 虚拟网络中的多个子网中创建 SQL Server 虚拟机 (VM),可以简化部署,使 Always On 可用性组不再需要 Azure 负载均衡器或分布式网络名称 (DNN)。 如果已在单个子网中创建可用性组,可以将其迁移到多子网环境。
本文档演示如何使用 PowerShell 执行以下任务之一:
- 创建负载均衡器
- 将 IP 地址添加到 SQL Server 可用性组的现有负载均衡器。
可用性组侦听器是客户端为了访问数据库而连接的虚拟网络名称。 在单个子网中的 Azure 虚拟机上,负载均衡器保存侦听器的 IP 地址。 负载均衡器将流量路由到侦听探测端口的 SQL Server 实例。 通常情况下,可用性组使用内部负载均衡器。 Azure 内部负载均衡器可以托管一个或多个 IP 地址。 每个 IP 地址使用特定的探测端口。
若要将多个 IP 地址分配给内部负载均衡器,需要在 Resource Manager 模型中的 Azure 虚拟机上部署 SQL Server 可用性组。 这两个 SQL Server 虚拟机必须属于同一个可用性集。 可以手动配置 Always On 可用性组。
若要完成本文中的步骤,您的可用性组应已配置。
相关文章包括:
启动 PowerShell 会话
运行 Connect-Az Account cmdlet,您会看到一个登录屏幕,您可以在其中输入您的凭据。 使用与登录 Azure 门户相同的凭据。
Connect-AzAccount -Environment AzureChinaCloud
如果有多个订阅,请使用 Set-AzContext cmdlet 选择 PowerShell 会话应使用的订阅。 若要查看当前 PowerShell 会话正在使用哪个订阅,请运行 Get-AzContext。 若要查看所有订阅,请运行 Get-AzSubscription。
Set-AzContext -SubscriptionId 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e'
验证 PowerShell 版本
本文中的示例是使用 Azure PowerShell 模块版本 5.4.1 测试的。
请验证你的 PowerShell 模块是否为 5.4.1 或更高版本。
配置 Windows 防火墙
配置 Windows 防火墙以允许 SQL Server 访问。 防火墙规则允许 TCP 连接到 SQL Server 实例使用的端口和侦听器探测。 有关详细的说明,请参阅为数据库引擎访问配置 Windows 防火墙。 为 SQL Server 端口和探测端口创建入站规则。
如果您使用 Azure 网络安全组限制访问,请确保规则允许访问:
- 后端 SQL Server VM IP 地址
- 负载均衡器浮动 AG 侦听程序的 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。 如果有多个 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。
- 有关负载均衡器限制的信息,请参阅网络限制 - Azure Resource Manager 下面的每个负载均衡器的专用前端 IP。
- 有关可用性组限制的信息,请参阅限制(可用性组)。
以下脚本将新的 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 地址和网络名称。 创建可用性组侦听器:
-
a。 使用 Bastion 连接到托管主副本的 Azure 虚拟机。
b. 打开“故障转移群集管理器”。
选项c. 选择“网络”节点,并记下群集网络名称。 在 PowerShell 脚本的
$ClusterNetworkName
变量中使用此名称。 在下图中,群集网络名称为“群集网络 1”: 添加客户端接入点。 客户端接入点是应用程序用来连接到可用性组中的数据库的网络名称。
a。 在故障转移群集管理器中,展开群集名称,然后选择“角色”。
b. 在“角色”窗格中,右键单击可用性组名称,然后选择“添加资源”“客户端接入点”。
选项c. 在“名称”框中,创建新侦听器的名称。 新侦听器的名称是应用程序用来连接 SQL Server 可用性组中数据库的网络名称。
d。 要完成侦听器的创建,请选择“下一步”两次,然后选择“完成”。 不要在此时使侦听器或资源联机。
使可用性组群集角色脱机。 在“故障转移群集管理器”的“角色”下,右键单击角色,然后选择“停止角色”。
-
a。 选择“资源”选项卡,并展开创建的客户端接入点。 客户端接入点处于脱机状态。
b. 右键单击 IP 资源,然后选择“属性”。 记下 IP 地址的名称,将其用在 PowerShell 脚本的
$IPResourceName
变量中。选项c. 在“IP 地址”下,选择“静态 IP 地址”。 将 IP 地址设置为在 Azure 门户中设置负载均衡器地址时所用的同一地址。
-
a。 在故障转移群集管理器中,选择角色,然后选择您的可用性组。
b. 在“资源”选项卡的“其他资源”下,右键单击可用性组资源,然后选择“属性”。
选项c. 在“依赖项”选项卡上,添加客户端接入点(侦听器)的名称。
d。 选择“确定”。
-
a。 在故障转移群集管理器中,选择角色,然后选择您的可用性组。
b. 在“资源”选项卡上,右键单击“服务器名称”下的客户端接入点,然后选择“属性”。
选项c. 选择“依赖项”选项卡。验证 IP 地址是否为依赖项。 如果不是,则设置 IP 地址的依赖项。 如果列出了多个资源,请验证 IP 地址是否具有
OR
依赖项,而不是AND
依赖项。 然后选择“确定” 。提示
可以验证是否正确配置了依赖项。 在故障转移群集管理器中,转到角色,右键单击可用性组,选择更多操作,然后选择显示依赖项报告。 正确配置依赖项后,可用性组将依赖于网络名称,网络名称将依赖于 IP 地址。
-
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 资源名称也不同。 使可用性组群集角色脱机。 在故障转移群集管理器的角色下,右键单击角色,然后选择启动角色功能。
如有必要,请重复上述步骤,为 Windows Server 故障转移群集的 IP 地址设置群集参数:
获取 Windows Server 故障转移群集的 IP 地址名称。 在“故障转移群集管理器”中的“群集核心资源”下,找到“服务器名称”。
右键单击“IP 地址”,然后选择“属性”。
从“名称”中复制 IP 地址的名称。 它可能是群集 IP 地址。
-
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 资源配置为使用 49,152 到 65,536 之间的 端口(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
当端口未使用时,必须配置端口排除。 否则,命令将失败,并出现类似 The process cannot access the file because it is being used by another process
的消息。
若要确认已正确配置排除项,请使用以下命令: netsh int ipv4 show excludedportrange tcp
警告
可用性组侦听程序运行状况探测端口必须不同于群集核心 IP 地址运行状况探测端口。 在这些示例中,侦听器端口为 59999,群集核心 IP 地址的运行状况探测端口为 58888。 这两个端口都要求“允许入站”防火墙规则。
在 SQL Server Management Studio 中设置侦听器端口
启动 SQL Server Management Studio 并连接到主副本。
导航到“Always On 高可用性”“可用性组”>“可用性组侦听器”。>
现在应看到在故障转移群集管理器中创建的侦听器名称。 右键单击侦听程序名称,并选择“属性”。
在“端口”框中,通过使用先前使用的 $EndpointPort 为可用性组侦听程序指定端口号(默认值为 1433),并选择“确定”。
测试与侦听器的连接
若要测试连接,请执行以下操作:
使用 Bastion 连接到在同一虚拟网络中但不托管副本的 SQL Server。 这可能是群集中的其他 SQL Server。
使用 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 虚拟机创建内部负载均衡器。
- 使用 New-AzLoadBalancer 创建负载均衡器。
- 使用 New-AzLoadBalancerFrontendIpConfig 创建负载均衡器的前端 IP 配置。
- 使用 New-AzLoadBalancerRuleConfig 创建负载均衡器的规则配置。
- 使用 New-AzLoadBalancerBackendAddressPoolConfig 创建负载均衡器的后端地址池配置。
- 使用 New-AzLoadBalancerProbeConfig 创建负载均衡器的探测配置。
- 使用 Remove-AzLoadBalancer 从 Azure 资源组中删除负载均衡器。