次要到主要複本讀取/寫入連線重新導向 (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_ROLE 必須包含 READ_WRITE_ROUTING_URL
  • 連接字串必須是 ReadWrite,可透過將 ApplicationIntent 定義為 ReadWrite,或不設定 ApplicationIntent 並讓預設值 (ReadWrite) 生效來完成。

設定 READ_WRITE_ROUTING_URL 選項

若要設定讀取/寫入連線重新導向,請在建立 AG 時設定主要複本的 READ_WRITE_ROUTING_URL

在 SQL Server 2019 (15.x) 中,READ_WRITE_ROUTING_URL 已新增至 <add_replica_option> 規格。 請參閱下列主題:

未設定 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
預設
連線失敗 連線失敗 連線成功
讀取成功
寫入失敗
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
預設
連線失敗 連線失敗 與主要的連線路由
ApplicationIntent=ReadOnly 連線失敗 連線成功 連線成功

上表顯示如果主要複本已設定 READ_WRITE_ROUTING_URL,則次要複本會在 SECONDARY_ROLE (ALLOW CONNECTIONS = ALL) 而且連線指定 ReadWrite 時將連線重新導向至主要複本。

範例

在此範例中,可用性群組會有三個複本:

  • COMPUTER01 上的主要複本
  • COMPUTER02 上的同步次要複本
  • COMPUTER03 上的非同步次要複本

下圖代表可用性群組。

Availability group with primary, secondary, and asynchronous secondary

下列 Transact-SQL 指令碼會建立此 AG。 在此範例中,每個複本都會指定 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

另請參閱

AlwaysOn 可用性群組概觀 (SQL Server)

關於可用性複本的用戶端連接存取 (SQL Server)

可用性群組接聽程式、用戶端連線及應用程式容錯移轉 (SQL Server)