當你的應用程式必須在伺服器故障轉移中存活時,請連接到穩定的服務端點,而不是特定的副本。 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 的連線都一律嚴格依序嘗試位址。
故障後重新連線
故障轉移可能會中斷現有連線。 捨棄失敗的連線,並對該服務端點建立新的連線。 連線恢復與重試功能有其限制;它們不會自動重播中斷的商業操作。
- 區分短暫的連線錯誤與無效憑證、拒絕權限或憑證失敗。
- 在受限的延遲與整體時間限制下重試建立連線。
- 只有在能確定失敗操作是否已提交,或該操作設計為冪等式時,才會重試失敗操作。
- 重建屬於遺失會話的交易與會話狀態。
提交後遺失的回應可能讓用戶端不確定寫入是否成功。 在沒有重複保護的情況下重試該寫入,可能會使其執行兩次。 請參見可配置重試邏輯與 SQL Server 連線池。
從資料庫鏡像升級至多子網路叢集
資料庫鏡像已被淘汰。
Failover Partner屬於資料庫鏡像;它不是 AG 的次要位址,也不是 Azure 故障轉移群組設定。
將鏡像資料庫遷移到 AG 時:
- 在伺服器上配置並驗證 AG 監聽器與資料庫。
- 以監聽器取代舊伺服器名稱。
- 移除
Failover Partner。 - 設定
MultiSubnetFailover=true並指定 AG 資料庫。 - 在部署變更前,先演練容錯移轉與重試行為。
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 資料庫的限制。