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自動フェイルオーバーを機能させるために何が欠けていますか?
MSと1週間作業した後、なぜこれが発生するのかを解明しました。
データベースがフェイルオーバーしたことを確認する必要があるため、アプリケーションはフェイルオーバーしません。接続がデータベースのフェイルオーバーであると判断する前に、SQL接続がタイムアウトします。
データベースが(すべてのデフォルトのtcpレジストリ設定で)フェイルオーバーしたことを確認するプロセスは次のとおりです。
プリンシパルがダウンしている場合、この通信は次の理由で約21秒かかります。
したがって、SQL接続が21秒(おそらく実際にはそれ以上)待機していない場合、このダンスが終了する前にタイムアウトになり、フェイルオーバーはまったく行われません。
解決策は、接続文字列のタイムアウトを大きな値に設定することです。安全のために60秒を使用します。
乾杯
テスト時に自動フェイルオーバーの条件が満たされていないのではないかと思いますか?具体的には、障害時にデータベースがミラーと同期されていない場合(sys.database_mirroringからミラーリング状態を確認)および/またはその時点で監視とミラーが接続されていない場合(参加しているロール間のpingを介してテスト)。
パートナーとミラーが相互に接続されていない状況が発生する可能性もありますが、パートナーとミラーのデータベースは引き続き独立して監視に接続されています。その場合、証人は何も悪いことを認識しません(したがって、フェイルオーバーはありません)。しかし、サーバー自体をシャットダウンすると述べたので、これはあまり起こりそうにありません。
または、フェイルオーバーは最終的には発生するが、再接続は失敗すると言っていますか?この場合、検出とフェイルオーバーの時間は、プリンシパルがどのように失敗したか、およびミラーデータベースを回復するための合計時間によって異なります。