本主题说明如何为 Internet 上外部可访问的 AlwaysOn 可用性组配置侦听器。 这可以通过将云服务的公共 虚拟 IP (VIP) 地址与侦听器相关联来实现。
重要
Azure 有两种不同的部署模型用于创建和使用资源: 资源管理器和经典部署模型。 本文介绍如何使用经典部署模型。 Microsoft 建议大多数新部署使用 Resource Manager 模型。
可用性组可以包含仅本地副本、仅限 Azure 的副本,也可以同时跨本地和 Azure 进行混合配置。 Azure 副本可以驻留在同一区域,也可以跨多个区域使用多个虚拟网络(VNet)。 以下步骤假定你已 配置可用性组 ,但尚未配置侦听器。
外部侦听器的准则和限制
使用云服务公共 VIP 地址进行部署时,请注意以下有关 Azure 中可用性组侦听器的准则:
- Windows Server 2008 R2、Windows Server 2012 和 Windows Server 2012 R2 支持可用性组侦听器。
- 客户端应用程序必须与包含可用性组 VM 的云服务位于不同的云服务上。 Azure 不支持在同一云服务中进行客户端与服务器的直接服务器返回操作。
- 默认情况下,本文中的步骤演示如何将一个侦听器配置为使用云服务虚拟 IP (VIP) 地址。 但是,可为云服务保留和创建多个 VIP 地址。 这使你可以使用本文中的步骤创建多个侦听器,每个侦听器都与不同的 VIP 相关联。 有关如何创建多个 VIP 地址的信息,请参阅 每个云服务的多个 VIP 地址。
- 如果要为混合环境创建侦听器,则除了使用 Azure 虚拟网络的站点到站点 VPN 之外,本地网络还必须连接到公共 Internet。 在 Azure 子网中时,可用性组侦听器只能由相应云服务的公共 IP 地址访问。
- 不支持在同一云服务中创建外部侦听器,在该云服务中,你也可以使用内部负载均衡器(ILB)创建内部侦听器。
确定侦听器的可访问性
请务必认识到,在 Azure 中配置可用性组侦听器有两种方法。 创建侦听器时所使用的 Azure 负载均衡器的类型有所不同。 下表描述了差异:
| 负载均衡器类型 | 执行 | 在以下情况下使用: |
|---|---|---|
| 外部 | 使用托管虚拟机(VM)的云服务 的公共虚拟 IP 地址 。 | 您需要从虚拟网络外部,尤其是从互联网访问侦听器。 |
| 内部 | 使用具有侦听器专用地址 的内部负载均衡器 。 | 只能从同一虚拟网络中访问侦听器。 在混合方案中,此访问包括站点间 VPN。 |
重要
对于使用云服务的公共 VIP(外部负载均衡器)的侦听器,只要客户端、侦听器和数据库位于同一 Azure 区域,就不会产生出口费用。 否则,通过侦听器返回的任何数据都被视为出口,并按正常数据传输速率收费。
只能在具有区域范围的虚拟网络上配置 ILB。 已为关联组配置的现有虚拟网络无法使用 ILB。 有关详细信息,请参阅 内部负载均衡器概述。
本文重点介绍如何创建使用 外部负载均衡的侦听器。 如果想要专用于虚拟网络的侦听器,请参阅本文的版本,其中提供了使用 ILB 设置侦听器的步骤
创建具有直接服务器返回功能的负载均衡 VM 端点
外部负载均衡使用托管虚拟机的云服务的公共虚拟 IP 地址。 因此,在这种情况下,无需创建或配置负载均衡器。
必须为托管 Azure 副本的每个 VM 创建负载均衡的终结点。 如果有多个区域中的副本,则该区域的每个副本必须位于同一 VNet 中的同一云服务中。 创建跨多个 Azure 区域的可用性组副本需要配置多个 VNet。 有关配置跨 VNet 连接的详细信息,请参阅 配置 VNet 到 VNet 连接。
在 Azure 门户中,导航到托管副本的每个 VM 并查看详细信息。
单击每个 VM 的 “终结点 ”选项卡。
请确认您要使用的侦听器终结点的名称和公共端口尚未被使用。 在下面的示例中,名称为“MyEndpoint”,端口为“1433”。
在本地客户端上,下载并安装 最新的 PowerShell 模块。
启动 Azure PowerShell。 新的 PowerShell 会话在加载 Azure 管理模块的情况下打开。
运行 Get-AzurePublishSettingsFile。 此 cmdlet 会引导你通过浏览器下载发布设置文件到本地目录。 系统可能会提示输入 Azure 订阅的登录凭据。
使用下载的发布设置文件的路径运行 Import-AzurePublishSettingsFile 命令:
Import-AzurePublishSettingsFile -PublishSettingsFile <PublishSettingsFilePath>导入发布设置文件后,可以在 PowerShell 会话中管理 Azure 订阅。
将下面的 PowerShell 脚本复制到文本编辑器中,并将变量值设置为适合你的环境(为某些参数提供了默认值)。 请注意,如果可用性组跨越 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 # Configure a load balanced endpoint for each node in $AGNodes, with direct server return enabled ForEach ($node in $AGNodes) { Get-AzureVM -ServiceName $ServiceName -Name $node | Add-AzureEndpoint -Name "ListenerEndpoint" -Protocol "TCP" -PublicPort 1433 -LocalPort 1433 -LBSetName "ListenerEndpointLB" -ProbePort 59999 -ProbeProtocol "TCP" -DirectServerReturn $true | Update-AzureVM }设置变量后,将脚本从文本编辑器复制到 Azure 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 中配置群集资源
对于外部负载均衡,必须获取包含副本的云服务的公共虚拟 IP 地址。 登录到 Azure 门户。 请访问包含可用性组虚拟机的云服务。 打开 仪表板 视图。
请注意 公共虚拟 IP (VIP) 地址下显示的地址。 如果解决方案跨越 VNet,请对包含托管副本的 VM 的每个云服务重复此步骤。
在某个 VM 上,将下面的 PowerShell 脚本复制到文本编辑器中,并将变量设置为前面记录的值。
# Define variables $ClusterNetworkName = "<ClusterNetworkName>" # the cluster network name (Use Get-ClusterNetwork on Windows Server 2012 of higher to find the name) $IPResourceName = "<IPResourceName>" # the IP Address resource name $CloudServiceIP = "<X.X.X.X>" # Public Virtual IP (VIP) address of your cloud service Import-Module FailoverClusters # If you are using Windows Server 2012 or higher, use the Get-Cluster Resource command. If you are using Windows Server 2008 R2, use the cluster res command. Both commands are commented out. Choose the one applicable to your environment and remove the # at the beginning of the line to convert the comment to an executable line of code. # Get-ClusterResource $IPResourceName | Set-ClusterParameter -Multiple @{"Address"="$CloudServiceIP";"ProbePort"="59999";"SubnetMask"="255.255.255.255";"Network"="$ClusterNetworkName";"OverrideAddressMatch"=1;"EnableDhcp"=0} # cluster res $IPResourceName /priv enabledhcp=0 overrideaddressmatch=1 address=$CloudServiceIP probeport=59999 subnetmask=255.255.255.255设置变量后,打开提升的 Windows PowerShell 窗口,然后从文本编辑器复制脚本并粘贴到 Azure PowerShell 会话中以运行它。 如果提示仍然显示 >>,请再次键入 Enter 以确保脚本开始运行。
在每个 VM 上重复此作。 此脚本使用云服务的 IP 地址配置 IP 地址资源,并设置探测端口等其他参数。 当 IP 地址资源上线后,它可以响应之前本教程中创建的负载均衡终结点探测端口上的轮询。
使侦听器联机
在故障转移群集管理器中,展开 “角色”,然后选中您的可用性组。
在“ 资源 ”选项卡上,右键单击侦听器名称,然后单击“ 属性”。
单击“ 依赖项 ”选项卡。如果列出了多个资源,请验证 IP 地址是否具有 OR(而不是 AND)依赖项。
单击“确定”。
右键单击侦听器名称,然后单击“ 联机引入”。
在侦听器处于联机状态后,在“ 资源 ”选项卡上,右键单击可用性组,然后单击“ 属性”。
创建对侦听器名称资源(而不是 IP 地址资源名称)的依赖项,然后单击“ 确定”。
启动 SQL Server Management Studio,并连接到主副本。
转到 AlwaysOn 高可用性>可用性组><AvailabilityGroupName>>可用性组侦听器。
您在故障转移群集管理器中创建的侦听器名称应显示出来。右键单击侦听器名称,然后单击“ 属性”。
在 “端口 ”框中,使用之前使用的$EndpointPort指定可用性组侦听器的端口号(在本教程中,1433 为默认值),然后单击“ 确定”。
后续项目
创建可用性组侦听器后,可能需要调整侦听器资源的 RegisterAllProvidersIP 和 HostRecordTTL 群集参数。 这些参数可以减少故障转移后的重新连接时间,这可能会阻止连接超时。 有关这些参数以及示例代码的详细信息,请参阅 创建或配置可用性组侦听器。
测试可用性组侦听器(在同一 VNet 中)
在此步骤中,你将使用在同一网络上运行的客户端应用程序来测试可用性组侦听器。
客户端连接具有以下要求:
- 与侦听器的客户端连接必须来自驻留在与托管 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 身份验证向数据库授予权限。
在测试侦听器时,请务必将可用性组切换至其他副本,以确保客户端能够在故障转移期间连接到侦听器。
测试可用性组侦听器(通过互联网)
若要从虚拟网络外部访问侦听器,必须使用外部/公共负载均衡(本主题中所述)而不是 ILB,后者只能在同一 VNet 中访问。 在连接字符串中,指定云服务名称。 例如,如果有名为 mycloudservice 的云服务,则 sqlcmd 语句如下所示:
sqlcmd -S "mycloudservice.cloudapp.net,<EndpointPort>" -d "<DatabaseName>" -U "<LoginId>" -P "<Password>" -Q "select @@servername, db_name()" -l 15
与前面的示例不同,必须使用 SQL 身份验证,因为调用方不能通过 Internet 使用 Windows 身份验证。 有关详细信息,请参阅 Azure VM 中的 AlwaysOn 可用性组:客户端连接方案。 使用 SQL 身份验证时,请确保在两个副本上创建相同的登录名。 有关使用可用性组对登录进行故障排除的详细信息,请参阅 如何映射登录名或使用包含的 SQL 数据库用户连接到其他副本并映射到可用性数据库。
如果 AlwaysOn 副本位于不同的子网中,客户端必须在连接字符串中指定 MultisubnetFailover=True 。 这会导致对不同子网中的副本进行并行连接尝试。 请注意,此方案包括跨区域 AlwaysOn 可用性组部署。
后续步骤
除了自动将客户端连接到主副本之外,侦听器还可用于将只读工作负荷重定向到辅助副本。 此用途可以提高整体解决方案的性能和可伸缩性。 有关详细信息,请参阅 将 ReadIntent 路由与 Azure AlwaysOn 可用性组侦听器配合使用。
注释
有关 Azure 侦听器的故障排除提示,请参阅 AlwaysOn 支持团队博客中的 Azure 中的可用性组侦听器疑难解答。
有关在 Azure 中使用 SQL Server 的详细信息,请参阅 Azure 虚拟机上的 SQL Server。