共用方式為


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

本文將討論 SqlClient 如何透過 SQL Server 2012 或更新版本中的 Always On 可用性群組 (AG) 和 Always On 容錯移轉叢集執行個體 (FCI) 等 Always On 功能,對高可用性和災害復原提供支援 (在 .NET Framework 4.5 中新增)。

您現在可以在連線屬性中指定可用性群組接聽程式或 FCI 名稱。 如果 SqlClient 應用程式連線至所容錯移轉的資料庫,則原始連線會中斷,而且容錯移轉之後,應用程式必須開啟新的連線才能繼續工作。

如果您未連線至 AG 或 FCI,以及有多個 IP 位址與主機名稱相關聯,則 SqlClient 將會依序逐一查看所有與 DNS 項目相關聯的 IP 位址。 如果 DNS 伺服器所傳回的第一個 IP 位址未繫結至任何網路介面卡 (NIC),這項作業可能會很費時。 連線至 FCI 或可用性群組接聽程式時,SqlClient 會嘗試平行建立對所有 IP 位址的連線。 如果連接嘗試成功,驅動程式就會捨棄任何暫止的連接嘗試。

注意

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

在 .NET Framework 4.5 中,已將下列連線屬性新增至 SqlClient:

  • ApplicationIntent
  • MultiSubnetFailover

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

注意

.NET Framework 4.6.1 版和更新版本不需要將 MultiSubnetFailover 設定為 true。 在 .NET Core 和 .NET 5+ 中則為必要的。

使用 MultiSubnetFailover 進行連接

連線至 FCI 或 AG 接聽程式時,請一律指定 MultiSubnetFailover=TrueMultiSubnetFailover 可讓 SQL Server 2012 或更新版本中的所有 AG 和 FCI 更快速地容錯移轉,並大幅縮短單一和多重子網路 Always On 拓撲的容錯移轉時間。 在多重子網路容錯移轉期間,用戶端會嘗試平行連線。 在子網路容錯移轉期間,用戶端會積極重試 TCP 連線。

MultiSubnetFailover 連線屬性指出,應用程式正在使用 AG 或 FCI,而且 SqlClient 將會嘗試連線至所有 IP 位址,來嘗試連線至主要 SQL Server 執行個體上的資料庫。 指定連接的 MultiSubnetFailover=True 時,用戶端重試 TCP 連接嘗試的速度會比作業系統預設的 TCP 重新傳送間隔更快。 這可在 AG 或 FCI 容錯移轉之後更快速地重新連線,並且同時適用於單一和多重子網路 AG 和 FCI。

如需 SqlClient 中連接字串關鍵字的詳細資訊,請參閱 ConnectionString

連線至 AG 或 FCI 以外的某個項目時,指定 MultiSubnetFailover=True 可能會導致負面效能影響,而且不支援這樣的處理方式。

使用下列指導方針,以使用其中一個 Always On 功能來連線至伺服器:

  • 在連接到單一子網路或多重子網路時,使用 MultiSubnetFailover 連接屬性;這會提高這兩種可用性群組接聽程式的效能。

  • 若要連線至 AG,請在連接字串中將可用性群組的接聽程式指定為伺服器。

  • 連線到設定超過 64 個 IP 位址的 SQL Server 執行個體會導致連線失敗。

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

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

  • 不支援分散式工作階段。

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

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

  • 如果應用程式使用 ApplicationIntent=ReadWrite (下文討論),而且已針對唯讀存取設定次要複本位置。

唯讀的次要複本不支援 SqlDependency

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

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

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

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

如果在 AG 的主要資料庫上使用資料庫鏡像,而且在連線至主要資料庫 (而非可用性群組接聽程式) 的連接字串中使用 MultiSubnetFailover=True,則驅動程式會傳回錯誤。

指定應用程式用途

ApplicationIntent=ReadOnly 時,用戶端會在連接至啟用 AlwaysOn 的資料庫時要求讀取工作負載。 伺服器會在連接時和在 USE 資料庫陳述式期間,只針對啟用 AlwaysOn 的資料庫強制執行此意圖。

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

資料庫可以允許或不允許目標 AlwaysOn 資料庫上的讀取工作負載。 (這會透過 PRIMARY_ROLESECONDARY_ROLE Transact-SQL 陳述式的 ALLOW_CONNECTIONS 子句來完成)。

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

唯讀路由

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

  • 您必須連接到 AlwaysOn 可用性群組的可用性群組接聽程式。
  • ApplicationIntent 連接字串關鍵字必須設為 ReadOnly
  • 可用性群組必須由資料庫管理員設定為啟用唯讀路由。

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

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

另請參閱