2016-08-24 3 views
5

У меня есть приложение ASP.NET (Sitecore), и журналы показывают прерывистые ошибки соединения SQL в рабочей среде нашего клиента. Исключение состоит в следующем:Ошибка промежуточного соединения 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% случаев.

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

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

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

(Все это яСНЫЕ СПАЙКИ по сравнению с обычной производительности) - на 10:10:14 - число, если пользовательских соединений увеличено с 60 до 90 - на 10:10:14 - количество « пакетные запросы/с "увеличились с 60 до 650 - в 10:10:32 -" дисковое avg. ЧИТАЙТЕ время»увеличились с 1мса до 8.4ms - в 10:10:32 - использование сетей подскочило с 0,3% до 18%

Там не были сеть капли зарегистрированной монитором SQL, был никакого влияния на использование центрального процессора.

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

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

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

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

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

Обновление: Сеть детали

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

UPDATE 2

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

+0

Может быть автоклином в ваших свойствах db. – ASura

+0

У тебя есть мои надежды! Но для этого свойства не установлено значение false –

+0

Что бы я сделал, так это то, что служба ping постоянно открывала и закрывала соединение через VLAN. Я подозреваю, что LB/WAF отключает соединение. Также вы можете проверить, удалено ли максимальное ограничение соединения? Раньше, когда мы осуществляли транзакционную репликацию на разных континентах через VLAN, нам приходилось отправлять начальный запрос на соединение, прежде чем мы переместили данные. – ASura

ответ

4

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

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

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

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

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

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

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

+0

На самом деле это похоже на аналогичную ситуацию - см. Мое обновление.Я подумаю о запуске запроса из командной строки –

+0

После создания командного файла с использованием sqlcmd и с помощью запланированных задач Windows для периодического запуска его я обнаружил, что это тоже не сработает. После представления этих доказательств их команда по инфраструктуре с тех пор заключила, что порт 445 SMB/SAMBA, который используется для именованных каналов, блокируется брандмауэром vshield. –

+0

Awesome. Рад слышать, что вам удалось проследить это. – JermDavis