Kafka的Replica
概念
kafka的replica指的是消息的備份,為了保證kafka的高可用(當(dāng)leader節(jié)點(diǎn)掛了之后,kafka依然能提供服務(wù))kafka提供了備份的功能。這個(gè)備份是針對(duì)partition的。
可以通過(guò) default.replication.factor 對(duì)replica的數(shù)目進(jìn)行配置,默認(rèn)值為1,表示不對(duì)topic進(jìn)行備份。如果配置為2,表示除了leader節(jié)點(diǎn),對(duì)于topic里的每一個(gè)partition,都會(huì)有一個(gè)額外的備份。
replica分配
為了起到備份的效果,簡(jiǎn)單設(shè)想下,如果讓我們來(lái)分配replica,我們會(huì)怎么分配?
1)replica與所備份的節(jié)點(diǎn)不能再一臺(tái)機(jī)器上,否則就起不到備份的效果
2)replica盡量均勻的分布在集群機(jī)器上,如果replica全部都在某幾臺(tái)機(jī)器上,那么一旦這臺(tái)機(jī)器掛了,會(huì)丟失多個(gè)partition的備份
假設(shè)有3個(gè)broker、一個(gè)topic1、topic1有3個(gè)partition,default.replication.factor被設(shè)置為2,可能會(huì)這樣分配

這種分配保證了,任何一臺(tái)機(jī)器掛掉,kafka集群依然有備份可用。
replica分配算法
假設(shè)有5個(gè)broker,10個(gè)partitions,備份數(shù)設(shè)置為3
1、從一個(gè)集群的隨機(jī)節(jié)點(diǎn)開(kāi)始,輪詢(xún)放置第一個(gè)replica
| broker-0 | broker-1 | broker-2 | broker-3 | broker-4 | replica |
|---|---|---|---|---|---|
| p0 | p1 | p2 | p3 | p4 | 1st replica |
| p5 | p6 | p7 | p8 | p9 | 1st replica |
2、后面的replica增加一個(gè)偏移量,繼續(xù)放置,比如這里的p0,從broker-0開(kāi)始,下一個(gè)replica就從broker-1開(kāi)始
| broker-0 | broker-1 | broker-2 | broker-3 | broker-4 | replica |
|---|---|---|---|---|---|
| p0(start) | p1 | p2 | p3 | p4 | 1st replica |
| p5(start) | p6 | p7 | p8 | p9 | 1st replica |
| p4 | p0 (start) | p1 | p2 | p3 | 2nd replica |
| p8 | p9 | p5(start) | p6 | p7 | 2nd replica |
| p3 | p4 | p0(start) | p1 | p2 | 3rd replica |
| p7 | p8 | p9 | p5(start) | p6 | 3rd replica |
通過(guò)這種方式,replica盡可能的被均勻分配在多個(gè)broker上
多機(jī)房
上述方法,可以保證多個(gè)broker存在時(shí),哪怕其中一個(gè)broker掛了,kafka依舊能提供服務(wù)。但是,當(dāng)有多個(gè)機(jī)房時(shí)候,這種分配方式,不能保證,跨機(jī)房的高可用。
示例:4個(gè)broker,4個(gè)partition,每個(gè)partition有1個(gè)備份

按照之前的算法,replica會(huì)按照上圖所示設(shè)置備份。這樣假設(shè)機(jī)房1因?yàn)槟硞€(gè)原因掛掉了,partition0的數(shù)據(jù)就會(huì)丟失掉。同理,機(jī)房2掛了,partition2也會(huì)丟失掉。
replica分配算法考慮機(jī)房
kafka可以配置一個(gè)參數(shù)broker.rack說(shuō)明當(dāng)前broker在哪個(gè)機(jī)房。
如上圖,配置
broker0 -> rack1
broker1 -> rack1
broker2 -> rack2
broker3 -> rack2
當(dāng)進(jìn)行replica排序時(shí)候,不會(huì)僅僅按照broker順序進(jìn)行排序,而是會(huì)保證機(jī)房錯(cuò)開(kāi)。比如這種情況的排序可能是
broker0,broker2,broker1,broker3
這樣子排序之后,再次按照上述replica分配算法分配。

這種分配方式,保證了不同機(jī)房之間擁有全部的topic,一個(gè)機(jī)房的數(shù)據(jù)掛掉,仍然有另一個(gè)機(jī)房的數(shù)據(jù)可以使用。(前提條件,replica數(shù)目大于或等于機(jī)房的數(shù)目)
總結(jié)
kafka通過(guò)replica分配的算法保證了當(dāng)某臺(tái)機(jī)器掛掉,甚至某個(gè)機(jī)房掛掉,依然有備份可用。這種分配備份的算法,可以套用在需要有備份的場(chǎng)景,比如hdfs(沒(méi)研究過(guò),不知道是不是一樣的)。
參考資料
https://community.hortonworks.com/questions/71458/can-anyone-explain-kafka-rack-awareness-feature.html
kafka源碼 kafka.admin.AdminUtils#assignReplicasToBrokers