SQL Server Native Client の HADR サポート
このトピックでは、Always On可用性グループのSQL Server Native Clientサポート (SQL Server 2012 で追加) について説明します。 Always On可用性グループの詳細については、「可用性グループ リスナー、クライアント接続、アプリケーション フェールオーバー (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 アドレスへの接続を並列に確立しようとします。接続試行が成功すると、ドライバーは保留中の接続試行をすべて破棄します。
Note
接続タイムアウト値を大きくし、接続再試行ロジックを実装することにより、アプリケーションが可用性グループに接続する確立が高まります。 また、可用性グループのフェールオーバーにより接続が失敗する可能性があるため、接続再試行ロジックを実装して、再接続されるまで、失敗した接続の再接続を試行する必要があります。
MultiSubnetFailover を使用した接続
SQL Server 2012 可用性グループ リスナーまたは SQL Server 2012 フェールオーバー クラスター インスタンスに接続する際には、必ず MultiSubnetFailover=Yes
を指定してください。 MultiSubnetFailover
を指定することで、SQL Server 2012 のすべての可用性グループおよびフェールオーバー クラスター インスタンスに対して高速フェールオーバーが有効化され、単一サブネットおよびマルチサブネットの AlwaysOn トポロジにおけるフェールオーバー時間が大幅に短縮されます。 マルチサブネット フェールオーバーの際には、クライアントは複数の接続を並列で試行します。 サブネットのフェールオーバー中に、SQL Server Native Clientは TCP 接続を積極的に再試行します。
接続プロパティはMultiSubnetFailover
、アプリケーションが可用性グループまたはフェールオーバー クラスター インスタンスにデプロイされていること、およびすべての IP アドレスへの接続を試みることで、SQL Server Native Clientがプライマリ 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
の値を増やすことで、フェールオーバー時間に対応し、アプリケーションの接続試行回数を減らすことができます。分散トランザクションはサポートされません。
読み取り専用のルーティングが無効である場合、次の状況では可用性グループのセカンダリ レプリカの場所には接続できません。
セカンダリ レプリカの場所が、接続を許可するように構成されていない。
アプリケーションが
ApplicationIntent=ReadWrite
(後で説明) を使用している場合、セカンダリ レプリカの場所は読み取り専用アクセスとして構成されます。
プライマリ レプリカが読み取り専用のワークロードを拒否するように設定され、接続文字列が ApplicationIntent=ReadOnly
を含んでいる場合、接続は失敗します。
データベース ミラーリングから複数のサブネット クラスターを使用するためのアップグレード
接続文字列に MultiSubnetFailover
および Failover_Partner
の接続キーワードが存在する場合、接続エラーが発生します。 が使用され、SQL Serverがデータベース ミラーリング ペアの一部であることを示すフェールオーバー パートナー応答を返す場合MultiSubnetFailover
にもエラーが発生します。
現在データベース ミラーリングを使用しているSQL Server Native Client アプリケーションをマルチサブネット シナリオにアップグレードする場合は、接続プロパティをFailover_Partner
削除し、 を に設定してYes
置き換えMultiSubnetFailover
、接続文字列内のサーバー名を可用性グループ リスナーに置き換える必要があります。 接続文字列が 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
キーワードは、読み取り専用のルーティングを有効にするために使用されます。
読み取り専用ルーティング
読み取り専用のルーティングはデータベースの読み取り専用のレプリカの可用性を確保できる機能です。 読み取り専用のルーティングを有効にするには次のことが必要です。
AlwaysOn 可用性グループの可用性グループ リスナーに接続する必要があります。
ApplicationIntent
接続文字列キーワードをReadOnly
に設定する必要があります。可用性グループは、データベース管理者によって、読み取り専用のルーティングを有効にするように構成される必要があります。
読み取り専用のルーティングを使用する複数の接続のすべてが、同じ読み取り専用のレプリカに接続しないようにすることができます。 データベースの同期変更またはサーバーのルーティング構成の変更は、異なる読み取り専用のレプリカに対するクライアントの接続につながることがあります。 すべての読み取り専用の要求が、確実に同じ読み取り専用のレプリカに接続するようにするには、Server
接続文字列キーワードに可用性グループ リスナーを渡さないでください。 代わりに、読み取り専用のインスタンスの名前を指定します。
読み取り専用のルーティングでは、最初にプライマリに接続し、最適な可用性の読み取り可能なセカンダリを検索するため、プライマリに接続するよりも時間がかかる場合があります。 そのため、ログインのタイムアウトを増やす必要があります。
ODBC
SQL Server Native Clientの可用性グループAlways Onサポートするために、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」を参照してください。
キーワードと MultiSubnetFailover
キーワードのApplicationIntent
機能は、SQL Server 2012 以降、SQL Server Native Client ドライバーを使用する DSN の ODBC データ ソースアドミニストレーターで公開されます。
SQL Server Native Client ODBC アプリケーションでは、次の 3 つの関数のいずれかを使用して接続を確立できます。
機能 | 説明 |
---|---|
SQLBrowseConnect | SQLBrowseConnect から返されるサーバーの一覧に VNN は含まれません。 サーバーがスタンドアロン サーバーか、Always On可用性グループに対して有効になっている 2 つ以上のSQL Server インスタンスを含む Windows Server フェールオーバー クラスタリング (WSFC) クラスター内のプライマリまたはセカンダリ サーバーであるかは示されず、サーバーの一覧のみが表示されます。 サーバーへの接続時にエラーが返された場合、接続先のサーバーの構成に ApplicationIntent 設定との互換性がないことが原因として考えられます。Always On可用性グループに対して有効になっている 2 つ以上のSQL Server インスタンスを含む Windows Server フェールオーバー クラスタリング (WSFC) クラスター内のサーバーが認識されないため SQLBrowseConnect 、SQLBrowseConnect 接続文字列キーワード (keyword)は無視MultiSubnetFailover されます。 |
SQLConnect | SQLConnect は、データ ソース名 (DSN) または接続プロパティを介して、ApplicationIntent と MultiSubnetFailover の両方をサポートします。 |
SQLDriverConnect | SQLDriverConnect は、接続文字列キーワード、接続プロパティ、または DSN を介して、ApplicationIntent と MultiSubnetFailover をサポートします。 |
OLE DB
SQL Server Native Clientの OLE DB では、キーワード (keyword)はMultiSubnetFailover
サポートされていません。
SQL Server Native Clientの OLE DB では、アプリケーションの意図がサポートされます。 OLE DB アプリケーションにおけるアプリケーション インテントの動作は、ODBC アプリケーションの場合と同じです (上記を参照)。
SQL Server Native Clientで可用性グループAlways Onサポートするために、OLE DB 接続文字列を 1 つ追加キーワード (keyword)。
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
を呼び出します。このとき、引数として、"SSPROP_INIT_APPLICATIONINTENT
" または "ReadWrite
" を値として持つ ReadOnly
プロパティを指定するか、"DBPROP_INIT_PROVIDERSTRING
" または "ApplicationIntent=ReadOnly
" を値として持つ ApplicationIntent=ReadWrite
プロパティを指定します。
アプリケーション インテントは、 [データ リンク プロパティ] ダイアログ ボックスの [すべて] タブの [アプリケーション インテントのプロパティ] フィールドで指定できます。
暗黙的な接続が確立された場合、その接続には、親の接続のアプリケーション インテント設定が使用されます。 同様に、同じデータ ソースから作成されたセッションはいずれも、そのデータ ソースのアプリケーション インテント設定を継承します。
参照
SQL Server Native Client の機能
SQL Server Native Client での接続文字列キーワードの使用