本文可帮助你解决在多子网环境中连接到 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。
注意
可以将 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
注意
将该值设置为 RegisterAllProvidersIP
0 后,必须从 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 版本:
对于 SharePoint 2007:这归类为旧应用程序。 因此,无法将 SharePoint 2007 配置为使用该
MultiSubnetFailover
参数。 相反,必须使用“解决方案”部分中介绍的 Windows PowerShell 命令。对于 SharePoint 2010:累积更新包现在可用于添加对
MultiSubnetFailover
参数的支持。 有关更新包的详细信息,请参阅以下文章: