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