2016-08-24 5 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スケジュールされたタスクから来ているが、例外もHTTP 500

興味深いことで、その結果、サイト内のURLを打つときなど、様々な他の場所から発生します彼らが波に乗っているということです。すなわち、数百秒以内にこれらの例外が100個まで存在する可能性があります。

サーバーを管理するお客様のインフラストラクチャチームは、ネットワーク上の問題ではなく、アプリケーションコードに問題があり、これらの例外が発生したと思われる時点でDBトラフィックが増加していると報告しています:

(これらのすべては、通常の性能に比べCLEAR SPIKESである) - 10時10分14秒で - - 「の数のユーザ接続は60から 90に増加した場合に数 - 10時10分14秒でバッチリクエストは約60から650に増加しました。 - 10:10:32 - "ディスク平均。 10時10分32秒で - - 8.4ms には1msから増加した時間を「READネットワーク使用率がSQLモニタによって登録されたネットワーク滴ありませんでした

18%に0.3%から急上昇、 NOインパクトのありましたサーバーのCPU使用率。

私はネットワーキングやSQLパフォーマンスの専門家ではありませんが、これらの統計情報は不合理ではないようです。または、後でネットワーク接続が見つかりませんでした。サーバーがビジーだった場合は、タイムアウト例外が発生することが予想されます。

私は迅速に、それはネットワークの問題で示唆されているサイトコアのサポート連絡しました:これらの例外に基づき

彼らがサイトコアに関連しているようではありませんが。 メッセージには何らかの種類のネットワークエラーがあることが明確に記載されているため、 インフラストラクチャチームと共にさらに調査することには が適しています。私はデータベースで同様の問題をレビューし、 は次の領域を強調表示できます。 - リモート接続が強制的に閉じられました/無効にされました - サーバーがオフラインでした - 間違ったセキュリティコンテキストに関連しました。ファイアウォールやアンチウィルスが影響を与える可能性があります。

現在のところ、私たちはログアウトしています。私の気持ちは、エラーメッセージがであることが示唆されていることです。ネットワークに問題はありませんが、チームは何らかの方法でサイトが壊れていると考えています。

どのように問題を診断できますか?コード/サイトコードに問題があるのでしょうか、これはネットワーキングの問題ですか?

更新:ネットワークは、データベースサーバが異なるネットワーク上でホストされていると私は信じているVLANを経由してネットワーク接続されている

を詳述。サーバは負荷分散されていますが、私は *が適切なロードバランサではなくファイアウォールを使用して実行される可能性があると思います。

UPDATE 2

問題はSQLがTCPと名前付きパイプの両方を許可するように設定されたということでした。標準のSQLポートを使用しない後者と接続しようとすることもあります。解決策は、接続文字列のデータソース/サーバの接頭辞をData Source=tcp:xxx.xxx.xx.xxxに設定して、常にTCP経由で接続することです。

+0

dbプロパティのautocloseになる可能性があります。 – ASura

+0

あなたは私の希望をそこに持っています!しかし、そのプロパティはfalseに設定されていません –

+0

私は、pingサービスを常に開いてVLAN経由で接続を閉じることを考えています。LB/WAFが接続を切断していると思われます。また、最大接続制限がヒットしているかどうかを確認できますか?従来、VLANを介して大陸間でトランザクションレプリケーションを行った場合、データをプッシュする前に最初の接続要求を送信する必要がありました。 – ASura

答えて

4

これはSitecoreとは関係ありませんでしたが、また、インフラストラクチャのスタッフがデータベースサーバーがうまくいると確信していて、ウェブサイトに問題があった場合も同様の問題がありました。

私は、ネットワークの問題を疑われるので、私のアプローチは:

  1. 私は、コマンドラインから実行することができ、同じ接続の問題を示すだろうSQLスクリプトを書きました。

  2. 私はWebサーバー上でそのスクリプトを実行し、データベースサーバー自体でスクリプトを実行しました。結果を記録して比較した。

私のテストでは、Webサーバーのコマンドラインから実行すると、スクリプトがDBサーバー上で実行したときにエラーが全く再現できなかったこと、それが起こったことを示しました。それは、問題が接続に関連していて、ウェブサイトまたはデータベースサーバーに関係していなかったという私の感想を裏付ける証拠でした。

ファイアウォールの設定に注意を払って、WebサーバーのDMZを内部ネットワークから分割して、このファイアウォールは負荷分散されたペアでした。最初のボックスから開始された接続を2番目のボックスで終了させるという微妙な構成の違いが見つかりました。

この特定の問題が原因で問題が発生する可能性は低いですが、問題の原因を特定するのに役立つテストを提案する全体的なアプローチがあります。

+0

実際、それは同様の状況のようです - 私の更新を見てください。コマンドラインからクエリを実行することをお勧めします –

+0

sqlcmdを使用してバッチファイルを作成し、Windowsスケジュールタスクを使用して定期的に実行すると、これもまた失敗することがあります。この証拠を提出した後、彼らのインフラストラクチャチームは、その後、名前付きパイプに使用されるSMB/SAMBAポート445がvshieldファイアウォールによってブロックされていると結論付けました。 –

+0

あなたがこれを追跡するのを聞いてうれしいです。 – JermDavis

関連する問題