1. 程式人生 > >RabbitMQ叢集出現網路分割槽,可能會丟資料

RabbitMQ叢集出現網路分割槽,可能會丟資料

最近調研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發訊息都正常。

但最好手動處理網路分割槽(備份好資料),避免告警