7

バックグラウンド

単一のデータベース サーバーに接続するさまざまな Web サーバー上に多数の Web アプリケーションがあります。過去 2 か月間、時折、Web サーバーがデータベース サーバーに接続できないことに気付きました。

私たちの環境

いくつかの異なる Web 環境があり、ColdFusion を実行するものと .NET を実行するものがあります。.NET アプリは、Web フォームと MVC の両方です。2.0 から 4.5 までの複数のバージョンにまたがっています。ColdFusion と .NET Web サーバーはどちらも Windows ベースのマシンです。ColdFusion と .NET の両方の Web 環境はクラスター化されており、一部のマシンは物理マシンであり、他のマシンは仮想マシンです。

データベース サーバーは SQL Server 2008 r2 です。複数のデータベースを収容します。各アプリケーションには、特定のデータベースへのアクセスのみを許可するサーバーに接続する独自のデータベース ユーザーがあります。

その他の事実

  • 問題に気付くと、それらは数秒から数分続く短いバーストで発生します。
  • 問題に気付くと、一度に 1 つのアプリだけでなく、複数の異なるアプリケーションからのエラーがバーストに含まれます。
  • 問題が発生した場合、バーストにはさまざまな Web 環境のアプリケーションからのエラーが含まれています。(これにより、アプリ自体が問題であることを除外できると思われます)
  • 接続の問題のバーストは、昼夜を問わずさまざまな時間に発生します。常に使用率が高い時間帯であるとは限りません。
  • ユーザー接続数、メモリ、IO、CPU 使用率などを監視しましたが、スパイクやその他の問題を示す可能性のあるものは見られませんでした。
  • 成功せずに問題をキャッチすることを期待して、Web サーバーと db サーバーに Wireshark をインストールしました。

質問

  1. 次にどこを見るべきかについて誰か提案がありますか?
  2. これを引き起こす可能性のあるデータベースのプロパティはありますか?
  3. データベースと Web サーバー間の接続をより適切に「監視」する方法はありますか?
  4. 何が起こっているのかをよりよく理解するために、アプリ側でできることはありますか?

アプリによって検出されたエラー

  • .NET エラー
    • SQL Server への接続を確立中に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないか、アクセスできませんでした。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。(プロバイダー: 名前付きパイプ プロバイダー、エラー: 40 - SQL Server への接続を開けませんでした)
    • タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
    • サーバーから結果を受信中にトランスポート レベルのエラーが発生しました。(プロバイダー: TCP プロバイダー、エラー: 0 - セマフォのタイムアウト期間が切れました。)
    • タイムアウトになりました。プールから接続を取得する前に、タイムアウト期間が経過しました。これは、プールされたすべての接続が使用中で、最大プール サイズに達したために発生した可能性があります。
  • ColdFusion エラー
    • データベース クエリの実行中にエラーが発生しました。ホストへの TCP/IP 接続が失敗しました。java.net.ConnectException: Connection timed out: connect
      38行目でエラーが発生しました。
    • データベース クエリの実行中にエラーが発生しました。ピアによる接続リセット: ソケット書き込みエラー
      91 行目でエラーが発生しました。
    • データベース クエリの実行中にエラーが発生しました。接続を確立しようとしてタイムアウトし
      ました 38 行目でエラーが発生しました。
4

1 に答える 1

1

CF では、あなたが見ているような問題があったことがあります。1つのサーバーにCFがあり、別のサーバーにSQL 2008 r2がありました。以下に投稿したようなCFエラーが表示されます。ネットワークエラーを追跡するのを助けるために、私は次のようなものを書きました:

1) down.bat を作成

tracert serverip

2) 次に<cftry><cfcatch>、クエリを a で囲みます。

クエリがエラーを生成したときに実行します

<cfexecute name="C:\path\to\down.bat" variable="log" timeout="60" />
    <cfmail to="ME" from="Server" subject="SQL DOWN">

    Server Debugging Info:
    ------------------------------------------------------------    
    #now()#

    #cfcatch.Detail#

    #cfcatch.Message#

    #log#        

    </cfmail>
</cfexecute>

これは、データセンターのハードウェアになってしまった状況を修正するのに役立ちました.

于 2012-10-24T15:57:05.933 に答える