SQL Server Native Client の HADR サポート

このトピックでは、AlwaysOn 可用性グループ の SQL Server Native Client のサポート (SQL Server 2012 で追加) について説明します。 AlwaysOn 可用性グループ の詳細については、「可用性グループ リスナー、クライアント接続、およびアプリケーションのフェールオーバー (SQL Server)」、「可用性グループの作成と構成 (SQL Server)」、「フェールオーバー クラスタリングと AlwaysOn 可用性グループ (SQL Server)」、および「アクティブなセカンダリ: 読み取り可能なセカンダリ レプリカ (AlwaysOn 可用性グループ)」を参照してください。

接続文字列で、特定の可用性グループの可用性グループ リスナーを指定できます。 フェールオーバーする可用性グループ内のデータベースに SQL Server Native Client アプリケーションが接続されている場合、元の接続が切断されるため、フェールオーバー後にアプリケーションが動作を継続するには新しい接続を開く必要があります。

可用性グループ リスナーに接続しておらず、ホスト名に複数の IP アドレスが関連付けられている場合、SQL Server Native Client は DNS エントリに関連付けられているすべての IP アドレスを順次繰り返し処理します。 DNS サーバーが最初に返した IP アドレスがネットワーク インターフェイス カード (NIC) にバインドされていない場合、この処理に時間がかかる可能性があります。 SQL Server Native Client が可用性グループ リスナーに接続するとき、すべての IP アドレスに対して並列で接続を試行します。1 つの接続試行が成功すると、保留中の接続試行はすべて破棄されます。

注意

接続タイムアウト値を大きくし、接続再試行ロジックを実装することにより、アプリケーションが可用性グループに接続する確立が高まります。 また、可用性グループのフェールオーバーにより接続が失敗する可能性があるため、失敗した接続が再接続されるまで再試行する接続再試行ロジックを実装します。

MultiSubnetFailover を使用した接続

SQL Server 2012 可用性グループ リスナーまたは SQL Server 2012 フェールオーバー クラスター インスタンスに接続する際には、必ず MultiSubnetFailover=Yes を指定してください。 MultiSubnetFailover を指定することで、SQL Server 2012 のすべての可用性グループおよびフェールオーバー クラスター インスタンスに対して高速フェールオーバーが有効化され、単一サブネットおよびマルチサブネットの AlwaysOn トポロジにおけるフェールオーバー時間が大幅に短縮されます。 マルチサブネット フェールオーバーの際には、クライアントは複数の接続を並列で試行します。 サブネット フェールオーバーの際には、SQL Server Native Client は積極的に TCP 接続を再試行します。

MultiSubnetFailover 接続プロパティを指定すると、アプリケーションが可用性グループまたはフェールオーバー クラスター インスタンスに配置され、SQL Server Native Client がすべての IP アドレスに対して接続を試行することでプライマリ SQL Server インスタンス上のデータベースに接続を試みます。 接続に MultiSubnetFailover=Yes を指定した場合、クライアントは、オペレーティング システムの既定の TCP 再転送間隔よりも早く TCP 接続を再試行します。 これにより、AlwaysOn 可用性グループまたは AlwaysOn フェールオーバー クラスター インスタンスのフェールオーバー後、再接続されるまでの時間を短縮することができます。単一サブネットとマルチサブネットの可用性グループ インスタンスおよびフェールオーバー クラスター インスタンスに適用することができます。

接続文字列キーワードの詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。

接続先が可用性グループ リスナーでもフェールオーバー クラスター インスタンスでもないときに MultiSubnetFailover=Yes を指定すると、パフォーマンスが低下する可能性があるため、このような指定はサポートされません。

可用性グループまたはフェールオーバー クラスター インスタンス内のサーバーに接続する際には、次のガイドラインに従います。

  • 単一サブネットまたはマルチサブネットに接続する際には、MultiSubnetFailover 接続プロパティを使用します。これによって、どちらの場合にもパフォーマンスが向上します。

  • 可用性グループに接続するには、接続文字列でサーバーとして、可用性グループの可用性グループ リスナーを指定します。

  • 64 個を超える数の IP アドレスが構成された SQL Server インスタンスに接続すると、接続エラーが発生します。

  • MultiSubnetFailover 接続プロパティを使用するアプリケーションの動作は、認証の種類 (SQL Server 認証、Kerberos 認証、または Windows 認証) の影響を受けません。

  • loginTimeout の値を増やすことで、フェールオーバー時間に対応し、アプリケーションの接続試行回数を減らすことができます。

  • 分散トランザクションはサポートされていません。

読み取り専用のルーティングが無効である場合、次の状況では可用性グループのセカンダリ レプリカの場所には接続できません。

  1. セカンダリ レプリカの場所が、接続を許可するように構成されていない。

  2. アプリケーションに ApplicationIntent=ReadWrite (以降に解説します) が使用されているが、セカンダリ レプリカの場所が読み取り専用アクセスとして構成されている。

プライマリ レプリカが読み取り専用ワークロードを拒否するように構成されているとき、接続文字列に ApplicationIntent=ReadOnly が含まれていると、接続は失敗します。

データベース ミラーリングの使用からマルチサブネット クラスターの使用へのアップグレード

接続文字列に MultiSubnetFailover および Failover_Partner の接続キーワードが存在する場合、接続エラーが発生します。 また、MultiSubnetFailover が使用されているとき、SQL Server から、データベース ミラーリング ペアに属していることを示すフェールオーバー パートナー応答が返された場合にも、エラーが発生します。

データベース ミラーリングを現在使用している SQL Server Native Client アプリケーションをマルチサブネットのシナリオにアップグレードする場合、Failover_Partner 接続プロパティを削除して MultiSubnetFailover に置き換え、それを Yes に設定し、接続文字列内のサーバー名を可用性グループ リスナーの名前に置き換えます。 接続文字列で Failover_Partner および MultiSubnetFailover=Yes が使用されている場合、ドライバーでエラーが発生します。 ただし、接続文字列で Failover_Partner および MultiSubnetFailover=No (または ApplicationIntent=ReadWrite) が使用されている場合、アプリケーションではデータベース ミラーリングが使用されます。

可用性グループ内のプライマリ データベースでデータベース ミラーリングが使用されているとき、可用性グループ リスナーではなくプライマリ データベースに接続する接続文字列で MultiSubnetFailover=Yes が使用されていると、ドライバーはエラーを返します。

アプリケーション インテントの指定

ApplicationIntent=ReadOnly が指定されている場合、AlwaysOn が有効になっているデータベースにクライアントが接続するときに読み取りワークロードが要求されます。 サーバーは接続時と USE データベース ステートメントの実行時にこのインテントを適用しますが、その対象は AlwaysOn が有効になっているデータベースに限られます。

ApplicationIntent キーワードは、従来型の読み取り専用データベースに対しては動作しません。

対象の AlwaysOn データベースのワークロードの読み取りを許可または禁止することができます。 (それには、PRIMARY_ROLE ステートメントおよび SECONDARY_ROLE Transact-SQL ステートメントの ALLOW_CONNECTIONS 句を使用します。)

ApplicationIntent キーワードを使用して、読み取り専用のルーティングを有効にします。

Read-Only Routing

読み取り専用のルーティングは、データベースの読み取り専用レプリカを使用可能にする機能です。 読み取り専用のルーティングを有効にするには

  1. AlwaysOn 可用性グループ リスナーに接続する必要があります。

  2. ApplicationIntent 接続文字列キーワードは ReadOnly に設定する必要があります。

  3. データベース管理者が可用性グループを構成し、読み取り専用のルーティングを有効にする必要があります。

読み取り専用のルーティングを使用した複数の接続が同じ読み取り専用レプリカに接続されるとは限りません。 データベース同期の変更やサーバーのルーティング構成の変更によって、クライアントが別の読み取り専用レプリカに接続される場合があります。 すべての読み取り専用要求を同じ読み取り専用レプリカに接続するには、可用性グループ リスナーを Server 接続文字列キーワードに渡さないでください。 代わりに、読み取り専用インスタンスの名前を指定します。

読み取り専用ルーティングでは、最初にプライマリに接続した後で読み取り可能の最適なセカンダリを探すため、プライマリに接続する場合よりも時間がかかる場合があります。 このため、ログイン タイムアウトを大きくする必要があります。

ODBC

AlwaysOn 可用性グループ をサポートするために、SQL Server Native Client には、次の 2 つの ODBC 接続文字列キーワードが追加されています。

  • ApplicationIntent

  • MultiSubnetFailover

SQL Server Native Client の ODBC 接続文字列キーワードの詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。

対応する接続プロパティは次のとおりです。

  • SQL_COPT_SS_APPLICATION_INTENT

  • SQL_COPT_SS_MULTISUBNET_FAILOVER

SQL Server Native Client の ODBC 接続文字列プロパティの詳細については、「SQLSetConnectAttr」を参照してください。

ApplicationIntent キーワードと MultiSubnetFailover キーワードの機能は、SQL Server Native Client ドライバーを使用する DSN の ODBC データ ソース アドミニストレーターで公開されます (SQL Server 2012 以降)。

SQL Server Native Client ODBC アプリケーションは、次に示した 3 つの関数のいずれかを使用して、接続を行うことができます。

関数

説明

SQLBrowseConnect

SQLBrowseConnect から返されるサーバーの一覧に VNN は含まれません。 確認できるのはサーバーの一覧だけです。スタンドアロン サーバーであるのか、AlwaysOn 可用性グループ が有効な 2 つ以上の SQL Server インスタンスが含まれる Windows Server フェールオーバー クラスタリング (WSFC) クラスターのうちのプライマリ サーバーまたはセカンダリ サーバーであるのかは示されません。 サーバーへの接続時にエラーが返された場合、接続先のサーバーの構成に ApplicationIntent 設定との互換性がないことが原因として考えられます。

SQLBrowseConnect は、AlwaysOn 可用性グループ が有効な 2 つ以上の SQL Server インスタンスが含まれる Windows Server フェールオーバー クラスタリング (WSFC) クラスター内のサーバーを認識しません。このため、MultiSubnetFailover 接続文字列キーワードは、SQLBrowseConnect では無視されます。

SQLConnect

SQLConnect は、データ ソース名 (DSN) または接続プロパティを介して、ApplicationIntent と MultiSubnetFailover の両方をサポートします。

SQLDriverConnect

SQLDriverConnect は、接続文字列キーワード、接続プロパティ、または DSN を介して、ApplicationIntent と MultiSubnetFailover をサポートします。

OLE DB

SQL Server Native Client の OLE DB では、MultiSubnetFailover キーワードはサポートされません。

SQL Server Native Client の OLE DB では、アプリケーション インテントがサポートされます。 OLE DB アプリケーションにおけるアプリケーション インテントの動作は、ODBC アプリケーションの場合と同じです (上記を参照)。

AlwaysOn 可用性グループ をサポートするため、SQL Server Native Client には、次の OLE DB 接続文字列キーワードが追加されています。

  • Application Intent

SQL Server Native Client の接続文字列キーワードの詳細については、「SQL Server Native Client での接続文字列キーワードの使用」を参照してください。

対応する接続プロパティは次のとおりです。

  • SSPROP_INIT_APPLICATIONINTENT

  • DBPROP_INIT_PROVIDERSTRING

SQL Server Native Client OLE DB アプリケーションは、次のいずれかの方法で、アプリケーション インテントを指定できます。

  • IDBInitialize::Initialize
    IDBInitialize::Initialize は、あらかじめ構成された一連のプロパティを使用して、データ ソースを初期化し、データ ソース オブジェクトを作成します。 アプリケーション インテントは、プロバイダーのプロパティとして指定するか、拡張プロパティ文字列の一部として指定します。

  • IDataInitialize::GetDataSource
    IDataInitialize::GetDataSource には、Application Intent キーワードを含んだ入力接続文字列を渡すことができます。

  • IDBProperties::GetProperties
    IDBProperties::GetProperties は、現在データ ソースに設定されているプロパティの値を取得します。 Application Intent の値は、DBPROP_INIT_PROVIDERSTRING プロパティおよび SSPROP_INIT_APPLICATIONINTENT プロパティを通じて取得できます。

  • IDBProperties::SetProperties
    ApplicationIntent プロパティの値を設定するには、IDBProperties::SetProperties を呼び出します。このとき、引数として、"ReadWrite" または "ReadOnly" を値として持つ SSPROP_INIT_APPLICATIONINTENT プロパティを指定するか、"ApplicationIntent=ReadOnly" または "ApplicationIntent=ReadWrite" を値として持つ DBPROP_INIT_PROVIDERSTRING プロパティを指定します。

アプリケーション インテントは、[データ リンク プロパティ] ダイアログ ボックスの [すべて] タブの [アプリケーション インテントのプロパティ] フィールドで指定できます。

暗黙的な接続が確立された場合、その接続には、親の接続のアプリケーション インテント設定が使用されます。 同様に、同じデータ ソースから作成されたセッションはいずれも、そのデータ ソースのアプリケーション インテント設定を継承します。

関連項目

概念

SQL Server Native Client での接続文字列キーワードの使用

その他の技術情報

SQL Server Native Client の機能