Недавно я обнаружил, что соединение одного из наших веб-серверов с прослушивателем 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-адресом прослушивателя. Ни на одном из серверов не включен брандмауэр или антивирус. Веб-сервер работает под управлением веб-версии сервера 2008, сервер SQL работает под управлением Windows Server 2012 и SQL Server 2012.