RabbitMQ鏡像模式雙節點部署時故障轉移過程中隊列中消息的狀態


場景

現有節點Node1和Node2,建立Exchange:yu.exchange,創建隊列yu1.queue鏡像隊列master位於Node1,yu2.queue鏡像隊列位於Node2,使用topic模式綁定到Exchange;

當隊列發送時設置DeliveryMode=1 No-Persistent 不進行度列持久化時

過程:

1.客戶端向Exchange發送消息10條,停掉Node1上的RabbitMQ實例,隊列yu1.queue將master切換到Node2,隊列正常繼續接受,不影響后續的消息接收。(當前消息條數10)

2.客戶端繼續發送消息5條,然后啟動Node1實例,Node1會以從節點的身份恢復到集群中(當前消息條數15條),Node1會以從節點的身份恢復到集群中,此時隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致

3.客戶端繼續發送消息5條(此時隊列內消息為20條),此時隊列上依然顯示消息不一致“+0+1”的警告

4.暫停Node2實例,此時隊列會全部切換master到Node2,隊列正常運行,但此刻隊列消息條數為5,由於只剩一個節點,所以不再存在消息不一致的“+0+1”警告

5.客戶端繼續發送5條,啟動Node1實例,隊列內消息為10條,繼續隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致(隊列條數10)

小結:對於未設置持久化的消息隊列,如果無訂閱客戶端進行消息消費的話,當發生主從切換時,master實例在關閉到重啟為slaver的過程中,如果隊列持續接收消息會發生不一致的警告。同時如果該場景重復發生,如果不設置參數“ha-sync-mode: automatic”的話(默認為ha-sync-mode: manual),隊列內消息不會進行同步,消息內容以最近master實例內的消息為主。(https://www.rabbitmq.com/admin-guide.html

當隊列發送時設置DeliveryMode=2 Persistent 進行度列持久化時

1.客戶端向Exchange發送消息10條,停掉Node1上的RabbitMQ實例,隊列yu1.queue將master切換到Node2,隊列正常繼續接受,不影響后續的消息接收。(當前消息條數10)

2.客戶端繼續發送消息5條,然后啟動Node1實例,Node1會以從節點的身份恢復到集群中(當前消息條數15條),Node1會以從節點的身份恢復到集群中,此時隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致

3.客戶端繼續發送消息5條(此時隊列內消息為20條),此時隊列上依然顯示消息不一致“+0+1”的警告

4.暫停Node2實例,此時隊列會全部切換master到Node2,隊列正常運行,但此刻隊列消息條數為0!!!!,由於只剩一個節點,所以不再存在消息不一致的“+0+1”警告

5.客戶端繼續發送5條,啟動Node1實例,隊列內消息為5條,繼續隊列上顯示消息不一致“+0+1”的警告,即發生主從消息不一致(隊列條數5)

6.再次關閉Node2實例,master又會切回到Node1,但此處隊列內消息再次歸0!!!!

 

當鏡像隊列部署到多於兩個節點時需要注意ha-mode的參數設置 鏡像隊列數量越少處理速度越快,多一些當然數據的一致性會更高,但吞吐量會下降


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM