SqlClient 對高可用性、災害復原的支援

下載 ADO.NET

本文說明 Microsoft SqlClient Data Provider 對 SQL Server 高可用性與災難復原的支援,包括 Always On 可用性群組。 欲了解更多資訊,請參閱 Always On 可用性群組

你現在可以在連線屬性中指定高可用性與災難復原(HADR)可用性群組(AG)或故障轉移叢集實例(FCI)的可用性群組監聽器。 如果 SqlClient 應用程式連接到一個故障轉移的 Always On 資料庫,原始連線會中斷,應用程式必須開啟新的連線才能在故障轉移後繼續工作。

如果你沒有連接到可用性群組監聽器或 FCI,且同一主機名稱有多個 IP 位址,SqlClient 會依序遍歷所有與 DNS 條目的相關的 IP 位址。 如果 DNS 伺服器回傳的第一個 IP 位址沒有綁定在任何網路介面卡(NIC)上,這個過程可能會很耗時。 當你連接到 AG 監聽器或 FCI 時,SqlClient 會嘗試建立與所有 IP 位址的平行連線。 如果連接嘗試成功,驅動程式就會捨棄任何暫止的連接嘗試。

注意

增加連接逾時並實作連接重試邏輯可提高應用程式連接到可用性群組的機率。 此外,由於連線可能會因容錯移轉而失敗,因此您應實作連線重試邏輯,針對失敗的連線持續重試,直到重新建立連線為止。

Microsoft SqlClient Data Provider for SQL Server 支援下列連線屬性:

  • ApplicationIntent

  • MultiSubnetFailover

您可以透過下列方式,以程式設計方式修改這些連接字串關鍵字:

使用 MultiSubnetFailover 連線

連接 Microsoft SQL 家族 TCP 端點時,務必指定MultiSubnetFailover=True。 此設定適用於可用性群組監聽器、故障轉移叢集實例,以及多 IP 端點,如 Azure SQL Database、Azure SQL 受控執行個體 以及 Microsoft Fabric 中的 SQL 資料庫。

當連接字串中的伺服器名稱解析為多個 IP 位址時,MultiSubnetFailover=True 會讓 SqlClient 同時對所有這些位址開啟連線,並使用第一個回應的位址。 如果沒有它,SqlClient 會逐一嘗試各個位址。 未回應的位址會使作業停滯,直到作業系統的 TCP 連線逾時到期,這可能會在 SqlClient 連線到會回應的位址之前耗盡 Connect Timeout。 在故障轉移後,SqlClient 首先嘗試的位址可能已不再提供該資料庫的服務,因此原本若連線到另一個位址即可成功的連線,反而會因逾時而失敗。

MultiSubnetFailover=True 改變客戶端找到服務資料庫副本的速度。 這不會改變伺服器故障切換所需的時間。 開啟此設定後,SqlClient 也會比作業系統預設的 TCP 重傳間隔更快重試 TCP 連線嘗試,這加快了單子網及多子網可用性群組及故障轉移叢集實例的重新連線速度。

MultiSubnetFailover=True 對單IP目標是安全的。 當 DNS 解析到單一位址時,SqlClient 會嘗試一次連線,因此設定在不需要時不會產生任何費用。

如需 SqlClient 中連接字串關鍵字的詳細資訊,請參閱 ConnectionString。 如需 .NET Framework 中相關的透明網路 IP 解析 (TNIR) 設定指引,以及排解多 IP DNS 名稱所造成的連線緩慢問題,請參閱 停用透明網路 IP 解析登入前交握逾時時的長時間連線延遲

設定 MultiSubnetFailover時請參考以下指引:

  • 設定 MultiSubnetFailover=True

  • 若要連接到可用性群組,在連接字串中指定可用性群組的可用性群組接聽程式做為伺服器。

  • 當你連接到有名稱的實例時,就不能使用 MultiSubnetFailover

  • 你不能透過 TCP 以外的協定使用 MultiSubnetFailover

  • 連接配置超過 64 個 IP 位址的 SQL Server 實例會導致連線失敗。

  • 你無法將 MultiSubnetFailover 與資料庫鏡像搭配使用。 欲了解更多資訊,請參閱 從資料庫鏡像升級至使用多子網叢集。 所有支援的 SQL Server 版本都已棄用資料庫鏡像。 請改用 Always On 可用性群組。

  • 使用 MultiSubnetFailover 連線屬性之應用程式的行為不受驗證類型影響:SQL Server 驗證、Kerberos 驗證或 Windows 驗證。

  • 提高 Connect Timeout 的值來配合容錯移轉時間,並減少應用程式連線重試次數。

  • 不支援分散式交易。

如果唯讀路由不在作用中,在下列狀況下,連線到次要複本位置將會失敗:

  • 如果未將次要複本位置設定為接受連線。

  • 如果應用程式使用 ApplicationIntent=ReadWrite(如下所述),且次要複本位置已設定為唯讀存取。

SqlDependency 不支援於唯讀次要複本。

如果設定主要複本拒絕唯讀工作負載,而且連接字串包含 ApplicationIntent=ReadOnly,則連接會失敗。

從資料庫鏡像升級到使用多重子網路叢集

如果連接字串中有 ArgumentExceptionMultiSubnetFailover 連線關鍵字,或者如果使用了 Failover Partner 和 TCP 以外的通訊協定,則將會發生連線錯誤 (MultiSubnetFailover=True)。 如果使用 SqlException 而且 SQL Server 傳回容錯移轉夥伴回應,指出其是資料庫鏡像配對的一部分,也會發生錯誤 (MultiSubnetFailover)。

如果您將目前使用資料庫鏡像的 SqlClient 應用程式升級為多重子網路案例,應該移除 Failover Partner 連線屬性,並以設為 MultiSubnetFailoverTrue 加以取代,然後以可用性群組接聽程式取代連接字串中的伺服器名稱。 如果連接字串使用 Failover PartnerMultiSubnetFailover=True,驅動程式會發生錯誤。 不過,如果連接字串使用 Failover PartnerMultiSubnetFailover=False (或 ApplicationIntent=ReadWrite),應用程式就會使用資料庫鏡像。

如果您在可用性群組中的主要複本上使用資料庫鏡像,且在連線到主要複本而非可用性群組接聽程式的連線字串中設定了 MultiSubnetFailover=True,驅動程式就會傳回錯誤。

指定應用程式意圖

當你設定 ApplicationIntent=ReadOnly時,當連接啟用 Always On 的資料庫時,客戶端會請求讀取工作負載。 伺服器會在連線時及資料庫 USE 語句中強制執行意圖,但僅限於啟用 Always On 的資料庫。

ApplicationIntent 關鍵字不適用於舊版唯讀資料庫。

資料庫可以允許或禁止在目標 Always On 資料庫上進行讀取工作負載。 (這是使用 ALLOW_CONNECTIONSPRIMARY_ROLE Transact-SQL 語句的 SECONDARY_ROLE 子句來完成的。)

ApplicationIntent 關鍵字用於啟用唯讀路由。

唯讀路由

唯讀路由是可確保資料庫的唯讀複本之可用性的功能。 若要啟用唯讀路由:

  • 您必須連接到 AlwaysOn 可用性群組的可用性群組接聽程式。

  • ApplicationIntent 連接字串關鍵字必須設為 ReadOnly

  • 可用性群組必須由資料庫管理員設定為啟用唯讀路由。

使用唯讀路由的多個連線不一定都會連線到同一個唯讀複本。 資料庫同步處理的變更或伺服器路由組態的變更,可能會導致用戶端連接至不同的唯讀複本。 若要確保所有唯讀請求都連線到同一個唯讀複本,請勿將可用性群組接聽器指定給 Data Source 連接字串關鍵字。 請改為指定唯讀執行個體的名稱。

唯讀路由可能比連接到主要複本的時間更長,因為唯讀路由先連接到主要複本,再尋找最佳的可讀取次要複本。 因此,您應該延長登入逾時時間。