負載均衡讀取 SQL Server 2016 AG
我正在嘗試使用可用性組和只讀路由來平衡兩個 SQL Server 2016 Enterprise Edition 實例(主要和次要)之間的讀取流量。
這是我目前的設置:
- 伺服器位於 AWS 中的兩個不同 AZ
- 伺服器位於沒有共享儲存的故障轉移集群中
- AG 在兩個實例上都啟用
- 可用性組中的數據庫將“可讀輔助”選項設置為是
- 我已經在目前主實例和輔助實例上設置了具有隻讀路由的 AG
- 在我的應用程序連接字元串中添加只讀開關允許我將流量路由到輔助
有沒有辦法讓 AG 偵聽器負載平衡主要和次要之間的只讀流量?
在 SQL Server 2016+ 上,您可以對只讀連接進行負載平衡。(注意:這不適用於 SQL 2012 或 2014 AG。)
完整的文件可在此處獲得。
本質上,在配置只讀路由列表時,您將使用如下語法:
ALTER AVAILABILITY GROUP ag MODIFY REPLICA ON N'SQL16A' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('SQL16B', 'SQL16C'), 'SQL16A')));
這將使您的第一個路由選項 SQL 在 SQL16B 和 SQL16C 之間實現負載平衡。第二個路由選項是將只讀連接發送到 SQL16A。如果伺服器 B 處於離線狀態,那麼只有一台伺服器退出輪換 - 所以所有隻讀連接將繼續轉到伺服器 C。
負載平衡以循環方式完成,因此將路由連接,A、B、A、B、A、B 等。負載平衡不考慮現有的連接數量、現有的伺服器負載或任何花哨的東西。
如果我正確理解您的問題,您希望在主副本和輔助副本之間進行負載平衡,以實現具有隻讀意圖的連接。
預設情況下,帶有
ApplicationIntent=ReadOnly
參數的連接被路由到可讀的輔助副本。將連接路由到可讀輔助副本的方式在只讀路由列表中根據其優先級進行定義。
我已經根據上述要求更改了我的 AG 路由列表,它工作正常:
USE [master] GO ALTER AVAILABILITY GROUP [TestAG] MODIFY REPLICA ON N'NODE1' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = (N'NODE2',N'NODE1'))) GO
NODE1是我的主副本,NODE2是輔助副本。連接字元串包含以下連接參數:
ApplicationIntent=ReadOnly;Initial Catalog = TestDB;
**注意:**預設情況下,NODE2 和 NODE1 之間的連接不是負載平衡的,即使您在只讀路由列表上指定負載平衡也是如此。這只有在 NODE2 關閉時才有效,它會尋找下一個具有最高優先級的輔助副本。
因此,由於它是基於路由列表工作的,如果第一個節點不可用,連接將被路由到下一個節點。只要NODE2啟動並執行,即使在路由列表中配置為負載均衡器格式,輔助節點和主節點之間的負載均衡也不起作用。
要在 NODE2 和 NODE3(都是可讀的輔助副本)之間進行負載平衡,請按如下方式更改 AG:
USE [master] GO ALTER AVAILABILITY GROUP [TestAG] MODIFY REPLICA ON N'NODE1' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = (N'NODE2',N'NODE3'), NODE1)) GO
在這種情況下,它將在NODE2 和 NODE3之間進行負載平衡,如果兩個節點都不可用,它將路由到NODE1 (
primary replica
)。我希望這對您有所幫助,請查看我的頁面以了解只讀路由。