Sql-Server

SQL Service Broker 和 AlwaysOn 問題

  • April 27, 2015

我在使用 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 xon的副本Server B幫助我們驗證所有資訊並確保我們不會發送任何無效數據。

為了和我們之間進行通信database ydatabase x我們使用SSB. 為什麼?它更快。

我們正在遷移到 AlwaysOn,我們希望保持目前設置並添加故障轉移群集技術。

所以我們遇到了問題: AlwaysOn 不允許我們選擇想要在副本上擁有的內容。所以它擁有一切,包括 SSB 對象(服務、隊列等)。當我們設置數據庫並嘗試通信database yx,我們在 transmission_queue 上收到此錯誤:

數據庫 x 為只讀模式

所以 SSB 正在使用我們在 in 副本上的本地服務database xServer B而不是查看我們告訴他去database xin的路線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 使用本地服務(“自動”路由)作為最後的手段。通過顯式創建路線,您始終有“出路”。

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