1.RabbitMQ的高可用
RabbitMQ基於主從模式實現高可用。RabbitMQ有三種模式:單機模式,普通叢集模式,映象叢集模式。 (1)單機模式: 單機模式就是demo級別的,生產中不會有人使用。 (2)普通叢集模式 普通叢集模式就是在多臺機器上啟動多個rabbitmq例項,每個機器啟動一個。但是建立的queue只會放在一個rabbitmq例項上面,但是其他的例項都同步了這個queue的後設資料。在你消費的時候,如果連線到了另一個例項,他會從擁有queue的那個例項獲取訊息然後再返回給你。
這種方式並沒有做到所謂訊息的高可用,就是個普通的叢集,這樣還會導致要麼消費者每次隨機連線一個例項然後拉取資料,這樣的話在例項之間會產生網路傳輸,增加系統開銷,要麼固定連線那個queue所在的例項消費,這樣會導致單例項的效能瓶頸。而且如果那個方queue的例項當機了,會導致接下來其他例項都無法拉取資料;如果沒有開啟訊息的持久化會丟失訊息;就算開啟了訊息的持久化,訊息不一定會丟,但是也要等這個例項恢復了,才可以繼續拉取資料。 所以這個並沒有提供高可用,這種方案只是提高了吞吐量,也就是讓叢集中多個節點來服務某個queue的讀寫操作。 (3)映象叢集模式 這種模式,才是rabbitmq提供是真正的高可用模式,跟普通叢集不一樣的是,你建立的queue,無論後設資料還是queue裡面是訊息資料都存在多個例項當中,然後每次寫訊息到queue的時候,都會自動把訊息到多個queue裡進行訊息同步。
這種模式的好處在於,任何一臺機器當機了,其他的機器還可以使用。壞處在於: 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即可。
讀資料: 消費資料的時候,只會從leader進行消費。但是隻有一個訊息已經被所有follower都同步成功返回ack的時候,這個訊息才會被消費者讀到。
上一篇《訊息佇列的用途、優缺點、技術選型》
下一篇《如何保證訊息不重複消費》