Cluster
RabbitMQ - 集群節點故障後意外的空和不同步隊列
我已經在 Windows 上的集群中下載並安裝了 RabbitMQ:
- 在兩台伺服器(例如 Alpha 和 Bravo)上下載並安裝 ERLANG 和 RABBITMQ
- 安裝管理外掛,設置自定義 tcp_listener 埠(以提高安全性)並添加自定義管理員登錄而不是預設的 guest:guest 登錄
- 在兩台機器上設置相同的 cookie(在兩個文件夾 C:\Windows\ 和 C:\Users\username 中)
- 將 RabbitMQ 安裝為 Windows 服務
- 將 Bravo 節點加入到 Alpha 節點以進行集群
- 添加了鏡像所有隊列的策略(Pattern="",Definition=“ha-mode: all”)
- 我創建了持久鏡像隊列並向其發布消息 - 它在兩個節點之間同步(它工作正常,如我所料)
但後來我嘗試測試如果我關閉一個節點會發生什麼:
- 我關閉了節點 Bravo
- 我向 Alpha 節點添加了消息
- 我重新打開節點 Bravo
- 失去的消息已同步到 Bravo 節點,但在管理控制台中,此節點被標記為“未同步”
這個隊列有什麼問題?但還有其他問題。例如:
- 我關閉了節點 Bravo
- 我向 Alpha 節點添加了消息
- 我重新打開節點 Bravo 並等待同步消息
- 我關閉了 Alpha 節點
- 我向 Bravo 節點添加了消息
- 我重新打開了 Alpha 節點
- 隊列中所有添加的消息都神奇地消失了
這真的很奇怪。有人知道發生了什麼嗎?
還有第三個測試案例:
- 我已經關閉了 Alpha 節點,向 Bravo 添加了消息並關閉了 Bravo 節點
- 然後我打開 Alpha 節點並收到消息“timeout_waiting_for_tables”。我嘗試了更多次。只有當我重新打開 Alpha 節點時它才開始工作
也許我只是不明白集群在 RabbitMQ 中是如何工作的。誰能幫助我並告訴我發生了什麼?
同樣的問題,但需要做一些了解以及可能的陷阱。
首先,我沒有將我的虛擬主機傳遞給命令這一事實愚弄了我:
rabbitmqctl set_policy -p myvhost HA '*' '{"ha-mode": "all"}'
否則虛擬主機預設為“/”
之後,當我登錄 Web 控制台時,我看到 node 欄位正在報告兩個節點……現在。偉大的 :-)
但是,如果你把一個上下,然後另一個上下,隊列就消失了!?這是因為鏡像中沒有“同步”,只有“堆疊”。這意味著如果您關閉一個節點,其餘消息將從剩餘節點(或多個節點)提供。如果您啟動一個新的/現有的節點,它只會鏡像添加的新消息。
我對此很陌生,所以我認為擁有 3 個節點會比兩個節點好得多。這意味著如果一個節點出現故障,其他兩個節點仍然具有彈性(取決於您的商業案例是正確的)。當然,如果兩個節點出現故障,您將失去隊列中剩餘的任何內容的複制。我認為這應該稱為“三擊設置”!