Cluster

RabbitMQ - 集群節點故障後意外的空和不同步隊列

  • March 7, 2013

我已經在 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 個節點會比兩個節點好得多。這意味著如果一個節點出現故障,其他兩個節點仍然具有彈性(取決於您的商業案例是正確的)。當然,如果兩個節點出現故障,您將失去隊列中剩餘的任何內容的複制。我認為這應該稱為“三擊設置”!

引用自:https://serverfault.com/questions/483500