【消息隊列】kafka是如何保證高可用的


一、kafka一個最基本的架構認識

  由多個broker組成,每個broker就是一個節點;創建一個topic,這個topic可以划分為多個partition,每個partition可以存在於不同的broker上,每個partition存放放一部分數據。

  kafka就是一個分布式消息隊列,就是說一個topic的數據,是分散放在多個機器上的,每個機器就放一部分數據。
  實際上像rabbitmq之類的,並不是分布式消息隊列,它只是傳統的消息隊列,只不過提供了一些集群、HA的機制而已,因為rabbitmq的一個queue的數據都是放在一個節點里的,鏡像集群下,也是每個節點都存放這個queue的完整數據。

 

 

二、kafka高可用機制

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

  kafka 0.8以后,提供了HA機制,就是replica副本機制。每個partition的數據都會同步到其他機器上,形成自己的多個replica副本。然后所有replica會選舉一個leader出來,那么生產和消費都跟這個leader打交道,然后其他replica就是follower。寫的時候,leader會負責把數據同步到所有follower上去,讀的時候就直接讀leader上數據即可。只能讀寫leader?很簡單,要是你可以隨意讀寫每個follower,那么就要care數據一致性的問題,系統復雜度太高,很容易出問題。kafka會均勻的將一個partition的所有replica分布在不同的機器上,這樣才可以提高容錯性。

  kafka的這種機制,就有所謂的高可用性了,因為如果某個broker宕機了,也沒事兒,因為那個broker上面的partition在其他機器上都有副本的,那么此時會重新選舉一個新的leader出來,大家繼續讀寫那個新的leader即可。這就有所謂的高可用性了。

1)寫過程

  寫數據的時候,生產者就寫leader,然后leader將數據落地寫本地磁盤,接着其他follower自己主動從leader來pull數據。一旦所有follower同步好數據了,就會發送ack給leader,leader收到所有follower的ack之后,就會返回寫成功的消息給生產者。(當然,這只是其中一種模式,還可以適當調整這個行為)

 

2)讀過程

  消費的時候,只會從leader去讀,但是只有當一個消息已經被所有follower都同步成功並返回ack的時候,這個消息才能夠被消費者讀到。

 

題外話: RabbitMQ的高可用性
  RabbitMQ是比較有代表性的,因為是基於主從做高可用性的;

rabbitmq有三種模式:單機模式,普通集群模式,鏡像集群模式

1.單機模式

  demo級別,生產不能用單機模式。

 

2.普通集群模式

  就是在多台機器上啟動多個rabbitmq實例,每個機器啟動一個。但是你創建的queue,只會存放在一個rabbtimq實例上,但是每個實例都同步queue的元數據。實際上如果連接到了另外一個實例,那么那個實例會從真正存有數據的queue所在實例上拉取數據過來。

  沒做到所謂的分布式,就是個普通集群。該方案主要是提高吞吐量的,就是說讓集群中多個節點來服務某個queue的讀寫操作。

 

 

3.鏡像集群模式

  這種模式,才是所謂的rabbitmq的高可用模式,跟普通集群模式不一樣的是,你創建的queue,無論元數據還是queue里的消息都會存在於多個實例上,然后每次你寫消息到queue的時候,都會自動把消息到多個實例的queue里進行消息同步。

 

 

 

 

 

  

 


免責聲明!

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



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