RabbitMQ叢集出現網路分割槽,可能會丟資料
阿新 • • 發佈:2019-01-09
最近調研RabbitMQ叢集在出現網路分割槽時是否存在訊息丟失的情況。
發現以下這種情況出現時,無法避免訊息丟失。
由於希望高可用,叢集佇列一般都設定為持久化、lazy、映象佇列
假設RMQ叢集有5個節點:node[1:5]
假設佇列q 為一主一從,分別在 node1、node3節點。
分割槽前:
假設佇列q的master、slave節點: node1、node3 與 node2, node4, node5 之間的網路中斷了,此時
此刻兩者之間的網路通訊並未恢復。這種中間狀態很有可能導致資料丟失,分析如下:
之前打到node1, node3上的生產者連線 producer client #1,可以正常繼續向佇列q上發訊息。
而打到node2, node4, node5上的生產者連線 producer client #2,無法感知到佇列q不處在當前小塊集團節點中(集團中沒有佇列q程序)。queue不同於exchange、bindings,queue程序只存在於其master和slaves節點中。而此時生產者即使使用了confirm、returnListener等機制,訊息還是到達不了目標佇列q(通過exchange傳送,下面掛了多個佇列),但傳送方依然可以收到伺服器返回的Ack,認為訊息已經通過exchange路由到目標佇列中去了。造成了訊息的丟失。
兩者之間的網路通訊恢復後
此刻mnesia判斷出現了網路分割槽,由於通訊恢復,此時向佇列q發訊息都正常。
但最好手動處理網路分割槽(備份好資料),避免告警