[ADO.NET/SNAC] イニシャル パートナーがダウンしている場合、フェールオーバー パートナーに接続できる確率を高める方法

佐藤 靖典
SQL Developer Support Engineer

こんにちは。

ADO.NET (System.Data.SqlClient) や SQL Server Native Client (SNAC) から、データベース ミラーリング構成の SQL Server を利用したシステムを開発・運用されているお客様はたくさんいらっしゃいます。

この記事では、データベース ミラーリング構成の SQL Server を使用したシステムの可用性を、クライアント アプリケーションの設定で更に高める方法を紹介します。

1. シナリオ

イニシャル パートナーのマシンをシャットダウンしている状態で、アプリケーションからデータベース ミラーリング構成の SQL Server に接続試行した場合、接続エラーが発生することがあります。

ADO.NET では、次のような例外を受け取ります。

System.Data.SqlClient.SqlException
サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開けませんでした)

開発者・運用者の方は、SQL Server をミラー構成にしているんだから、フェールオーバー パートナーに勝手に接続して欲しいと期待するのではないでしょうか。

以降では、接続エラーが発生してしまう理由と対策を確認していきましょう。

2. なぜ、接続エラーが発生してしまうのか?

皆さんもご存知の通り、ミラー構成の SQL Server への接続文字列は、以下のように指定します。

Data Source=Server01;Failover Partner=Server02; Initial Catalog=myDataBase;Integrated Security=True;

この指定例では、アプリケーションは必ず Server01 への接続試行から実施され、Server01 へ接続できないと判断された場合にはじめて Failover Partner キーワードで指定された Server02 への接続試行が行われます。

この切り替わりまでには一定時間が必要であり、Server02 への接続が確立される前に接続タイムアウト時間に達すると、接続エラーが返されます。

ADO.NET (System.Data.SqlClient) と SQL Server Native Client は共に、TCP/IP での接続試行に失敗すると、名前付きパイプで接続試行します。この動作はミラー構成の SQL Server に対しても同様です。

上記 1. のようなシナリオが生じるのは、名前付きパイプでの接続試行中に、接続タイムアウト時間に達するために発生するケースがほとんどです。

切り替わりの動作は少々複雑であるため、興味のある方は、下記 4. の項目をご参照ください。

そうでない方は、 ”名前付きパイプで接続試行すると、切り替えまでの時間が長くなる” ということだけ覚えていただければ十分です。

3. フェールオーバー パートナーへの接続試行を早める方法

フェールオーバー パートナーへの接続試行を早める方法は、名前付きパイプを使用せず、TCP/IP でのみ接続試行することです。

TCP/IP のみ使用するには、次のように接続文字列に Network Library=dbmssocn; を追加します。

Data Source=Server01;Failover Partner=Server02;Initial Catalog=myDataBase;Integrated Security=True;Network Library=dbmssocn;

4. イニシャル パートナーとフェールオーバー パートナーへの接続試行の切り替わりの動作 (参考情報)

イニシャル パートナーへ接続できない場合、フェールオーバー パートナーへ接続試行する動作は以下です。

1) イニシャル パートナーに TCP/IP で接続試行します。
2) 上記で接続できない場合は、イニシャル パートナーに名前付きパイプで接続試行します。
3) 上記で接続できない場合は、フェールオーバー パートナーに TCP/IP で接続試行します。
4) 上記で接続できない場合は、フェールオーバー パートナーに名前付きパイプで接続試行します。

また、TCP/IP での接続時に、イニシャル パートナーからフェールオーバー パートナーまたはその逆への接続試行に切り替わる時間は決まっています。
これに対し、名前付きパイプでの接続試行の時間は非公開です。

 

// TCP/IP のみで接続試行した場合の切り替わりの動作 //

TCP/IP の接続試行の切り替わりの時間は、次の式で決まっています。

RetryTime = PreviousRetryTime + ( 0.08 * LoginTimeout )

接続タイムアウトの既定値 15 秒の場合、データベース ミラーリング構成の SQL Server へ "TCP/IP のみ" で接続試行を行った場合の動作は以下となります。

1) イニシャル パートナーに 1.2 秒の間、接続試行します。
2) 上記で接続できない場合は、フェールオーバー パートナーに 1.2 秒の間、接続試行します。
3) 上記で接続できない場合は、イニシャル パートナーに 2.4 秒の間、接続試行します。
4) 上記で接続できない場合は、フェールオーバー パートナーに 2.4 秒の間、接続試行します。
5) 上記で接続できない場合は、イニシャル パートナーに 3.6 秒の間、接続試行します。
6) 上記で接続できない場合は、フェールオーバー パートナーに 3.6 秒の間、接続試行します。
7) 上記で接続できない場合は、イニシャル パートナーに 4.8 秒の間、接続試行します。
8) 上記で接続できない場合は、フェールオーバー パートナーに 4.8 秒の間、接続試行します。

上記の場合、論理的には、接続タイムアウト 15 秒に達するのは 7) であり、この前にフェールオーバー パートナーへの接続試行は 3 回行われるため、接続できる確率はかなり高めといえます。

クリティカルなシステムほど、TCP/IP のみで接続試行を行うように設定することをお奨めします。

5. 参考資料

接続再試行アルゴリズム (TCP/IP 接続用)