セカンダリ レプリカからプライマリ レプリカへの読み取り/書き込み接続のリダイレクト (Always On 可用性グループ)

適用対象: SQL Server 2019 (15.x)

SQL Server 2019 (15.x) CTP 2.0 では、"Always On 可用性グループに対するセカンダリ レプリカからプライマリ レプリカへの読み取り/書き込み接続のリダイレクト" が導入されています。 すべてのオペレーティング システム プラットフォームで、読み取り/書き込み接続のリダイレクトを利用できます。 接続文字列に指定されたターゲット サーバーに関係なく、クライアント アプリケーションの接続先をプライマリ レプリカにすることができます。

たとえば、接続文字列内の接続先がセカンダリ レプリカであるとします。 可用性グループ (AG) の構成と接続文字列の設定によって、接続をプライマリ レプリカに自動的にリダイレクトできます。

ユース ケース

SQL Server 2019 (15.x) より前のバージョンでは、プライマリ レプリカへのユーザー トラフィックは、AG リスナーおよび対応するクラスター リソースによってリダイレクトされ、フェールオーバー後に再接続されるようになっています。 SQL Server 2019 (15.x) では、この AG リスナー機能は引き続きサポートされますが、リスナーを含めることができないシナリオのためにレプリカの接続のリダイレクトが追加されています。 次に例を示します。

  • SQL Server の可用性グループに統合されているクラスター テクノロジでは、リスナーに似た機能が提供されない
  • 構成が複雑になり、エラーが発生しがちであり、複数のコンポーネントが関係するせいでトラブルシューティングが困難な、クラウドや Pacemaker を使用するマルチサブネット フローティング IP のようなマルチサブネット構成である
  • 手動でのフェールオーバー時に透過的に再接続するためのわかりやすいメカニズムがないため、読み取りのスケールアウト、またはディザスター リカバリーとクラスターの種類が NONE である

要件

セカンダリ レプリカに読み取り/書き込み接続要求をリダイレクトするには:

  • セカンダリ レプリカがオンラインである必要があります。
  • レプリカの仕様の PRIMARY_ROLEREAD_WRITE_ROUTING_URL が含まれている必要があります。
  • 接続文字列は、ApplicationIntentReadWrite として定義するか、または ApplicationIntent を設定せずに既定値 (ReadWrite) を有効にすることによって、ReadWrite とする必要があります。

READ_WRITE_ROUTING_URL オプションを設定する

読み取り/書き込み接続を構成するには、AG を作成するときに、プライマリ レプリカに対して READ_WRITE_ROUTING_URL を設定する必要があります。

SQL Server 2019 (15.x) では、<add_replica_option> 仕様に READ_WRITE_ROUTING_URL が追加されています。 次のトピックを参照してください。

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) が設定されていない (既定の設定)

既定では、レプリカには読み取り/書き込み接続のリダイレクトは設定されていません。 接続要求がセカンダリ レプリカによってどのように処理されるかは、セカンダリ レプリカが接続を許可するように設定されているかどうかと、接続文字列内の ApplicationIntent 設定によって決まります。 次の表は、SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent に基づくセカンダリ レプリカによる接続の処理方法を示しています。

ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
Default
接続失敗 接続失敗 接続成功
読み取り成功
書き込み失敗
ApplicationIntent=ReadOnly 接続失敗 接続成功 接続成功

上の表に示した既定の動作は、SQL Server 2019 (15.x) より前のバージョンの SQL Server と同じです。

PRIMARY_ROLE(READ_WRITE_ROUTING_URL) が設定されている

読み取り/書き込み接続のリダイレクトを設定すると、レプリカによる接続要求の処理方法が変わります。 接続動作は、引き続き SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent の設定によって決まります。 次の表は、READ_WRITE_ROUTING が設定されたセカンダリ レプリカによる SECONDARY_ROLE (ALLOW CONNECTIONS = )ApplicationIntent に基づく接続の処理方法を示しています。

ApplicationIntent SECONDARY_ROLE (ALLOW CONNECTIONS = NO) SECONDARY_ROLE (ALLOW CONNECTIONS = READ_ONLY) SECONDARY_ROLE (ALLOW CONNECTIONS = ALL)
ApplicationIntent=ReadWrite
Default
接続失敗 接続失敗 プライマリへの接続のルーティング
ApplicationIntent=ReadOnly 接続失敗 接続成功 接続成功

上の表は、プライマリ レプリカに READ_WRITE_ROUTING_URL が設定されているときに、SECONDARY_ROLE (ALLOW CONNECTIONS = ALL) であり、接続に ReadWrite が指定されている場合に、セカンダリ レプリカによって接続がプライマリ レプリカにリダイレクトされることを示しています。

この例では、可用性グループには 3 つのレプリカがあります。

  • COMPUTER01 上のプライマリ レプリカ
  • COMPUTER02 上の同期セカンダリ レプリカ
  • COMPUTER03 上の非同期セカンダリ レプリカ

次の図は、可用性グループを表しています。

Availability group with primary, secondary, and asynchronous secondary

この AG は、次の Transact-SQL スクリプトによって作成されています。 この例では、各レプリカに READ_WRITE_ROUTING_URL が指定されています。

CREATE AVAILABILITY GROUP MyAg   
     WITH ( CLUSTER_TYPE =  NONE )  
   FOR   
     DATABASE  [<Database1>]   
   REPLICA ON   
      'COMPUTER01' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER01.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL,  
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER02', 'COMPUTER03'),
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER01.<domain>.<tld>:1433' ),   
         SESSION_TIMEOUT = 10  
         ),   
      'COMPUTER02' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER02.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL, 
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),  
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER03'),  
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER02.<domain>.<tld>:1433' ),
         SESSION_TIMEOUT = 10  
         ),   
      'COMPUTER03' WITH   
         (  
         ENDPOINT_URL = 'TCP://COMPUTER03.<domain>.<tld>:5022',  
         AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,  
         FAILOVER_MODE = MANUAL,  
         SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL,   
            READ_ONLY_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),  
         PRIMARY_ROLE (ALLOW_CONNECTIONS = READ_WRITE,   
            READ_ONLY_ROUTING_LIST = ('COMPUTER01', 'COMPUTER02'),  
            READ_WRITE_ROUTING_URL = 'TCP://COMPUTER03.<domain>.<tld>:1433' ),
         SESSION_TIMEOUT = 10  
         );
GO  
  • <domain>.<tld>
    • 完全修飾ドメイン名のドメインと最上位ドメイン。 たとえば、「 corporation.com 」のように入力します。

接続動作

次の図では、クライアント アプリケーションが ApplicationIntent=ReadWrite で COMPUTER02 に接続します。 この接続は、プライマリ レプリカにリダイレクトされます。

Connection to computer 2 is re-directed to the primary replica

セカンダリ レプリカでは、読み取り/書き込み呼び出しがプライマリ レプリカにリダイレクトされます。 どちらのレプリカへの読み取り/書き込み接続も、プライマリ レプリカにリダイレクトされます。

次の図では、プライマリ レプリカが手動で COMPUTER02 にフェールオーバーされています。 クライアント アプリケーションは、ApplicationIntent=ReadWrite で COMPUTER01 に接続します。 この接続は、プライマリ レプリカにリダイレクトされます。

Connection redirected to new primary replica on computer2

参照

Always On 可用性グループの概要 (SQL Server)

可用性レプリカに対するクライアント接続アクセスについて (SQL Server)

可用性グループ リスナー、クライアント接続、およびアプリケーションのフェールオーバー (SQL Server)