如何保證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的時候,這個消息纔會被消費者讀到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章