次要到主要複本讀取/寫入連線重新導向 (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 上的非同步次要複本
下圖代表可用性群組。
下列 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。 連線會重新導向至主要複本。
次要複本會將讀取/寫入呼叫重新導向至主要複本。 與任一複本的讀取/寫入連線將會重新導向至主要複本。
在下圖中,已將主要複本手動容錯移轉至 COMPUTER02。 用戶端應用程式會使用 ApplicationIntent=ReadWrite
連線至 COMPUTER01。 連線會重新導向至主要複本。