在多子网环境中连接到 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 中为 AlwaysOn 可用性组配置可用性组侦听器后,可能无法 ping 侦听器或从应用程序连接到它。
例如,尝试使用 SQLCMD
连接到 SQL Server 的侦听器时,连接超时。此外,你还会收到如下所示的错误消息:
Sqlcmd:错误:Microsoft SQL Native Client:登录超时已过期。
注意
这些症状通常是间歇性的,或与可用性组资源的故障转移相关的。
以下屏幕截图显示了尝试 ping 侦听器的可用性 aglisten
时发生的情况示例。 屏幕截图还显示了在包含多子网故障转移参数-M
时使用SQLCMD
命令成功连接到 SQL Server。
注意
可以将 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
注意
将值设置为 RegisterAllProvidersIP
0 后,当前联机 IP 地址必须从 DNS 服务器取消注册,并且当发生故障转移时,必须将脱机 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 版本:
对于 SharePoint 2007:这归类为旧应用程序。 因此,无法将 SharePoint 2007 配置为使用
MultiSubnetFailover
参数。 相反,必须使用“解决方案”部分中介绍的 Windows PowerShell 命令。对于 SharePoint 2010:累积更新包现在可用于添加对
MultiSubnetFailover
参数的支持。 有关更新包的详细信息,请参阅以下文章: