Активный каталог SQL Server Случайные тайм-ауты рукопожатия

Вопрос или проблема

Мы установили активный каталог на новом сервере и присоединили наш сервер баз данных и веб-серверы к этому новому домену. Однако случайным образом мы получаем следующую ошибку. Какова может быть причина ошибки таймаута рукопожатия, которую мы иногда наблюдаем?

Тот факт, что это происходит не всегда, говорит о том, что информация о строке подключения, вероятно, правильная (или близка к правильной). Ниже представлена строка подключения, которую мы используем, и ошибка, которую мы ИНОГДА видим:

Строка подключения:

Data Source=<IP-адрес>;Initial Catalog=<Имя БД>;Integrated Security=SSPI

Стек вызовов:

System.Data.SqlClient.SqlException (0x80131904): Время ожидания подключения истекло. Время ожидания истекло при попытке потребления подтверждения рукопожатия до входа. Это могло произойти из-за того, что рукопожатие до входа не завершилось успешно, или сервер не смог ответить вовремя. Время, затраченное на попытку подключения к этому серверу, составило - [Pre-Login] инициализация=15610; рукопожатие=0;  ---> System.ComponentModel.Win32Exception (0x80004005): Операция ожидания превысила время ожидания

at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)

   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)

   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)

   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()

   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()

   at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean& marsCapable)

   at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover)

   at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)

   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)

   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)

   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData)

   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)

Это, вероятно, таймаут из-за какой-то проблемы с сетью. Причину сетевой проблемы невозможно установить исходя из этой информации. Это может быть что угодно между клиентом и экземпляром SQL Server. Проблемы с ресурсами клиента или сервера, проблемные настройки IP, ошибки с сетевой картой, congestion или задержка в сети и т.д. Я знаю, что ошибки не всегда воспроизводимы, но если вы сможете получить сетевой трассировку, когда происходит одно из исключений, это может помочь направить вас в правильном направлении, и вы сможете начать сужать круг вместе с этим.

Шаг 1:

netsh trace start capture=yes

Шаг 2: Откройте в Microsoft Message Analyzer

Шаг 3: Получите прибыль

Ответ или решение

Конечно, давайте разберемся с вашей проблемой, связанной с таймаутами подключения к SQL Server в среде Active Directory.

Причины таймаутов на этапе рукопожатия

Ошибка, которую вы видите, связана с истечением времени ожидания на этапе предварительного рукопожатия соединения с SQL Server. Это может произойти по нескольким причинам:

  1. Проблемы с сетью: Так как ошибка возникает случайным образом, это может свидетельствовать о проблемах в сети, таких как высокая задержка или потеря пакетов. Это может быть вызвано перегрузкой сети, настройки маршрутизации или плохими соединениями (например, неисправный сетевой адаптер).

  2. Ресурсы сервера: Убедитесь, что на сервере SQL нет дефицита ресурсов. Если процессор или память перегружены, это может замедлять обработку запросов.

  3. Проблемы с конфигурацией Active Directory: Проверьте настройки вашего контроллера домена и убедитесь, что сервер SQL правильно присоединён к домену без проблем с аутентификацией.

  4. Настройка брандмауэра: Убедитесь, что брандмауэры на серверах (как на стороне SQL Server, так и на клиентских машинах) настроены так, чтобы не блокировать необходимые порты.

  5. Параметры подключения: Проверьте строку подключения на наличие ошибок. Попробуйте временно добавить дополнительные параметры, такие как Connect Timeout, для управления временем ожидания.

Рекомендации по устранению проблемы

  1. Мониторинг сети: Настройте мониторинг сети для отслеживания задержек и потерь пакетов. Используйте инструменты, такие как Wireshark или Microsoft Message Analyzer, для более глубокого изучения трафика.

  2. Получение трассировок сети:

    Выполните следующие команды для сборки трассировок сети:

    Шаг 1: Откройте командную строку с повышенными правами и запустите трассировку:

    netsh trace start capture=yes

    Шаг 2: Воспроизведите ошибку, затем остановите трассировку:

    netsh trace stop

    Шаг 3: Откройте полученные файлы в Microsoft Message Analyzer или аналогичном инструменте для анализа.

  3. Оптимизация ресурсов: Проверьте использование CPU и памяти на сервере SQL при возникновении ошибки. Убедитесь, что есть достаточно ресурсов для обработки соединений.

  4. Тестирование соединений: Проведите тесты с использованием различных утилит, например telnet, или SQLCMD, чтобы убедиться, что сервер SQL работает стабильно и доступен с клиентских машин.

  5. Консультация с сетевыми администраторами: Если вам не удаётся решить проблему, стоит обратиться к вашей сетевой команде для более детального анализа сети.

Заключение

Ошибки рукопожатия при подключении к SQL Server могут быть сложными для диагностики, особенно когда они возникают нерегулярно. Важно сосредоточить внимание на каждом из возможных источников проблем, обеспечив достаточную диагностику и мониторинг. После выявления причины вы сможете предпринять соответствующие меры для ее устранения.

Оцените материал
Добавить комментарий

Капча загружается...