面試題之Rabbitmq的集羣鏡像

RabbitMQ集羣高可用

RabbitMq集羣模式分爲兩種:普通集羣;鏡像集羣模式

普通集羣模式

多臺機器上啓動多個RabbitMQ實例,每個實例中的exchange和queue都包含meta、contents、state等信息,exchange在集羣中的每個節點都保存一份數據,但是queue不一樣,queue在集羣中對於contents只存儲一份,其他節點只存儲meta信息
也就是說:

  1. 對於publish,客戶端任意連接集羣的一個節點,轉發給創建queue的節點存儲消息的所有信息
  2. 對於consumer,客戶端任意連接集羣中的一個節點,如果數據不在該節點中,則從存儲該消息data的節點拉取。
    可見當存儲有queue內容的節點失效後,只要等待該節點恢復後,queue中存在的消息纔可以獲取消費的到

所以這個普通集羣比較尷尬了,這就沒有什麼所謂的高可用性可言了,這方案主要是提高吞吐量的,就是說讓集羣中多個節點來服務某個queue的讀寫操作。高可用方面就差一點了
在這裏插入圖片描述

鏡像集羣模式

鏡像集羣是RabbitMQ高可用的一種模式,相對於普通集羣模式,你創建的queue,無論元數據還是queue裏的消息都會存在於多個實例上,然後每次你寫消息到queue的時候,都會自動把消息到多個實例的queue裏進行消息同步。
這樣在單節點失效的情況下,整個集羣仍舊可以提供服務。但是由於數據需要在多個節點複製,在增加可用性的同時,系統的吞吐量會有所下降。
在實現機制上,mirror queue內部實現了一套選舉算法,有一個master和多個slave。

這樣所有的操作都是對mastaer節點操作

  1. 對於publish,可以選擇任意一個節點進行連接,rabbitmq內部若該節點不是master,則轉發給master,master向其他slave節點發送該消息,後進行消息本地化處理,並組播複製消息到其他節點存儲
  2. 對於consumer,可以選擇任意一個節點進行連接,消費的請求會轉發給master,爲保證消息的可靠性,consumer需要進行ack確認,master收到ack後,纔會刪除消息,ack消息會同步(默認異步)到其他各個節點,進行slave節點刪除消息
  3. 若master節點失效,則mirror queue會自動選舉出一個節點(slave中消息隊列最長者)作爲master,作爲消息消費的基準參考;在這種情況下可能存在ack消息未同步到所有節點的情況(默認異步)
  4. 若slave節點失效,mirror queue集羣中其他節點的狀態無需改變。
    在這裏插入圖片描述
    RabbitMQ的三種集羣模式
    rabbitmq在高可用HA方面的方案總結
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章