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)開始香椎,輪詢放置第一個(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開始躺率,下一個(gè)replica就從broker-1開始
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ò)開。比如這種情況的排序可能是
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(沒研究過(guò)裆馒,不知道是不是一樣的)姊氓。
參考資料
https://community.hortonworks.com/questions/71458/can-anyone-explain-kafka-rack-awareness-feature.html
kafka源碼 kafka.admin.AdminUtils#assignReplicasToBrokers