マルチサブネット環境でAlways On リスナーに接続するとタイムアウトが発生する
この記事は、マルチサブネット環境でSQL Server Always On可用性グループ リスナーに接続するときに発生する問題を解決するのに役立ちます。
元の製品バージョン: SQL Server 2012 Developer、SQL Server 2012 Enterprise、SQL Server 2012 Express、SQL Server 2012 Standard、SQL Server 2012 Web、SQL Server 2012 Enterprise Core
元の KB 番号: 2792139
現象
Microsoft SQL Server 2012 でAlways On可用性グループの可用性グループ リスナーを構成した後、リスナーに ping を実行したり、アプリケーションから接続したりできない場合があります。
たとえば、 を使用SQLCMD
して SQL Server のリスナーに接続しようとすると、接続がタイムアウトします。さらに、次のようなエラー メッセージが表示されます。
Sqlcmd: エラー: Microsoft SQL Native Client: ログイン タイムアウトの有効期限が切れています。
注:
通常、これらの現象は断続的であるか、可用性グループ リソースのフェールオーバーに関連します。
次のスクリーンショットは、 の可用性についてリスナーに ping を実行しようとしたときに発生する処理の aglisten
例を示しています。 スクリーンショットには、マルチサブネット フェールオーバー パラメーター -M
を含める場合に コマンドをSQLCMD
使用して、SQL Serverへの正常な接続も示されています。
注:
コマンドは SQLCMD
、スクリーンショットに示すように パラメーターと -M
共に使用して、リスナーに接続できます。
原因
この問題は、アプリケーションで新しい MultiSubnetFailover
パラメーターをサポートしていないレガシ データ プロバイダーを使用するか、このパラメーターを使用するように構成されていないために発生します。
このパラメーターは、.NET Framework 4 およびそれ以降のバージョンの.NET Frameworkに含まれる新しいバージョンの SQLClient ドライバーでサポートされ、.NET Framework 3.5 に移植されます。
注:
コマンドは PING
、新しいパラメーターをサポートしない単純な接続テスト ツールです。
解決方法
ケースに該当する場合は、次のいずれかの解決策を使用できます。
データ プロバイダーがパラメーターをサポートしている場合にこの状況を
MultiSubNetFailover
解決するには、パラメーターをMultiSubNetFailover
接続文字列に追加し、true に設定します。レガシ クライアントで プロパティを使用できない場合にこの状況を
MultiSubnetFailover
解決するには、リスナーのRegisterAllProvidersIP
値を 0 に変更します。 これを行うには、Windows PowerShell コマンド ライン インターフェイスから次のコマンドを実行します。Import-Module FailoverClusters Get-ClusterResource <*Your listener name*>|Set-ClusterParameter RegisterAllProvidersIP 0
注:
値を RegisterAllProvidersIP
0 に設定した後、現在のオンライン IP アドレスを DNS サーバーから登録解除し、フェールオーバーが発生したときにオフライン IP アドレスを DNS サーバーに登録する必要があります。 これにより、次のフェールオーバーの接続遅延が発生する可能性があります。
詳細
複数のサブネットで定義されているリスナーに接続しようとすると、クライアント ドライバーがリスナーのオフライン IP アドレスのいずれかを使用して接続しようとすると、操作が失敗する可能性があります。
リスナーが作成されると、可用性グループ レプリカがホストされている一意のサブネットごとに IP アドレスが指定されます。 たとえば、2 つのサブネットに存在するレプリカを持つ可用性グループのリスナーが作成された場合、リスナーには 2 つの IP アドレスが定義されます。 1 つのアドレスは、サブネット 1 のSQL Serverのインスタンスに接続できるアプリケーションで使用され、もう 1 つのアドレスは、アプリケーションがサブネット 2 のSQL Serverのインスタンスに接続するときに使用されます。
バックグラウンドで、リスナーは Windows クラスターのクライアント アクセス ポイント リソースを作成します。 そのプロパティの 1 つは です RegisterAllProvidersIP
。 リスナーが作成されると、これは 1 に設定され、リスナーのすべての IP アドレスが DNS サーバーに登録されます。 この構成により、クライアントの再接続時間が短縮されます。
DNS レコードにはすべての IP アドレスが含まれているため、リスナーへの接続を試みるクライアントは、この状況を処理する方法を知っている必要があります。
MultiSubnetFailover
パラメーターを使用すると、クライアント ドライバーは、すべてのリスナーの IP アドレスへの並列接続を試すことができます。 パラメーターがないと MultiSubnetFailover
、クライアント ドライバーはリスナーのすべての IP アドレスに順番に接続しようとします。 シーケンシャル接続では、ログオン時間が長いか、ログオンタイムアウトが発生する可能性があります。
注:
この記事で説明する問題は、Always On可用性グループのセカンダリ読み取り専用レプリカを使用するように構成されている SharePoint 環境にも影響します。 この問題を解決するには、SharePoint のバージョンに適用される次のいずれかの操作を実行します。
SharePoint 2007 の場合: これはレガシ アプリケーションとして分類されます。 そのため、SharePoint 2007 をパラメーターを使用
MultiSubnetFailover
するように構成することはできません。 代わりに、「解決策」セクションで説明されているWindows PowerShell コマンドを使用する必要があります。SharePoint 2010 の場合: パラメーターのサポートを追加する累積的な更新プログラム パッケージを
MultiSubnetFailover
使用できるようになりました。 更新プログラム パッケージの詳細については、次の記事を参照してください。