天天看點

RabbitMQ高可用--鏡像隊列的用法

簡介

說明

        本文介紹如何使用RabbitMQ的鏡像隊列實作高可用。

        鏡像隊列(Mirror Queue):将隊列複制到叢集的其他Broker節點上,publish到鏡像隊列的所有消息也被publish到master和所有的slave。如果叢集中的一個節點失效了,隊列能自動地切換到鏡像中的另一個節點上以保證服務的可用性。

備注

        在 3.8 以前的版本,RabbitMQ 通過鏡像隊列(Classic Queue Mirroring)來提供高可用性。但鏡像隊列存在很大的局限性,在 3.8 之後的版本 RabbitMQ 推出了 Quorum queues 來替代鏡像隊列,在之後的版本中鏡像隊列将被移除。

為什麼引入鏡像隊列?

        如果RabbitMQ叢集中隻有一個Broker節點,那麼該節點的失效将導緻整體服務的臨時性不可用,并且也可能會導緻消息丢失。可以将所有消息都設定為持久化,并且對應隊列的durable屬性也設定為true,但是這樣仍然無法避免由于緩存導緻的問題:因為消息在發送之後和被寫入磁盤之間存在時間差,這時可能會産生問題。

        通過publisher confirm機制能確定用戶端知道哪些消息己經存入磁盤,盡管如此,一般不希望遇到因單點故障導緻的服務不可用。

        如果RabbitMQ叢集是由多個Broker節點組成的,那麼該叢集對于單點故障是有彈性的,但要注意:盡管交換器和綁定關系在單點故障時沒問題,但隊列和其存儲的消息會丢失,因為隊列程序及其内容僅僅維持在單個節點之上,是以一個節點的失效表現為其對應的隊列不可用。

         一般對每個隊列配置鏡像隊列。這樣同一個隊列有多個備份,分布到一個主節點(master)和若幹個從節點(slave),相應的結構如下圖所示:

配置方法

鏡像隊列的原理