次の方法で共有


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

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

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
    

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

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

関連情報