概述
重要
Azure 有两种不同的部署模型用于创建和使用资源: Azure 资源管理器和经典部署模型。 本文介绍经典部署模型的用法。 建议大多数新部署使用 Resource Manager 模型。
若要在 Resource Manager 模型中为 AlwaysOn 可用性组配置侦听器,请参阅 在 Azure 中为 AlwaysOn 可用性组配置负载均衡器。
可用性组可以包含仅本地副本或仅限 Azure 的副本,也可以同时跨本地和 Azure 进行混合配置。 Azure 副本可以驻留在同一区域或跨使用多个虚拟网络的多个区域。 本文中的过程假定你已经 配置了可用性组 ,但尚未配置侦听器。
内部监听器的准则和限制
在 Azure 中将内部负载均衡器(ILB)与可用性组侦听器结合使用时,需遵循以下准则:
- Windows Server 2008 R2、Windows Server 2012 和 Windows Server 2012 R2 支持可用性组侦听器。
- 每个云服务仅支持一个内部可用性组侦听器,因为侦听器配置为 ILB,并且每个云服务只有一个 ILB。 但是,可以创建多个外部侦听器。 有关详细信息,请参阅 在 Azure 中为 AlwaysOn 可用性组配置外部侦听器。
确定侦听器的可访问性
请务必认识到,在 Azure 中配置可用性组侦听器有两种方法。 创建侦听器时所使用的 Azure 负载均衡器的类型有所不同。 下表描述了差异:
| 负载均衡器类型 | 执行 | 在以下情况下使用: |
|---|---|---|
| 外部 | 使用托管虚拟机(VM)的云服务 的公共虚拟 IP 地址 。 | 您需要从虚拟网络外部,尤其是从互联网访问侦听器。 |
| 内部 | 使用具有侦听器专用地址 的内部负载均衡器 。 | 只能从同一虚拟网络中访问侦听器。 在混合方案中,此访问包括站点间 VPN。 |
重要
对于使用云服务的公共 VIP(外部负载均衡器)的侦听器,只要客户端、侦听器和数据库位于同一 Azure 区域,就不会产生出口费用。 否则,通过侦听器返回的任何数据都被视为出口,并按正常数据传输速率收费。
只能在具有区域范围的虚拟网络上配置 ILB。 已为关联组配置的现有虚拟网络无法使用 ILB。 有关详细信息,请参阅 内部负载均衡器概述。
本文侧重于介绍如何创建使用 ILB 的侦听器。 如果需要公共或外部侦听器,请参阅本文的版本,讨论如何设置 外部侦听器。
创建具有直接服务器返回功能的负载均衡 VM 端点
您首先通过在本部分的后面部分运行脚本来创建 ILB。
为每个托管 Azure 副本的 VM 创建负载均衡的终结点。 如果有多个区域的副本,则该区域的每个副本必须位于同一 Azure 虚拟网络中的同一云服务中。 创建跨多个 Azure 区域的可用性组副本需要配置多个虚拟网络。 有关配置跨虚拟网络连接的详细信息,请参阅 配置虚拟网络到虚拟网络连接。
在 Azure 门户中,转到托管副本的每个 VM 以查看详细信息。
单击每个 VM 的 “终结点 ”选项卡。
验证侦听器终结点中要使用的 名称 和 公共端口 是否尚未被占用。 在本部分中的示例中,名称为 MyEndpoint,端口为 1433。
在本地客户端上,下载并安装最新的 PowerShell 模块。
启动 Azure PowerShell。
此时会打开一个新的 PowerShell 会话,其中加载了 Azure 管理模块。运行
Get-AzurePublishSettingsFile。 此 cmdlet 会引导你通过浏览器下载发布设置文件到本地目录。 系统可能会提示输入 Azure 订阅的登录凭据。使用下载的发布设置文件路径运行以下
Import-AzurePublishSettingsFile命令:Import-AzurePublishSettingsFile -PublishSettingsFile <PublishSettingsFilePath>导入发布设置文件后,可以在 PowerShell 会话中管理 Azure 订阅。
对于 ILB,请分配静态 IP 地址。 运行以下命令来检查当前虚拟网络配置:
(Get-AzureVNetConfig).XMLConfiguration请注意包含托管副本的 VM 的子网的 子网 名称。 此名称在脚本中的 $SubnetName 参数中使用。
请注意 VirtualNetworkSite 的名称和包含托管副本的虚拟机的子网的起始地址前缀 AddressPrefix。 通过将两个值传递到
Test-AzureStaticVNetIP命令和检查 AvailableAddresses 来查找可用的 IP 地址。 例如,如果虚拟网络名为 MyVNet ,并且子网地址范围从 172.16.0.128 开始,以下命令将列出可用地址:(Test-AzureStaticVNetIP -VNetName "MyVNet"-IPAddress 172.16.0.128).AvailableAddresses选择其中一个可用地址,并在下一步脚本的 $ILBStaticIP 参数中使用它。
将以下 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 }设置变量后,将脚本从文本编辑器复制到 PowerShell 会话以运行它。 如果提示仍然显示 >>,请再次按 Enter 以确保脚本开始运行。
如有必要,请验证是否已安装KB2854082
接下来,如果群集上的任何服务器都运行 Windows Server 2008 R2 或 Windows Server 2012,则必须验证修补程序 KB2854082 是否已安装在群集中的每个本地服务器或 Azure VM 上。 群集中(但不在可用性组中)的任何服务器或 VM 也应安装此修补程序。
在每个群集节点的远程桌面会话中, 将KB2854082 下载到本地目录。 然后,按顺序在每个群集节点上安装修补程序。 如果群集服务当前在群集节点上运行,则服务器会在修补程序安装结束时重新启动。
警告
停止群集服务或重启服务器会影响群集和可用性组的仲裁运行状况,并可能导致群集脱机。 若要在安装期间保持群集的高可用性,请确保:
- 群集处于最佳仲裁健康状态。
- 在任何节点上安装修补程序之前,所有群集节点都处于联机状态。
- 在群集中的任何其他节点上安装修补程序之前,允许修补程序安装在一个节点上完成,包括完全重启服务器。
打开可用性组节点中的防火墙端口
在此步骤中,将创建防火墙规则以打开负载均衡终结点(如前面指定的 59999)的探测端口,并创建另一个规则以打开可用性组侦听器端口。 由于在包含可用性组副本的 VM 上创建了负载均衡的终结点,因此需要在相应的 VM 上打开探测端口和侦听器端口。
在托管副本的 VM 上, 启动具有高级安全性的 Windows 防火墙。
右键单击 “入站规则”,然后单击“ 新建规则”。
在 “规则类型 ”页上,选择“ 端口”,然后单击“ 下一步”。
在“协议和端口”页上,选择 TCP,在“特定本地端口”框中键入 59999,然后单击“下一步”。
在 “作 ”页上,保持“ 允许连接 ”处于选中状态,然后单击“ 下一步”。
在 “配置文件 ”页上,接受默认设置,然后单击“ 下一步”。
在“ 名称 ”页上的“ 名称 ”文本框中,指定规则名称,例如 Always On 侦听器探测端口,然后单击“ 完成”。
对可用性组侦听器端口重复上述步骤(如脚本的$EndpointPort参数中所述),然后指定适当的规则名称,例如 Always On 侦听器端口。
创建可用性组侦听器
使用两个步骤来创建可用性组侦听器。 首先,创建客户端接入点群集资源并配置依赖项。 其次,在 PowerShell 中配置群集资源。
创建客户端访问点并配置群集依赖项
在此步骤中,在故障转移群集管理器和 SQL Server Management Studio 中手动创建可用性组侦听器。
从托管主副本的节点上打开故障转移群集管理器。
选择 “网络 ”节点,然后记下群集网络名称。 此名称在 PowerShell 脚本中的$ClusterNetworkName变量中使用。
展开群集名称,然后单击“ 角色”。
在“ 角色 ”窗格中,右键单击可用性组名称,然后选择“ 添加资源>客户端接入点”。
在“ 名称 ”框中,为此新侦听器创建一个名称,单击“ 下一步 ”两次,然后单击“ 完成”。
此时不要将侦听器或资源联机。单击“ 资源 ”选项卡,然后展开刚刚创建的客户端接入点。 集群中每个集群网络的 IP 地址资源将被显示。 如果这是仅限 Azure 的解决方案,则仅显示一个 IP 地址资源。
执行以下操作之一:
若要配置混合解决方案,请执行以下作:
a。 右键单击对应于本地子网的 IP 地址资源,然后选择“ 属性”。 记下 IP 地址名称和网络名称。
b. 选择 “静态 IP 地址”,分配未使用的 IP 地址,然后单击“ 确定”。
若要配置仅限 Azure 的解决方案,请执行以下作:
a。 右键单击与 Azure 子网对应的 IP 地址资源,然后选择“ 属性”。
注释
如果侦听器后来由于 DHCP 选择的 IP 地址冲突而无法联机,则可以在此属性窗口中配置有效的静态 IP 地址。
b. 在同一 IP 地址 属性窗口中,更改 IP 地址名称。
此名称在 PowerShell 脚本的$IPResourceName变量中使用。 如果解决方案跨越多个 Azure 虚拟网络,请为每个 IP 资源重复此步骤。
在 PowerShell 中配置群集资源
对于 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在某个 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设置变量后,打开提升的 Windows PowerShell 窗口,将脚本从文本编辑器粘贴到 PowerShell 会话中以运行它。 如果提示仍然显示 >>,请再次按 Enter 以确保脚本开始运行。
为每个 VM 重复上述步骤。
此脚本使用云服务的 IP 地址配置 IP 地址资源,并设置其他参数,例如探测端口。 当 IP 地址资源联机时,它可以响应之前创建的负载均衡终结点对探测端口的轮询请求。
使侦听器联机
在故障转移群集管理器中,展开“角色”,然后突出显示您的可用性组。
在“ 资源 ”选项卡上,右键单击侦听器名称,然后单击“ 属性”。
单击“ 依赖项 ”选项卡。如果列出了多个资源,请验证 IP 地址是否具有 OR(而不是 AND)依赖项。
单击 “确定” 。
右键单击侦听器名称,然后单击“ 联机引入”。
在侦听器处于联机状态后,在“ 资源 ”选项卡上,右键单击可用性组,然后单击“ 属性”。
创建对侦听器名称资源(而不是 IP 地址资源名称)的依赖项,然后单击“ 确定”。
启动 SQL Server Management Studio,并连接到主副本。
转到 AlwaysOn 高可用性>可用性组><AvailabilityGroupName>>可用性组侦听器。
您在故障转移群集管理器中创建的侦听器名称应显示出来。右键单击侦听器名称,然后单击“ 属性”。
在 “端口 ”框中,使用之前使用的$EndpointPort指定可用性组侦听器的端口号(在本教程中,1433 为默认值),然后单击“ 确定”。
后续项目
创建可用性组侦听器后,可能需要调整侦听器资源的 RegisterAllProvidersIP 和 HostRecordTTL 群集参数。 这些参数可以减少故障转移后的重新连接时间,这可能会阻止连接超时。 有关这些参数以及示例代码的详细信息,请参阅 创建或配置可用性组侦听器。
测试可用性组侦听器(在同一虚拟网络中)
在此步骤中,你将使用在同一网络上运行的客户端应用程序来测试可用性组侦听器。
客户端连接具有以下要求:
- 与侦听器的客户端连接必须来自驻留在与托管 AlwaysOn 可用性副本不同的云服务中的计算机。
- 如果 AlwaysOn 副本位于不同的子网中,客户端必须在连接字符串中指定 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 身份验证向数据库授予权限。
在测试侦听器时,请务必将可用性组切换至其他副本,以确保客户端能够在故障转移期间连接到侦听器。
后续步骤
除了自动将客户端连接到主副本之外,侦听器还可用于将只读工作负荷重定向到辅助副本。 此用途可以提高整体解决方案的性能和可伸缩性。 有关详细信息,请参阅 将 ReadIntent 路由与 Azure AlwaysOn 可用性组侦听器配合使用。
注释
有关 Azure 侦听器的故障排除提示,请参阅 AlwaysOn 支持团队博客中的 Azure 中的可用性组侦听器疑难解答。
有关在 Azure 中使用 SQL Server 的详细信息,请参阅 Azure 虚拟机上的 SQL Server。