在多子网环境中连接到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。
注意
可以将 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 后,必须在发生故障转移时从 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 版本的以下任一操作:
对于 SharePoint 2007:这被归类为旧应用程序。 因此,不能将 SharePoint 2007 配置为使用
MultiSubnetFailover
参数。 相反,必须使用“解决方法”部分中所述的 Windows PowerShell 命令。对于 SharePoint 2010:累积更新包现在可用,可添加对 参数的支持
MultiSubnetFailover
。 有关更新包的详细信息,请参阅以下文章:
References
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈