次要到主要複本讀取/寫入連線重新導向 (Always On 可用性群組)

適用於: SQL Server 2019 (15.x) 和更新版本

SQL Server 2019 (15.x) 為 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 時將連線重新導向至主要複本。

還原為預設路由行為

從 SQL Server 2025(17.x)開始,你可以指定 NONE 或 READ_WRITE_ROUTING_URLREAD_ONLY_ROUTING_URL 作為目的,還原可用性副本的指定路由,並根據預設行為路由流量。 想了解更多,請複習 ALTER AVAILABILITY GROUP Transact-SQL 指令。

範例

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

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

下圖代表可用性群組。

具有主要複本、次要複本和非同步次要複本的可用性群組

下列 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>
    • 完整網域名稱(FQDN)的網域和頂級網域。 例如: corporation.com 。

連線行為

在下圖中,用戶端應用程式會使用 ApplicationIntent=ReadWrite 連線至 COMPUTER02。 連線會被重新導向到主要複本。

到電腦 2 的連線會重新導向至主要複本

次要複本會將讀取/寫入呼叫重新導向至主要複本。 與任一複本的讀取/寫入連線將會重新導向至主要複本。

在下圖中,已將主要複本手動容錯移轉至 COMPUTER02。 用戶端應用程式會使用 ApplicationIntent=ReadWrite 連線至 COMPUTER01。 連線會被重新導向到主要複本。

連線已重新導向至 computer2 上的新主要複本