使用 SqlClient 進行高可用性與災難復原

下載 ADO.NET

當你的應用程式必須在伺服器故障轉移中存活時,請連接到穩定的服務端點,而不是特定的副本。 Microsoft.Data.SqlClient 可以加速連線嘗試並要求唯讀路由,但它無法讓進行中的交易在連線中斷後仍能持續。

SQL Server 部署 要使用的端點
Always On 可用性群組(AG)。 AG 監聽器,一種可將連線導向適當副本的網路名稱。
故障轉移叢集實例(FCI)。 叢集 SQL Server 實例的虛擬伺服器名稱。
舊版資料庫鏡像。 主體 和 Failover Partner,並指定鏡像資料庫。

關於伺服器架構,請參見 Always On 可用性群組。

使用 MultiSubnetFailover 進行連線

為支援的 Microsoft SQL 家族傳輸控制協定(TCP)端點設置MultiSubnetFailover=true,包括 AG 監聽器、FCI、Azure SQL Database、Azure SQL 受控執行個體 以及 Microsoft Fabric 中的 SQL 資料庫。 使用主機名稱和埠碼,而非命名實例發現。

Server=tcp:<listener>,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;MultiSubnetFailover=true;

更換你環境中的認證設定。 憑證必須驗證用戶端所使用的名稱;請參見 加密與憑證驗證。

當網域名稱系統(DNS)回傳多個網際網路協定(IP)位址時,MultiSubnetFailover=true 會平行嘗試連線,並使用第一個成功建立的連線。 此功能減少當部分地址無法聯繫或不再服務資料庫時的延遲。 它同時加速了 TCP 重試。 對於單一 IP 端點,僅嘗試一個位址。

這個設定並不會縮短伺服器的故障轉移或資料庫恢復時間。 針對您服務的可用性需求,採用適當的 Connect Timeout 與具上限的應用程式重試原則。

連線選項相容性

Option 預設 行為與限制
MultiSubnetFailover false,除非啟用全程序覆寫。 並行 TCP 嘗試。 不支援命名實例發現、非 TCP 協定、資料庫鏡像,或超過 64 個伺服器 IP 位址。
TransparentNetworkIPResolution true在 .NET 框架上,並可自動端點處理與認證。 先嘗試初始位址,再平行嘗試其他位址。 僅限 .NET 框架;已過時。 現代 .NET 拒絕了關鍵字。 MultiSubnetFailover=true 具有優先權。
Failover Partner 空白。 僅支援舊版資料庫鏡像。 需要 Initial Catalog 或 Database。 與 MultiSubnetFailover=true 和 ApplicationIntent=ReadOnly 不相容。
ApplicationIntent ReadWrite。 將工作負載意圖傳送給伺服器。 唯讀路由需要伺服器設定,且不適用於任意的唯讀資料庫。

在連線字串中,MultiSubnetFailover 的預設值仍然是 false。 程序範圍的 AppContext 切換開關可為所有連線啟用此功能。 當應用程式同時使用不相容的目標(如 LocalDB 或資料庫鏡像)時,偏好明確的連線設定。 請參閱 AppContext 切換參數。

透明網路 IP 解析(TNIR)自 SqlClient 7.1 起已不再使用。 不要把 TNIR 關鍵字複製到現代的 .NET 連線字串裡。 在 .NET 框架中,明確的 TNIR 設定可以覆蓋驅動程式對某些端點和認證模式的自動處理。 不要假設每個未使用 MultiSubnetFailover 的連線都一律嚴格依序嘗試位址。

故障後重新連線

故障轉移可能會中斷現有連線。 捨棄失敗的連線,並對該服務端點建立新的連線。 連線恢復與重試功能有其限制;它們不會自動重播中斷的商業操作。

  1. 區分短暫的連線錯誤與無效憑證、拒絕權限或憑證失敗。
  2. 在受限的延遲與整體時間限制下重試建立連線。
  3. 只有在能確定失敗操作是否已提交,或該操作設計為冪等式時,才會重試失敗操作。
  4. 重建屬於遺失會話的交易與會話狀態。

提交後遺失的回應可能讓用戶端不確定寫入是否成功。 在沒有重複保護的情況下重試該寫入,可能會使其執行兩次。 請參見可配置重試邏輯與 SQL Server 連線池。

從資料庫鏡像升級至多子網路叢集

資料庫鏡像已被淘汰。 Failover Partner屬於資料庫鏡像;它不是 AG 的次要位址,也不是 Azure 故障轉移群組設定。

將鏡像資料庫遷移到 AG 時:

  1. 在伺服器上配置並驗證 AG 監聽器與資料庫。
  2. 以監聽器取代舊伺服器名稱。
  3. 移除 Failover Partner。
  4. 設定 MultiSubnetFailover=true 並指定 AG 資料庫。
  5. 在部署變更前,先演練容錯移轉與重試行為。

SqlClient 拒絕將 Failover Partner 與 MultiSubnetFailover=true 結合使用。 僅設定 MultiSubnetFailover=false 並不會完成鏡像設定;仍然需要有效的鏡像配對和資料庫。 由伺服器提供的鏡像夥伴也與多子網路容錯移轉不相容。

指定應用程式意圖

設定 ApplicationIntent=ReadOnly 在 AG 資料庫上請求讀取工作負載:

Server=tcp:<listener>,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;MultiSubnetFailover=true;ApplicationIntent=ReadOnly;

AG的主連接與次要連線政策決定是否接受所請求的工作負載。 設定為拒絕唯讀工作負載的主裝置可以拒絕此連線。 設定為唯讀存取的次級裝置會拒絕讀寫連線。

ApplicationIntent 不會將資料庫變成唯讀、取代權限,或路由一般唯讀資料庫。 當應用程式必須無法寫入時,授予唯讀權限。

唯讀路由

對於 AG 只讀路由,請設定以下所有設定:

  • 連線到 AG 接聽程式。
  • 將 Database 設定為 AG 中的資料庫。
  • 設定 ApplicationIntent=ReadOnly。
  • 設定一個可讀的次要節點及其唯讀路由URL。
  • 設定主要副本的唯讀路由清單。

用戶端首先透過監聽器聯絡主節點,然後連接到路由目標。 允許兩個連線階段的網路存取及有效的憑證名稱。 路由可能會增加連線時間。

隨著路由配置與可用性變動,分開的開啟可能會到達不同的可讀複本。 合併開啟可以重複使用現有連線,而不必重複執行路由。 直接連線到次要執行個體,就會選用該執行個體,但會略過以接聽程式為基礎的路由及其容錯移轉行為。

SqlDependency 不支援唯讀的次要副本。 對於分散式交易等功能,請分別檢視 SQL Server 版本和部署需求;僅靠 MultiSubnetFailover 並無法判定是否支援這些功能。

Azure SQL 與 Microsoft Fabric

對於 Azure SQL,請使用服務已設定的端點,包括適用時的故障轉移群組監聽器。 請勿將 Failover Partner 用於 Azure SQL 故障轉移群組。 服務管理故障轉移與自行設定 SQL Server AG 不同。

針對 Microsoft Fabric 中的 SQL 資料庫:

  • 使用其資料庫連線字串,搭配 Microsoft Entra 驗證與 MultiSubnetFailover=true。
  • 使用獨立的 SQL 分析端點來處理其唯讀分析工作負載。 不要假設 ApplicationIntent=ReadOnly 是重定向可寫資料庫端點。
  • 不要為資料庫服務設定Failover Partner或使用 SQL Server AG 路由。
  • 考慮目前Default的連線政策:允許 TCP 埠 1433 轉至閘道器,並允許 11000 至 11999 埠接至 Azure SQL 區域。

Fabric 提供自動區域備援。 目前 Fabric 的 SQL 資料庫不支援主動式地理複製、故障轉移群組和地理還原功能。 Microsoft Distributed Transaction Coordinator、彈性資料庫用戶端函式庫以及彈性查詢也未被支援。 請參閱 在 Fabric 中連線到 SQL 資料庫 及 Fabric 中 SQL 資料庫的限制。