マルチサブネット環境で 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: ログイン タイムアウトの有効期限が切れています。
Note
通常、これらの現象は断続的であるか、可用性グループ リソースのフェールオーバーに関連します。
次のスクリーンショットは、リスナーに ping を実行して aglisten
の可用性を確認しようとしたときに発生する処理の例を示しています。 このスクリーンショットでは、マルチサブネット フェールオーバー パラメーターを-M
含めるとき、SQLCMD
コマンドを使用して SQL Server への接続が成功したことが示されています。
Note
スクリーンショットに示すように、 SQLCMD
コマンドを -M
パラメーターと共に使用してリスナーに接続できます。
原因
この問題は、アプリケーションで新しい MultiSubnetFailover
パラメーターをサポートしていないレガシ データ プロバイダーを使用しているか、このパラメーターを使用するように構成されていないために発生します。
このパラメーターは、.NET Framework 4 以降のバージョンの .NET Framework に含まれる新しいバージョンの SQLClient ドライバーでサポートされ、.NET Framework 3.5 に移植されます。
Note
PING
コマンドは、新しいパラメーターをサポートしない単純な接続テスト ツールです。
解決方法
ケースに該当する場合は、次のいずれかの解決策を使用できます。
データ プロバイダーが
MultiSubNetFailover
パラメーターをサポートしている場合にこの状況を解決するには、MultiSubNetFailover
パラメーターを接続文字列に追加し、true に設定します。レガシ クライアントが
MultiSubnetFailover
プロパティを使用できない場合のこの状況を解決するには、リスナーのRegisterAllProvidersIP
値を 0 に変更します。 これを行うには、Windows PowerShell コマンド ライン インターフェイスから次のコマンドを実行します。Import-Module FailoverClusters Get-ClusterResource <*Your listener name*>|Set-ClusterParameter RegisterAllProvidersIP 0
Note
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 アドレスに順番に接続しようとします。 シーケンシャル接続では、ログオン時間が長く、ログオンのタイムアウトが発生する可能性があります。
Note
この記事で説明する問題は、Always On 可用性グループのセカンダリ読み取り専用レプリカを使用するように構成されている SharePoint 環境にも影響します。 この問題を解決するには、次のいずれかのアクションを SharePoint のバージョンに適用します。
SharePoint 2007 の場合: これはレガシ アプリケーションとして分類されます。 そのため、
MultiSubnetFailover
パラメーターを使用するように SharePoint 2007 を構成することはできません。 代わりに、「 Resolution 」セクションで説明されている Windows PowerShell コマンドを使用する必要があります。SharePoint 2010 の場合:
MultiSubnetFailover
パラメーターのサポートを追加する累積的な更新プログラム パッケージを使用できるようになりました。 更新プログラム パッケージの詳細については、次の記事を参照してください。