SQL Server 故障轉移基本可用性組的 Entity Framework Core 不起作用
我在 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。