連線到 Always On 可用性群組監聽器

適用於:SQL Server

本文將教導您如何連線到 SQL Server 的 Always On 可用性群組接聽程式 。 可用性群組接聽程式是虛擬網路名稱,用戶端會用來連線到裝載於可用性群組中的資料庫。 無論目前是由哪個可用性複本託管主要資料庫,偵聽器都會為客戶端應用程式提供一致的連接端點。 接聽程式也支援唯讀路徑和自動容錯移轉。

設定接聽程式之後,請更新您的 連接字串 以指向接聽程式,讓應用程式流量自動路由傳送至預期的複本,而不需要在每個容錯移轉之後手動更新 連接字串。

連線到主要複本

在連接字串中指定可用性群組接聽程式的 DNS 名稱,以連線到主要複本進行讀寫存取。

例如,若要在 SQL Server Management Studio 中透過接聽程式連線到主要複本,請在 [伺服器名稱] 欄位中輸入接聽程式 DNS 名稱:

在 SSMS 中連線到接聽程式的螢幕擷取畫面。

在故障移轉期間,當主要副本發生變更時,現有的與偵聽器的連線會被中斷,且新連線會路由至新的主要副本。

ADO.NET 提供者的基本連接字串範例(Microsoft.Data.SqlClientSystem.Data.SqlClient):

Server=tcp: AGListener,1433;Database=MyDB;Integrated Security=SSPI

注意

Microsoft.Data.SqlClient 是新應用程式開發的推薦 ADO.NET 資料提供者。 它支援與 System.Data.SqlClient相同的連接字串關鍵字。 欲了解更多資訊,請參閱 Microsoft.Data.SqlClient 命名空間介紹

您可執行下列 Transact-SQL (T-SQL) 命令,以確認目前透過接聽程式連線到哪個複本:

SELECT @@SERVERNAME

例如,當 SQLVM1 是主要副本時:

檢查複本連線的螢幕擷取畫面。

您仍然可以使用主要或次要複本的執行個體名稱來直接連線到 SQL Server 的執行個體,而不是使用可用性群組接聽程式。 不過,您將因此失去新連線自動路由至新的目前主要複本(primary replica)的優點。 此外,您將失去唯讀路由的優點,其中以 read-intent 指定的連線會自動路由至可讀取次要複本。

連線至唯讀複本

「唯讀路由」 是指將連入接聽程式連線自動路由至設定為允許唯讀工作負載的可讀取次要複本。

如果下列條件成立,則會將連線自動路由至唯讀複本:

  • 至少一個次要複本設定為唯讀存取,且每個唯讀次要複本和主要複本都設定為支援唯讀路由

  • 連接字串會參考可用性群組中的相關資料庫。 另一個替代方案是將連線使用的登入設置為該資料庫的預設資料庫。 如需詳細資訊,請參閱演算法如何使用唯讀路由一文。

  • 連接字串參考可用性群組接聽程式,而且內送連接的應用程式意圖設定為唯讀,例如,透過在 ODBC 或 OLEDB 連接字串或連接屬性 (attribute) 或屬性 (property) 中使用 Application Intent=ReadOnly 關鍵字。

應用程式意圖屬性會儲存在登入時用戶端的會話中。 SQL Server 實例會處理意圖,並根據可用性群組的設定以及次要副本中目標資料庫的當前讀寫狀態來決定該怎麼做。

例如,若要使用 SQL Server Management Studio 連接唯讀副本,請在「連接伺服器」對話框中選擇「選項」,選擇「附加連線參數」標籤,然後在文字框中指定ApplicationIntent=ReadOnly

SSMS 中只讀連線的螢幕擷取畫面。

一個 ADO.NET 提供者(Microsoft.Data.SqlClientSystem.Data.SqlClient)用來指定唯讀應用程式意圖的連接字串範例:

Server=tcp:AGListener;Database=AdventureWorks;Integrated Security=SSPI;ApplicationIntent=ReadOnly

如需取得更多相關資訊,請參閱設定 SQL Server 上可用性複本的唯讀存取

無預設連接埠

建立接聽程式時,您可指定接聽程式使用的連接埠。 如果連接埠是預設連接埠 1433,則當連線到接聽程式時,就不需要指定連接埠號碼。 不過,如果連接埠不是 1433,則必須以 listenername,port 格式在連接字串中指定連接埠,例如:

使用非預設埠連線的螢幕擷取畫面。

一個 ADO.NET 提供者Microsoft.Data.SqlClient (或 System.Data.SqlClient)的連線字串範例,該串指定了監聽者的非預設埠口:

Server=tcp:AGListener,1445;Database=AdventureWorks;Integrated Security=SSPI

略過監聽器

雖然可用性群組接聽程式支援容錯移轉重新導向和唯讀路由,但用戶端連接不一定要使用它們。 用戶端連接也可以直接參考 SQL Server 執行個體,而不連接到可用性群組接聽程式。

對 SQL Server 執行個體而言,連線是使用可用性群組聆聽程式還是使用其他執行個體端點來登入是無關緊要的。 SQL Server 實例會驗證目標資料庫的狀態,並根據可用性群組的設定及實例資料庫的當前狀態,決定是否允許連接。 例如,如果用戶端應用程式直接連線到 SQL Server 執行個體的通訊埠,並連線到裝載於可用性群組的目標資料庫,且目標資料庫處於主要狀態並已上線,則連線就會成功。 如果目標資料庫離線或處於過渡狀態,則與資料庫的連線會失敗。

另外,從資料庫鏡像移轉至 Always On 可用性群組時,只要僅一個次要複本存在且不允許使用者連線,應用程式就可以指定資料庫鏡像連接字串。

資料庫鏡像連接字串

如果可用性群組只擁有一個次要複本,並且已針對次要複本設定 ALLOW_CONNECTIONS = READ_ONLY 或 ALLOW_CONNECTIONS = NONE,則用戶端可以使用資料庫鏡像連接字串連接至主要複本。 從資料庫鏡像將現有的應用程式移轉到可用性群組時,這種方法會很實用,前提是您要將可用性群組限制為只能有兩個可用性複本 (一個主要複本和一個次要複本)。 如果您加入其他次要複本,您需要為可用性群組建立可用性群組接聽程式,並更新您的應用程式使用可用性群組接聽程式 DNS 名稱。

當使用資料庫鏡像連接字串時,用戶端可以使用 SQL Server Native Client 或 .NET Framework Data Provider for SQL Server。 用戶端提供的連接字串至少必須提供一個伺服器執行個體名稱,也就是 「初始夥伴名稱」 ,以識別一開始裝載您打算連接之可用性複本的伺服器執行個體。 此連接字串也可以選擇性地提供另一個伺服器執行個體的名稱,也就是 「容錯移轉夥伴名稱」 (Failover Partner Name),以識別一開始將次要複本裝載為容錯移轉夥伴名稱的伺服器執行個體。

如需資料庫鏡像連接字串的詳細資訊,請參閱將用戶端連線至資料庫鏡像會話 (SQL Server)

多個子網路的容錯切換

若所用的用戶端程式庫可在連接字串中使用 MultiSubnetFailover 連線選項,即可根據所正在使用提供者的語法,將 MultiSubnetFailover 設定為 "True" 或 "Yes",以最佳化可用性群組容錯移轉至不同的子網路。

注意

對於可用性群組接聽程式和 SQL Server 容錯移轉叢集執行個體名稱的單一和多重子網路連接,建議使用此設定。 啟用此選項會增加額外的最佳化,甚至在單一子網路案例也一樣。

MultiSubnetFailover 連線選項只適用於 TCP 網路通訊協定,而且只在連線到可用性群組接聽程式,以及用於連線到 SQL Server 的任何虛擬網路名稱時才受支援。

啟用多子網故障轉移的 ADO.NET 提供者(Microsoft.Data.SqlClientSystem.Data.SqlClient)連線字串範例如下:

Server=tcp:AGListener,1433;Database=AdventureWorks;Integrated Security=SSPI; MultiSubnetFailover=True

MultiSubnetFailover 連接選項應該設定為 True ,即使可用性群組只跨越單一子網路也一樣。 此選項可讓您預先設定新客戶端,支援未來跨越子網路,無需更改客戶端連線字串,並優化單一子網路故障轉移的效能。 雖然 MultiSubnetFailover 連接選項並非必需,但它提供了更快的子網容錯移轉優勢。 用戶端驅動程式嘗試為每個與可用性群組關聯的 IP 位址開啟 TCP 套接字。 客戶端驅動程式會等待第一個 IP 成功回應,一旦成功,就會使用該 IP 進行連線。

監聽器與 TLS/SSL 憑證

當連接可用性群組監聽器時,若參與的 SQL Server 實例使用 TLS/SSL 憑證搭配會話加密,連接的用戶端驅動程式需支援 TLS/SSL 憑證中的主體替代名稱以強制加密。

您必須針對容錯移轉叢集中的每個參與伺服器節點來設定 X.509 憑證,並在憑證的主體替代名稱中設定所有可用性群組接聽程式清單。

憑證值的格式為:

CN = Server.FQDN
SAN = Server.FQDN,Listener1.FQDN,Listener2.FQDN

例如,您有下列值:

Servername: Win2019
Instance: SQL2019
AG: AG2019
Listener: Listener2019
Domain: contoso.com  (which is also the FQDN)

針對有單一可用性群組的 WSFC,憑證應有伺服器的完整網域名稱 (FQDN),以及接聽程式的 FQDN:

CN: Win2019.contoso.com
SAN: Win2019.contoso.com, Listener2019.contoso.com

透過這種配置,當你連接到實例()WIN2019\SQL2019或監聽者(Listener2019)時,連線會被加密。

取決於網路設定的方式而定,有一小部分的客戶可能也需要將 NetBIOS 新增至 SAN。 在此情況下,憑證值應該是:

CN: Win2019.contoso.com
SAN: Win2019,Win2019.contoso.com,Listener2019,Listener2019.contoso.com

如果 WSFC 有三個可用性群組接聽程式,例如:Listener1、Listener2、Listener3

則憑證值應該為:

CN: Win2019.contoso.com
SAN: Win2019.contoso.com,Listener1.contoso.com,Listener2.contoso.com,Listener3.contoso.com

接聽程式與 Kerberos (SPN)

網域系統管理員必須在 Active Directory 中設定每個可用性群組接聽程式的伺服器主體名稱 (SPN),以便針對接聽程式的用戶端連線啟用 Kerberos。 註冊 SPN 時,您必須使用託管可用性複本的伺服器實例的服務帳戶。 若要讓 SPN 在所有複本上運作,相同服務帳戶必須用於裝載可用性群組之 WSFC 叢集的所有執行個體。

您可以使用 setspn Windows 命令列工具來設定 SPN。 例如,若要設定 SPN 用於 AG1listener.Adventure-Works.com 可用性群組接聽程式,而此接聽程式裝載於一組 SQL Server 執行個體,這些執行個體都設定為使用 corp\svclogin2 網域帳戶:

setspn -A MSSQLSvc/AG1listener.Adventure-Works.com:1433 corp\svclogin2

如需有關為 SQL Server 手動註冊服務主體名稱 (SPN) 的詳細資訊,請參閱 [註冊 Kerberos 連接的服務主體名稱]