次の方法で共有


マルチサブネット環境で Always On リスナーに接続するとタイムアウトが発生する

この記事は、マルチサブネット環境で 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 への接続が成功したことが示されています。

aglisten の可用性についてリスナーに ping を実行するときのコマンド プロンプト ウィンドウのスクリーンショット。

スクリーンショットに示すように、 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
    

    Windows PowerShell のコマンドの例の出力を示すスクリーンショット。

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 のバージョンに適用します。

関連情報