Sql-Server

用於 readintent=true 的 SQL 伺服器 AlwaysOn 備用選項

  • March 10, 2022

我知道應用程序需要某些(最新)版本的 ODBC 驅動程序來連接 AlwaysOn SQL 實例副本並使用選項“applicationIntent = readonly”

現在我的問題是,如果某些應用程序沒有這些最新的驅動程序,並且我(DBA)想要阻止此應用程序與主應用程序的只讀連接,並希望此應用程序的只讀請求始終路由到 AlwaysOn 輔助副本,那麼這怎麼能沒有“applicationIntent = readonly”選項實現?有沒有人有任何方便的腳本來實現這一點?

我(DBA)想要阻止此應用程序與主伺服器的只讀連接,並希望此應用程序的只讀請求始終路由到 AlwaysOn 輔助副本,那麼如果沒有“applicationIntent = readonly”選項,如何實現?

簡單的解決方案是將應用程序配置為直接連接到託管次要副本的主機。缺點是如果輔助節點離線,應用程序將無法連接。

或者,如果您的 SQL 實例是配置為偵聽所有 IP 的獨立實例(預設),您可以在新應用程序(集群資源組)中向集群添加額外的客戶端訪問點(即網路名稱和 IP 地址) ),並配置組的首選所有者和/或客戶端訪問點的可能所有者,以控制新客戶端訪問點在哪個節點上執行。應用程序將被配置為連接到網路名稱,如果首選所有者節點離線,該網路名稱可能會故障轉移到某個節點。

正如您已經發現的那樣,ApplicationIntent=READONLY;當涉及到連接字元串時,它不是一個標準化的關鍵字。大多數驅動程序不支持它,通常,您要麼顯式連接到只讀副本節點,要麼只指向主節點並放棄自己不使用只讀副本。不過還有另一種選擇,一旦到位,它將為客戶端連接提供一個只讀位置,該位置指向您選擇的 AG 中的一個節點,而不需要任何特殊的連接關鍵字。

創建只讀偵聽器(非官方術語)

可用性組的一個關鍵組件是您與該可用性組關聯的任何偵聽器都必須連接到主節點。不過,最棒的是,無論版本如何,每個集群都可以擁​​有多個可用性組。很簡單,只讀偵聽器是一個新的空可用性組,具有新的偵聽器名稱,指向您的只讀副本。

確保在開始之前保留一個新的 IP 地址,但手頭有一個新的 IP 地址,創建一個新的可用性組,就像您通常使用一個新的空白數據庫(我在創建所述 AG 後刪除)一樣。使用新 IP 地址創建您的只讀偵聽器,並將此新偵聽器故障轉移到您的只讀副本。

設置完成後,您連接到使用者數據庫的主節點,您將看到列為*(Secondary)*的輔助可用性組:

在此處輸入圖像描述

上圖顯示的是託管使用者數據庫的我們的 AG SQL-P02(在螢幕截圖中是主動連接的伺服器SSMS)。這是我想連接到我的主節點並執行讀/寫操作時使用的連接。第二個 AGSQL-P02-RO是我設置的新 AG。沒有與此 AG 關聯的數據庫,但我確實創建了一個新的 Listener,並且當 AGSQL-P02-RO的主副本與 AG 中的只讀副本相同時SQL-P02,它在功能上變成了Read-Only Listener。所以基本上,對於我想指向只讀副本的任何客戶端,我指定SQL-P02-RO為我的伺服器,而不必找到使用ApplicationIntent關鍵字的驅動程序。

是的,這有點笨拙,但這裡的好處是您可以將您希望視為“只讀”的任何連接指向 AG 中的任何副本。大多數情況下,您會選擇只讀副本作為目標,但在修補、故障轉移等情況下,這可以很容易地指向您的主副本,這樣您就可以最大限度地減少只讀連接的停機時間好。

我在目前大張旗鼓的許多伺服器上使用這種方法。無論出於何種原因,我們公司到處都是使用古老的 jTDS 驅動程序的應用程序,這些驅動程序絕對不支持該ApplicationIntent關鍵字,但是我們需要指定只讀連接並在每次發生故障轉移時手動調整連接字元串是不可行的方法.

如果您對此有任何疑問,請發表評論,我會盡力回答,但希望這有助於證明您可以為 AG 指定只讀連接,儘管方式並不像使用ApplicationIntent關鍵字那樣簡單在連接字元串中。

引用自:https://dba.stackexchange.com/questions/274080