天天看點

Kafka高可用——replica配置設定方式

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,可能會這樣配置設定

Kafka高可用——replica配置設定方式

簡單的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個備份

Kafka高可用——replica配置設定方式

備份(不考慮機房)

按照之前的算法,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配置設定算法配置設定。

Kafka高可用——replica配置設定方式

replica配置設定(考慮不同機房)

這種配置設定方式,保證了不同機房之間擁有全部的topic,一個機房的資料挂掉,仍然有另一個機房的資料可以使用。(前提條件,replica數目大于或等于機房的數目)

總結

kafka通過replica配置設定的算法保證了當某台機器挂掉,甚至某個機房挂掉,依然有備份可用。這種配置設定備份的算法,可以套用在需要有備份的場景,比如hdfs(沒研究過,不知道是不是一樣的)。

參考資料

https://community.hortonworks.com/questions/71458/can-anyone-explain-kafka-rack-awareness-feature.html

kafka源碼 kafka.admin.AdminUtils#assignReplicasToBrokers

繼續閱讀