使用 Multisubnetfailover=True 时的连接超时

Posted

技术标签:

【中文标题】使用 Multisubnetfailover=True 时的连接超时【英文标题】:Connection Timeouts When Using Multisubnetfailover=True 【发布时间】:2014-05-01 20:58:11 【问题描述】:

最近我发现从我们的一个网络服务器到 MSSQL AlwaysOn 侦听器的连接失败。侦听器有两个 IP 地址,因为它跨越子网,因此我们在连接字符串中指定 Multisubnetfailover=true。

尝试与侦听器建立连接时,出现以下错误:

System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired.  The timeout period elapsed while
attempting to consume the pre-login handshake acknowledgement.  This could be because the pre-login handshake
failed or the server was unable to respond back in time.  The duration spent while attempting to connect to this
server was - [Pre-Login] initialization=20991; handshake=0;  ---> System.ComponentModel.Win32Exception     
(0x80004005): The wait operation timed out at     
System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32     
waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions     
userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 
retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, 
TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, 
DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, 
DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, 
DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at IRNXMLGateway.Controllers.IRNXMLGatewayController.GenericCall(String methodCall) in 
CODELINE:line 376
ClientConnectionId:92074b33-176a-4006-b7c7-892e01a3eea7

我也尝试使用 SSMS 进行连接,但遇到了同样的超时问题。

我能够通过以下方式成功建立连接:

无需监听器直接连接到主机 直接连接到当前监听的IP地址 将连接超时增加到 200 秒 删除连接字符串中的 MultiSubnetFailover 选项

我在尝试从其他服务器连接时没有遇到此问题。 SQL 或 Windows 事件日志中没有错误,可帮助确定超时的原因。网络跟踪显示与当前侦听器 IP 地址的正确连接握手。两台服务器都没有启用防火墙或防病毒软件。 Webserver运行server 2008 web edition,SQL server运行windows server 2012和sql server 2012。

【问题讨论】:

不设置为 200 秒时,正常连接超时是多少? 默认连接超时(30 秒)。从其他机器连接通常需要 【参考方案1】:

以下是否属实: 您在客户端应用程序工作站上安装了一个活动的传输驱动程序接口 (TDI) 过滤器驱动程序。

如果是这样,MS 上有一篇关于此问题的知识库文章。http://support.microsoft.com/kb/2870437

【讨论】:

我确实看到了这个 KB,但它只适用于 SQL 2012 实例在 2008 R2 服务器上运行时,我的 SQL 实例在 Server 2012 上运行。【参考方案2】:

所以“我认为”我能够解决这个问题。我重新安装了 .NET 4.5 并重新启动了服务器,现在可以毫无问题地建立连接。我目前的想法是,最初安装 4.5 的人没有跟进所需的系统重新启动,从而使事情处于奇怪的状态。我将继续监视此服务器几周,以查看问题是否再次出现。对于可能导致此问题的任何其他意见,我仍然很感激。

【讨论】:

【参考方案3】:

所以我们最近遇到了完全相同的情况,并且似乎与 2014 年 9 月 MS 周二发布的补丁相吻合。作为临时修复,我将“活动”侦听器 IP 放入 hosts 文件中,以便它始终在本地解析并且一切正常.我想我也可以删除故障转移集群中的第二个 IP。

Telnet 似乎确认在连接到侦听器时需要 21 秒才能超时,这与侦听器 IP 的串行 DNS 查找匹配并得到“错误的”。仍在寻找最终答案,但肯定会尝试重新安装 4.5 .NET,因为我读到 .NET 库在 15 秒后超时,因此 DNS 永远没有机会将第二个 IP 发送到客户端。

【讨论】:

【参考方案4】:

这是一个客户端问题。我刚刚在基于 Windows 7 客户端的应用程序的 Sql 2012 上发生了这种情况。你之前得到的关于知识库文章的建议是正确的。它最初是由 Microsoft 工程师提供给我的,用于纠正我们的问题。

如果您的问题相同,您可以创建一个循环连接的测试应用。设置连接超时 = 6000 并显示循环计数器。您会看到它最初犹豫不决,然后放大迭代。

安装推荐的 KB 修补程序。

重新运行测试应用程序,您应该会毫不犹豫地看到。

【讨论】:

以上是关于使用 Multisubnetfailover=True 时的连接超时的主要内容,如果未能解决你的问题,请参考以下文章

使用表主类在 tr 之间获取表中的所有 tr 并推入数组

tr 简单使用

我们可以在`<tr></tr>`之后使用嵌套表吗?

tr命令使用简介

linux系统之tr命令

tr命令