使用Multisubnetfailover = True时的连接超时

时间:2014-05-01 20:58:11

标签: sql-server alwayson

最近我发现连接失败了,从我们的一个Web服务器到MSSQL AlwaysOn Listener。侦听器有两个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版,SQL Server正在运行Windows Server 2012和sql server 2012。

4 个答案:

答案 0 :(得分:0)

以下是真的: 您有一个安装在客户端应用程序工作站上的活动传输驱动程序接口(TDI)筛选器驱动程序。

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

答案 1 :(得分:0)

所以“我认为”我能解决这个问题。我重新安装了.NET 4.5并重新启动了服务器,现在连接没有问题。我目前的想法是,无论谁安装4.5原本没有跟进所需的系统重启,让事情处于一种奇怪的状态。我将继续监视此服务器几周,以查看问题是否重新出现。我仍然对可能导致此问题的任何其他意见表示赞赏。

答案 2 :(得分:0)

所以我们最近有完全相同,似乎与2014年9月的MS周二补丁一致。作为临时修复,我在hosts文件中放入“活动”侦听器IP,因此它总是在本地解析,一切正常。我想我也可以删除故障转移群集中的第二个IP。

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

答案 3 :(得分:0)

这是客户端问题。我刚从基于Windows 7客户端的应用程序在Sql 2012上发生过它。您之前获得的关于知识库文章的建议是正确的。它最初由Microsoft工程师提供给我以纠正我们的问题。

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

安装推荐的KB修补程序。

重新运行测试应用程序,你应该毫不犹豫。