關於MQ的幾件小事(二)如何保證消息隊列的高可用


1.RabbitMQ的高可用

RabbitMQ基於主從模式實現高可用。RabbitMQ有三種模式:單機模式,普通集群模式,鏡像集群模式。
(1)單機模式:
單機模式就是demo級別的,生產中不會有人使用。
(2)普通集群模式
普通集群模式就是在多台機器上啟動多個rabbitmq實例,每個機器啟動一個。但是創建的queue只會放在一個rabbitmq實例上面,但是其他的實例都同步了這個queue的元數據。在你消費的時候,如果連接到了另一個實例,他會從擁有queue的那個實例獲取消息然后再返回給你。
普通集群模式示意圖.png
這種方式並沒有做到所謂消息的高可用,就是個普通的集群,這樣還會導致要么消費者每次隨機連接一個實例然后拉取數據,這樣的話在實例之間會產生網絡傳輸,增加系統開銷,要么固定連接那個queue所在的實例消費,這樣會導致單實例的性能瓶頸。

而且如果那個方queue的實例宕機了,會導致接下來其他實例都無法拉取數據;如果沒有開啟消息的持久化會丟失消息;就算開啟了消息的持久化,消息不一定會丟,但是也要等這個實例恢復了,才可以繼續拉取數據。
所以這個並沒有提供高可用,這種方案只是提高了吞吐量,也就是讓集群中多個節點來服務某個queue的讀寫操作。
(3)鏡像集群模式
這種模式,才是rabbitmq提供是真正的高可用模式,跟普通集群不一樣的是,你創建的queue,無論元數據還是queue里面是消息數據都存在多個實例當中,然后每次寫消息到queue的時候,都會自動把消息到多個queue里進行消息同步。
鏡像集群模式示意圖.png
這種模式的好處在於,任何一台機器宕機了,其他的機器還可以使用。
壞處在於:1、性能消耗太大,所有機器都要進行消息的同步,導致網絡壓力和消耗很大。2、沒有擴展性可言,如果有一個queue負載很重,就算加了機器,新增的機器還是包含了這個queue的所有數據,並沒有辦法擴展queue。
如何開啟鏡像集群模式:在控制台新增一個鏡像集群模式的策略,指定的時候可以要求數據同步到所有節點,也可以要求同步到指定節點,然后在創建queue的時候,應用這個策略,就會自動將數據同步到其他的節點上面去了。

2.kafka的高可用

(1)kafka的一個基本架構:多個broker組成,一個broker是一個節點;你創建一個topic,這個topic可以划分成多個partition,每個partition可以存在於不同的broker上面,每個partition存放一部分數據。這是天然的分布式消息隊列。

實際上rabbitmq並不是分布式消息隊列,他就是傳統的消息隊列,只不過提供了一些集群、HA的機制而已,因為無論如何配置,rabbitmq一個queue的數據就存放在一個節點里面,鏡像集群下,也是每個節點都放這個queue的全部數據。

kafka在0.8以前是沒有HA機制的,也就是說任何一個broker宕機了,那個broker上的partition就丟了,沒法讀也沒法寫,沒有什么高可用可言。

kafka在0.8之后,提過了HA機制,也就是replica副本機制。每個partition的數據都會同步到其他機器上,形成自己的replica副本。然后所有的replica副本會選舉一個leader出來,那么生產者消費者都和這個leader打交道,其他的replica就是follower。寫的時候,leader會把數據同步到所有follower上面去,讀的時候直接從leader上面讀取即可。
為什么只能讀寫leader:因為要是你可以隨意去讀寫每個follower,那么就要關心數據一致性問題,系統復雜度太高,容易出問題。kafka會均勻度講一個partition的所有數據replica分布在不同的機器上,這樣就可以提高容錯性。
這樣就是高可用了,因為如果某個broker宕機 了,沒事兒,那個broker的partition在其他機器上有副本,如果這上面有某個partition的leader,那么此時會重新選舉出一個現代leader出來,繼續讀寫這個新的leader即可。
kafka高可用架構示意圖.png
寫消息: 寫數據的時候,生產者就寫leader,然后leader將數據落到磁盤上之后,接着其他follower自己主動從leader來pull數據。一旦所有follower同步好了數據,就會發送ack個leader,leader收到了所有的follower的ack之后,就會返回寫成功的消息給消息生產者。(這只是一種模式,可以調整)。
讀數據:消費數據的時候,只會從leader進行消費。但是只有一個消息已經被所有follower都同步成功返回ack的時候,這個消息才會被消費者讀到。

上一篇《消息隊列的用途、優缺點、技術選型
下一篇《[如何保證消息不重復消費]((https://www.cnblogs.com/jack1995/p/10908805.html)》


免責聲明!

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



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