web-dev-qa-db-ja.com

プリンシパルサーバーが物理的にオフラインになると、c#のDB自動フェールオーバーが機能しない

SQL Server 2008を使用してC#でDB自動フェイルオーバーを設定しています。監視設定を使用して「自動フェイルオーバーミラーによる安全性が高い」ので、接続文字列は次のようになります。

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

テスト中に、プリンシパルサーバーでSQL Serverサービスをオフにすると、自動フェイルオーバーは魅力のように機能しますが、プリンシパルサーバーをオフラインにすると(サーバーをシャットダウンするかネットワークカードを強制終了する)、自動フェイルオーバーが機能せず、ウェブサイトがタイムアウトするだけです。

私は この記事 を見つけました。最後の2番目の投稿は、プリンシパルがオフラインになったときに機能しない名前付きパイプを使用しているためですが、TCP接続文字列。

このDB自動フェイルオーバーを機能させるために何が欠けていますか?

9
user62521

MSと1週間作業した後、なぜこれが発生するのかを解明しました。

データベースがフェイルオーバーしたことを確認する必要があるため、アプリケーションはフェイルオーバーしません。接続がデータベースのフェイルオーバーであると判断する前に、SQL接続がタイムアウトします。

データベースが(すべてのデフォルトのtcpレジストリ設定で)フェイルオーバーしたことを確認するプロセスは次のとおりです。

  1. プリンシパルと通信してみてください、もうプリンシパルではないことを確認してください
  2. フェイルオーバーと通信して、フェイルオーバーがフェイルオーバーされ、新しいプリンシパルになったことを確認します。

プリンシパルがダウンしている場合、この通信は次の理由で約21秒かかります。

  1. プリンシパルとの通信を試み、3秒待って、タイムアウトします
  2. プリンシパルとの通信を再試行し、6秒間待機し、タイムアウトします
  3. プリンシパルとの通信を再試行し、12秒待ってからタイムアウトします
  4. フェイルオーバーパートナーとの通信を試み、フェイルオーバーしたことを確認して、アプリケーションでフェイルオーバーします。

したがって、SQL接続が21秒(おそらく実際にはそれ以上)待機していない場合、このダンスが終了する前にタイムアウトになり、フェイルオーバーはまったく行われません。

解決策は、接続文字列のタイムアウトを大きな値に設定することです。安全のために60秒を使用します。

乾杯

6
Trev

テスト時に自動フェイルオーバーの条件が満たされていないのではないかと思いますか?具体的には、障害時にデータベースがミラーと同期されていない場合(sys.database_mirroringからミラーリング状態を確認)および/またはその時点で監視とミラーが接続されていない場合(参加しているロール間のpingを介してテスト)。

パートナーとミラーが相互に接続されていない状況が発生する可能性もありますが、パートナーとミラーのデータベースは引き続き独立して監視に接続されています。その場合、証人は何も悪いことを認識しません(したがって、フェイルオーバーはありません)。しかし、サーバー自体をシャットダウンすると述べたので、これはあまり起こりそうにありません。

または、フェイルオーバーは最終的には発生するが、再接続は失敗すると言っていますか?この場合、検出とフェイルオーバーの時間は、プリンシパルがどのように失敗したか、およびミラーデータベースを回復するための合計時間によって異なります。

0
Joe Sack