在多子网环境中连接到 Always On 侦听器时发生超时

本文可帮助你解决在多子网环境中连接到 SQL Server Always On 可用性组侦听器时发生的问题。

原始产品版本: SQL Server 2012 及更高版本
原始 KB 数: 2792139

现象

在 Microsoft SQL Server 中为 Always On 可用性组配置可用性组侦听器后,您可能无法 ping 侦听器或从应用程序连接到它。

例如,当您尝试使用 SQLCMD 连接 SQL Server 的侦听器时,连接超时。此外,您会收到一条与以下内容类似的错误消息:

Sqlcmd:错误:Microsoft SQL Native Client:登录超时已过期。

注意

这些症状是间歇性的,或者与可用性组资源的故障转移有关。

以下屏幕截图显示了尝试 ping 侦听器的可用性 aglisten时发生的情况示例。 屏幕截图还显示了在包含多子网故障转移参数SQLCMD时使用-M命令成功连接到 SQL Server。

ping 侦听器以获取 aglisten 可用性时的命令提示符窗口的屏幕截图。

注意

可以将 SQLCMD 命令与参数一起使用, -M 如屏幕截图中所示,以连接到侦听器。

原因

出现此问题的原因是您的应用程序使用不支持新 MultiSubnetFailover 参数的旧数据提供程序,或者未配置为使用此参数。

此参数在 .NET Framework 4 及更高版本的 .NET Framework 附带的较新版本的 SQLClient 驱动程序中受支持,并已向后移植到 .NET Framework 3.5。

注意

PING 命令是一个简单的连接测试工具,不支持 new 参数。

解决方法

可以使用适用于你的案例的以下解决方法之一:

  • 若要解决数据提供程序支持MultiSubNetFailover参数的情况,请将参数添加到MultiSubNetFailover连接字符串,并将其设置为 true

  • 要在旧客户端无法使用该 MultiSubnetFailover 属性时解决这种情况,您可以通过从 Windows PowerShell 命令行界面运行以下命令将侦听器的值 RegisterAllProvidersIP 更改为 0

    Import-Module FailoverClusters
    Get-ClusterResource <*Your listener name*>|Set-ClusterParameter RegisterAllProvidersIP 0
    

    屏幕截图显示了 Windows PowerShell 中命令示例的输出。

注意

将该值设置为 RegisterAllProvidersIP0 后,必须从 DNS 服务器取消注册当前在线 IP 地址,并在发生故障转移时将离线 IP 地址注册到 DNS 服务器。 这可能会导致下一次故障转移的连接延迟。

详细信息

当您尝试连接到在多个子网上定义的侦听器时,如果客户端驱动程序尝试使用侦听器的脱机 IP 地址之一进行连接,则作可能会失败。

创建侦听器时,将为可用性组副本托管的每个唯一子网指定 IP 地址。 例如,如果为具有两个子网中存在副本的可用性组创建侦听器,则侦听器中定义了两个 IP 地址。 一个地址由一个应用程序使用,该应用程序可以连接到子网 1 中的 SQL Server 实例,另一个地址在应用程序连接到子网 2 中的 SQL Server 实例时使用。

侦听器在后台创建 Windows 群集客户端接入点资源。 其属性之一是 RegisterAllProvidersIP。 创建侦听器时,此属性设置为 1,并且侦听器的所有 IP 地址都在 DNS 服务器中注册。 此配置为客户端提供了减少的重新连接时间。

由于 DNS 记录包含所有 IP 地址,因此尝试连接到侦听器的客户端必须知道如何处理这种情况。 该 MultiSubnetFailover 参数使客户端驱动程序能够并行尝试连接到所有侦听器的 IP 地址。 MultiSubnetFailover如果没有参数,客户端驱动程序将尝试按顺序连接到侦听器的所有 IP 地址。 顺序连接可能会导致登录时间过长或登录超时。

注意

本文中提到的问题还会影响配置为使用 AlwaysOn 可用性组的辅助只读副本的 SharePoint 环境。 若要解决此问题,请执行以下任一操作适用于 SharePoint 版本:

参考