SQL Service Broker 和 AlwaysOn 問題
我在使用 AlwaysOn 和 SSB 設置目前環境時遇到問題,我將在這裡盡我所能解釋:
目前環境:
Server A Server B database x(Pub) database x (Sub) database y
我們的應用程序執行在
database x
. 我們已經transactional replication
設置database x
好在Server B
.Database y
用於從另一個應用程序接收數據。我們使用它來處理這些數據並將必要的資訊發送到database x
.database x
on的副本Server B
幫助我們驗證所有資訊並確保我們不會發送任何無效數據。為了和我們之間進行通信
database y
,database x
我們使用SSB
. 為什麼?它更快。我們正在遷移到 AlwaysOn,我們希望保持目前設置並添加故障轉移群集技術。
所以我們遇到了問題: AlwaysOn 不允許我們選擇想要在副本上擁有的內容。所以它擁有一切,包括 SSB 對象(服務、隊列等)。當我們設置數據庫並嘗試通信
database y
時x
,我們在 transmission_queue 上收到此錯誤:數據庫 x 為只讀模式
所以 SSB 正在使用我們在 in 副本上的本地服務
database x
,Server B
而不是查看我們告訴他去database x
in的路線Server A
。我們發現的一種替代方法是為數據庫 y 創建一個新實例。我不喜歡這種方法,從我讀過的內容來看,我們也失去了來自 AlwaysOn 的兩個實例的自動故障轉移,我們必須手動完成。
我個人的猜測是,SSB 總是使用本地服務,我沒有辦法解決這個問題。我考慮過的一件事是從中刪除 AutoCreatedLocal 路由
Server B
並查看它是否有效(仍然必須嘗試)但如果有效,我不確定在它進行故障轉移時我將如何進行設置。我可能必須有一個腳本來執行並重新創建它。感謝您對此的任何幫助。
編輯以添加更多資訊:按照 Remus 提供的連結(帶有 AlwaysOn 的Service Broker)來配置帶有 AlwaysOn 的 SSB。基本上只是改變了使用AG而不是特定伺服器的路由。
仍然有同樣的錯誤:數據庫處於只讀模式。
您需要在 x 和 y 之間設置一個 AG 感知 SSB 路由。請參閱具有 AlwaysOn 可用性組的 Service Broker。即使 x 和 y 位於同一主機上,此路由也會通過網路傳遞消息。當發生故障轉移並且 x 和 y 位於不同的主機上時,傳遞將繼續不間斷。
我個人的猜測是,SSB 總是使用本地服務,我沒有辦法解決這個問題。
您應該閱讀Service Broker Routing(雖然有點過時,因為它錯過了 AG 感知端點)。如果沒有聲明明確的路由,SSB 使用本地服務(“自動”路由)作為最後的手段。通過顯式創建路線,您始終有“出路”。