Прерывистая ошибка соединения SQL

У меня есть приложение ASP.NET (Sitecore), и в журналах периодически появляются ошибки SQL-соединения в производственной среде нашего клиента. Исключением является следующее:

Exception: System.Data.SqlClient.SqlException
Message: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
Source: .Net SqlClient Data Provider
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, String accessToken, Boolean applyTransientFaultHandling)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   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.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Sitecore.Data.DataProviders.Sql.DataProviderCommand..ctor(IDbCommand command, DataProviderTransaction transaction, Boolean openConnection)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.<>c__DisplayClass4.<CreateCommand>b__3()
   at Sitecore.Data.DataProviders.NullRetryer.Execute[T](Func`1 action, Action recover)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.<>c__DisplayClass12.<CreateReader>b__10()
   at Sitecore.Data.DataProviders.NullRetryer.Execute[T](Func`1 action, Action recover)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.CreateReader(String sql, Object[] parameters)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.<CreateObjectReader>d__6`1.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at Sitecore.Eventing.EventQueue.ProcessEvents(Action`2 handler)
   at Sitecore.Eventing.EventProvider.RaiseQueuedEvents()

Nested Exception

Exception: System.ComponentModel.Win32Exception
Message: The network path was not found


6420 16:53:53 ERROR Exception processing remote events from database: web
Exception: System.Data.SqlClient.SqlException
Message: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
Source: .Net SqlClient Data Provider
   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.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Sitecore.Data.DataProviders.Sql.DataProviderCommand..ctor(IDbCommand command, DataProviderTransaction transaction, Boolean openConnection)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.<>c__DisplayClass4.<CreateCommand>b__3()
   at Sitecore.Data.DataProviders.NullRetryer.Execute[T](Func`1 action, Action recover)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.<>c__DisplayClass12.<CreateReader>b__10()
   at Sitecore.Data.DataProviders.NullRetryer.Execute[T](Func`1 action, Action recover)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.CreateReader(String sql, Object[] parameters)
   at Sitecore.Data.DataProviders.Sql.SqlDataApi.<CreateObjectReader>d__6`1.MoveNext()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at Sitecore.Eventing.EventQueue.ProcessEvents(Action`2 handler)
   at Sitecore.Eventing.EventProvider.RaiseQueuedEvents()

Nested Exception

Exception: System.ComponentModel.Win32Exception
Message: The network path was not found

Эта ошибка типична, если вы указали неверную строку подключения, когда указанный вами сервер не существует или недоступен в сети. Тем не менее, сайт функционирует нормально в 99% случаев.

В этом примере ошибка исходит от Sitecore RaiseQueuedEvents запланированное задание, но исключение также возникает из различных других мест, в том числе при переходе по URL-адресу на сайте, в результате чего получается http 500.

Интересно то, что они приходят волнами, то есть в течение нескольких секунд может быть до 100 таких исключений.

Наша инфраструктурная команда наших клиентов, которая управляет серверами, довольно непреклонна, что это не проблема сети, и что-то не так с кодом приложения, и сообщила, что в то время, когда эти исключения появляются, происходит увеличение трафика БД:

(Все это CLEAR SPIKES по сравнению с обычной производительностью) - в 10:10:14 - число, если количество пользовательских подключений увеличилось с 60 до 90 - в 10:10:14 - количество "пакетных запросов / с" увеличилось с 60 до 650 - в 10:10:32 - "Ср. Время чтения "увеличено с 1 мс до 8,4 мс - в 10:10:32 - коэффициент использования сети вырос с 0,3% до 18%

Мониторинг sql не зафиксировал никаких падений сети, это никак не повлияло на загрузку ЦП сервера.

Я не специалист по работе в сети или производительности SQL, но для меня эта статистика не представляется необоснованной или может стать причиной для последующих попыток подключения получить исключение "сетевой путь не найден"; если сервер был занят, я ожидал бы получить исключение тайм-аута?

Я связался со службой поддержки Sitecore, которые быстро предположили, что это проблема сети:

На основании этих исключений не похоже, что они связаны с Sitecore. В сообщениях четко указывается, что у вас есть какая-то сетевая ошибка, поэтому будет целесообразно провести дальнейшее расследование вместе с вашей командой по инфраструктуре. Я рассмотрел похожие проблемы в нашей базе данных и могу выделить следующие области. - Удаленное соединение было принудительно закрыто / отключено - Сервер был отключен - Что-то связано с неправильным контекстом безопасности. Брандмауэр и антивирусы могут повлиять на это.

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

Как я могу диагностировать, в чем проблема? Может ли быть какая-то проблема с кодом /sitecore или это проблема с сетью?

Обновление: сведения о сети

Сервер базы данных размещен в другой сети и подключен к сети через VLAN. Серверы сбалансированы по нагрузке, что, как мне кажется, может быть сделано с использованием брандмауэра, а не надлежащего балансировщика нагрузки.

ОБНОВЛЕНИЕ 2

Проблема заключалась в том, что SQL был настроен на использование как TCP, так и именованных каналов. Иногда он пытался соединиться с последним, который не использует стандартный порт SQL. Решением было префикс источника данных / сервера в строке подключения с помощью Data Source=tcp:xxx.xxx.xx.xxx всегда проверять соединение через TCP

1 ответ

Решение

Это не было связано с Sitecore, но ранее я видел очень похожую ситуацию с другой системой управления контентом. У меня также была аналогичная проблема с персоналом инфраструктуры, который был убежден, что с сервером базы данных все в порядке, и что проблема была с веб-сайтом.

Я подозревал проблему с сетью, поэтому мой подход был:

  1. Я написал сценарий SQL, который можно запустить из командной строки, и он обнаружит ту же проблему с подключением.

  2. Я запустил этот скрипт на веб-сервере и запустил сам скрипт на сервере базы данных. Я записал результаты и сравнил их.

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

Это сфокусировало внимание на настройке брандмауэра, отделяющего DMZ веб-сайта от внутренней сети, на которой работал SQL-сервер. Этот брандмауэр был парой с балансировкой нагрузки - и мы в итоге смогли найти тонкую разницу в конфигурации, которая заставила второй блок разорвать соединения, которые были запущены через первый блок.

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

Другие вопросы по тегам