Kafka的Replica
概念
kafka的replica指的是消息的備份,為了保證kafka的高可用(當leader節點挂了之後,kafka依然能提供服務)kafka提供了備份的功能。這個備份是針對partition的。
可以通過 default.replication.factor 對replica的數目進行配置,預設值為1,表示不對topic進行備份。如果配置為2,表示除了leader節點,對于topic裡的每一個partition,都會有一個額外的備份。
replica配置設定
為了起到備份的效果,簡單設想下,如果讓我們來配置設定replica,我們會怎麼配置設定?
1)replica與所備份的節點不能再一台機器上,否則就起不到備份的效果
2)replica盡量均勻的分布在叢集機器上,如果replica全部都在某幾台機器上,那麼一旦這台機器挂了,會丢失多個partition的備份
假設有3個broker、一個topic1、topic1有3個partition,default.replication.factor被設定為2,可能會這樣配置設定
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukjYxMmZ0gzYkRTNwczY5QjZ4kDMjNDMyYWO2YGN1YzNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
簡單的replica配置設定示意圖(圓角矩形代表replica)
這種配置設定保證了,任何一台機器挂掉,kafka叢集依然有備份可用。
replica配置設定算法
假設有5個broker,10個partitions,備份數設定為3
1、從一個叢集的随機節點開始,輪詢放置第一個replica
broker-0 | broker-1 | broker-2 | broker-3 | broker-4 | replica |
---|---|---|---|---|---|
p0 | p1 | p2 | p3 | p4 | 1st replica |
p5 | p6 | p7 | p8 | p9 |
2、後面的replica增加一個偏移量,繼續放置,比如這裡的p0,從broker-0開始,下一個replica就從broker-1開始
p0(start) | |||||
p5(start) | |||||
p0 (start) | 2nd replica | ||||
3rd replica | |||||
通過這種方式,replica盡可能的被均勻配置設定在多個broker上
多機房
上述方法,可以保證多個broker存在時,哪怕其中一個broker挂了,kafka依舊能提供服務。但是,當有多個機房時候,這種配置設定方式,不能保證,跨機房的高可用。
示例:4個broker,4個partition,每個partition有1個備份
備份(不考慮機房)
按照之前的算法,replica會按照上圖所示設定備份。這樣假設機房1因為某個原因挂掉了,partition0的資料就會丢失掉。同理,機房2挂了,partition2也會丢失掉。
replica配置設定算法考慮機房
kafka可以配置一個參數broker.rack說明目前broker在哪個機房。
如上圖,配置
broker0 -> rack1
broker1 -> rack1
broker2 -> rack2
broker3 -> rack2
當進行replica排序時候,不會僅僅按照broker順序進行排序,而是會保證機房錯開。比如這種情況的排序可能是
broker0,broker2,broker1,broker3
這樣子排序之後,再次按照上述replica配置設定算法配置設定。
replica配置設定(考慮不同機房)
這種配置設定方式,保證了不同機房之間擁有全部的topic,一個機房的資料挂掉,仍然有另一個機房的資料可以使用。(前提條件,replica數目大于或等于機房的數目)
總結
kafka通過replica配置設定的算法保證了當某台機器挂掉,甚至某個機房挂掉,依然有備份可用。這種配置設定備份的算法,可以套用在需要有備份的場景,比如hdfs(沒研究過,不知道是不是一樣的)。
參考資料
https://community.hortonworks.com/questions/71458/can-anyone-explain-kafka-rack-awareness-feature.htmlkafka源碼 kafka.admin.AdminUtils#assignReplicasToBrokers