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

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

原始产品版本:SQL Server 2012 Developer、SQL Server 2012 Enterprise、SQL Server 2012 Express、SQL Server 2012 Standard、SQL Server 2012 Web、SQL Server 2012 Enterprise Core
原始 KB 编号: 2792139

症状

在 Microsoft SQL Server 2012 中为Always On可用性组配置可用性组侦听器后,可能无法从应用程序对侦听器执行 ping 操作或连接到该侦听器。

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

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

注意

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

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

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

注意

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

原因

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

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

注意

命令 PING 是不支持新参数的简单连接测试工具。

解决方案

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

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

  • 若要解决旧客户端无法使用 MultiSubnetFailover 属性时出现这种情况,可以将侦听器 RegisterAllProvidersIP 的值更改为 0。 为此,请从Windows PowerShell命令行接口运行以下命令:

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

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

注意

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

更多信息

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

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

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

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

注意

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

References