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


9

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自動フェイルオーバーを機能させるには何が欠けていますか?


これには[C#]タグが必要ですか?どういうわけかそれはC#に固有ではないようです。
Gabe

回答:


6

MSで1週間作業した後、これが発生する理由を解明しました。

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

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

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

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

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

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

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

乾杯


0

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

また、パートナーとミラーが相互に接続されていない場合もありますが、パートナーとミラーのデータベースは引き続き独立してウィットネスに接続されています。その場合、目撃者は何も問題がないと見なします(したがって、フェイルオーバーは発生しません)。しかし、サーバー自体をシャットダウンすると述べたので、これはあまり起こりそうにありません。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.