为可用性组配置 DNN 侦听器

适用于:Azure VM 上的 SQL Server

提示

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

通过单个子网中 Azure VM 上的 SQL Server,分布式网络名称 (DNN) 将流量路由到相应的群集资源。 它提供了一种比虚拟网络名称 (VNN) 侦听器更简单的方法来连接到 Always On 可用性组 (AG),不需要使用 Azure 负载均衡器。

本文介绍了如何配置 DNN 侦听器来替换 VNN 侦听器,并使用 Azure VM 上的 SQL Server 将流量路由到你的可用性组,以实现高可用性和灾难恢复 (HADR)。

对于备用连接选项,可考虑改用 VNN 侦听器和 Azure 负载均衡器

概述

当与 SQL Server VM 上的 Always On 可用性组一起使用时,分布式网络名称 (DNN) 侦听器会取代传统的虚拟网络名称 (VNN) 可用性组侦听器。 这样就不需通过 Azure 负载均衡器来路由流量,简化了部署、维护并改进了故障转移。

请使用 DNN 侦听器来替代现有的 VNN 侦听器,或者将它与现有的 VNN 侦听器一起使用,使你的可用性组有两个不同的连接点 - 一个使用 VNN 侦听器名称(如果非默认,则还使用 VNN 侦听器端口),而另一个使用 DNN 侦听器名称和端口。

注意

使用 DNN 和使用 VNN 时的路由行为不同。 请不要使用端口 1433。 若要了解详细信息,请参阅本文后面的端口注意事项部分。

先决条件

在完成本文中的步骤之前,应已做好以下准备:

注意

如果相同群集上有多个 AG 或 FCI,并且使用 DNN 或 VNN 侦听器,则每个 AG 或 FCI 都需要自己的独立连接点。

创建脚本

使用 PowerShell 创建分布式网络名称 (DNN) 资源,并将其与你的可用性组相关联。

为此,请执行下列步骤:

  1. 打开文本编辑器,例如记事本。

  2. 复制并粘贴以下脚本:

    param (
       [Parameter(Mandatory=$true)][string]$Ag,
       [Parameter(Mandatory=$true)][string]$Dns,
       [Parameter(Mandatory=$true)][string]$Port
    )
    
    Write-Host "Add a DNN listener for availability group $Ag with DNS name $Dns and port $Port"
    
    $ErrorActionPreference = "Stop"
    
    # create the DNN resource with the port as the resource name
    Add-ClusterResource -Name $Port -ResourceType "Distributed Network Name" -Group $Ag 
    
    # set the DNS name of the DNN resource
    Get-ClusterResource -Name $Port | Set-ClusterParameter -Name DnsName -Value $Dns 
    
    # start the DNN resource
    Start-ClusterResource -Name $Port
    
    
    $Dep = Get-ClusterResourceDependency -Resource $Ag
    if ( $Dep.DependencyExpression -match '\s*\((.*)\)\s*' )
    {
    $DepStr = "$($Matches.1) or [$Port]"
    }
    else
    {
    $DepStr = "[$Port]"
    }
    
    Write-Host "$DepStr"
    
    # add the Dependency from availability group resource to the DNN resource
    Set-ClusterResourceDependency -Resource $Ag -Dependency "$DepStr"
    
    
    #bounce the AG resource
    Stop-ClusterResource -Name $Ag
    Start-ClusterResource -Name $Ag
    
  3. 将脚本另存为 .ps1 文件,例如 add_dnn_listener.ps1

执行脚本

若要创建 DNN 侦听器,请执行脚本并传入可用性组名称、侦听器名称和端口的参数。

例如,假设可用性组名称为 ag1,侦听器名称为 dnnlsnr,侦听器端口为 6789,请执行以下步骤:

  1. 打开一个命令行界面工具,例如命令提示符或 PowerShell。

  2. 导航到保存 .ps1 脚本的位置,例如 c:\Documents。

  3. 执行脚本:add_dnn_listener.ps1 <ag name> <listener-name> <listener port>。 例如:

    c:\Documents> .\add_dnn_listener.ps1 ag1 dnnlsnr 6789
    

验证侦听器

使用 SQL Server Management Studio 或 Transact-SQL 确认是否已成功创建 DNN 侦听器。

SQL Server Management Studio

SQL Server Management Studio (SSMS) 中展开“可用性组侦听器”来查看你的 DNN 侦听器:

在 SQL Server Management Studio (SSMS) 中的“可用性组侦听器”下查看 DNN 侦听器

Transact-SQL

使用 Transact-SQL 查看 DNN 侦听器的状态:

SELECT * FROM SYS.AVAILABILITY_GROUP_LISTENERS

is_distributed_network_name 的值为 1 表示侦听器是分布式网络名称 (DNN) 侦听器:

使用 sys.availability_group_listeners 来识别is_distributed_network_name 中的值为 1 的 DNN 侦听器

更新连接字符串

为需要连接到 DNN 侦听器的任何应用程序更新连接字符串。 DNN 侦听器的连接字符串必须提供 DNN 端口号,并在连接字符串中指定 MultiSubnetFailover=True。 如果 SQL 客户端不支持 MultiSubnetFailover=True 参数,则它与 DNN 侦听器不兼容。

下面是侦听器名称 DNN_Listener 和端口 6789 的连接字符串示例:

DataSource=DNN_Listener,6789;MultiSubnetFailover=True

测试故障转移

测试可用性组的故障转移以确保其正常运行。

若要测试故障转移,请执行以下步骤:

  1. 使用 SQL Server Management Studio (SSMS) 连接到 DNN 侦听器或副本之一。
  2. 在“对象资源管理器”中展开“Always On 可用性组”。
  3. 右键单击该可用性组,然后选择“故障转移”以打开“故障转移向导”。
  4. 按照提示选择故障转移目标,将可用性组故障转移到次要副本。
  5. 确认数据库在新的主要副本上处于已同步状态。
  6. (可选)故障回复到原始主要副本或另一个次要副本。

测试连接

通过以下步骤测试与 DNN 侦听器的连接:

  1. 打开 SQL Server Management Studio 。
  2. 连接到你的 DNN 侦听器。
  3. 打开一个新的查询窗口,通过运行 SELECT @@SERVERNAME 来检查你已连接到哪个副本。
  4. 将可用性组故障转移到另一个副本。
  5. 经过一段合理的时间后,运行 SELECT @@SERVERNAME 来确认你的可用性组现在承载在另一个副本上。

限制

  • 必须使用唯一端口配置 DNN 侦听器。 不能与任何副本上的任何其他连接共享此端口。
  • 连接到 DNN 侦听器的客户端必须支持连接字符串中的 MultiSubnetFailover=True 参数。
  • 将其他 SQL Server 功能与包含 DNN 的可用性组一起使用时,可能有额外的注意事项。 有关详细信息,请参阅包含 DNN 的 AG 的互操作性

端口注意事项

DNN 侦听器旨在侦听所有 IP 地址,但采用的是特定的唯一端口。 侦听器名称的 DNS 条目应该解析为可用性组中所有副本的地址。 这可通过创建脚本部分中提供的 PowerShell 脚本自动完成。 由于 DNN 侦听器接受所有 IP 地址上的连接,因此侦听器端口必须唯一,不能由可用性组中的任何其他副本使用。 由于 SQL Server 默认在端口 1433 上直接或通过 SQL 浏览器服务进行侦听,因此非常不鼓励使用 DNN 侦听器的端口 1433。

如果为 VNN 侦听器选择的侦听器端口介于 49,152 和 65,536 之间(TCP/IP 的默认动态端口范围),请为此添加排除项。 这样做可以防止其他系统被动态地分配到相同的端口。

可以使用以下命令添加端口排除:netsh int ipv4 add excludedportrange tcp startport=<Listener Port> numberofports=1 store=persistent

后续步骤

部署可用性组后,请考虑优化 Azure VM 上 SQL Server 的 HADR 设置

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