Sql-Server

SQL Server 故障轉移基本可用性組的 Entity Framework Core 不起作用

  • May 14, 2021

我在 Windows 故障轉移群集上設置了帶有基本可用性組的 SQL Server Standard 2019。它與 Always On AG 不同,它更像是一個受限版本,其中數據庫操作在主副本上,而輔助副本僅在發生故障轉移時才承擔主要角色。

我有一個 .NET Core 2.1 應用程序,其中有兩個實例在 Windows Server 2019 上的 docker Windows 容器中執行,在不同的帶有 SQL 的 VM 上執行。由於我們的主機沒有啟用嵌套虛擬化,我們只能使用 Windows 容器。它們使用以下連接字元串連接到 SQL:

Server=TCP:172.18.18.11; Database=db; User Id=****; Password=****;
Connection Timeout=120;MultipleActiveResultSets=True;
Failover Partner=TCP:192.168.11.24

不過也有一些弱點。由於我們的虛擬機數量很少,而且我們主要使用容器,因此在使用 AD 時,由於成本和 Windows 容器網路(尤其是 DNS 問題)的一些不良經驗,我們不太關心設置 Active Directory。

我們已成功創建故障轉移群集,但它們位於不同的子網和不同的物理位置 172.18.18.0/24 和 192.168.11.0/24。這導致了分配集群 IP 資源的一些問題,並且由於我們沒有內部 DNS,因此我們只能使用 IP 地址。而且我們不能使用集群域名或使用偵聽器 IP 地址,因為實例也位於不同的子網中。這是我們主機的問題,我們無法真正解決。

所以問題是,SQL 故障轉移有效,但客戶端應用程序不知道更改,儘管連接字元串中有“故障轉移夥伴”。如果發生故障轉移,我們的應用程序會以 SQL 異常響應:

目標數據庫“db”正在參與可用性組,目前無法訪問查詢。數據移動已暫停,或者可用性副本未啟用讀取訪問。要允許對該可用性組中的此數據庫和其他數據庫進行只讀訪問,請啟用對該組中一個或多個輔助可用性副本的讀取訪問權限。有關詳細資訊,請參閱 SQL Server 聯機叢書中的 ALTER AVAILABILITY GROUP 語句。無法繼續執行,因為會話處於終止狀態。目前命令發生嚴重錯誤。結果,如果有的話,應該丟棄。

相反,我希望它將查詢定向到故障轉移合作夥伴。我做了一些研究,顯然在連接字元串中指定了故障轉移夥伴(雖然不確定它是否適用於 BAG 或 Always On)。


我試過這個連接字元串:

Server=TCP:172.18.18.19; Database=db; User Id=****; Password=****;
Connection Timeout=120;MultipleActiveResultSets=True;
Failover Partner=TCP:192.168.11.31

這裡的 IP 是偵聽器 IP 地址,我收到以下消息:

伺服器 TCP:192.168.11.31,數據庫 GWP2 未配置數據庫鏡像。

所以它看起來像Failover Partner關鍵字在連接到 192.168.11.31 時起作用。但是,它看起來需要鏡像,也許是 Always On 可用性組而不是 BAG?

好的,所以我不得不不顧一切地冒險在沒有 AD 的情況下設置 DNS。這沒什麼大不了的,因為我們只有 2 個 SQL 實例和 3 個客戶端虛擬機。顯然,“故障轉移夥伴”關鍵字僅適用於已棄用的“鏡像”功能。並且只能使用他們的名字訪問聽眾。如果沒有一些醜陋的黑客攻擊,我認為沒有解決方案可以不使用 DNS。

引用自:https://dba.stackexchange.com/questions/291456