日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Kafka创建Topic时如何将分区放置到不同的Broker中

發(fā)布時(shí)間:2024/9/27 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kafka创建Topic时如何将分区放置到不同的Broker中 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

熟悉 Kafka 的同學(xué)肯定知道,每個(gè)主題有多個(gè)分區(qū),每個(gè)分區(qū)會(huì)存在多個(gè)副本,本文今天要討論的是這些副本是怎么樣放置在 Kafka 集群的 Broker 中的。

大家可能在網(wǎng)上看過(guò)這方面的知識(shí),網(wǎng)上對(duì)這方面的知識(shí)是千變一律,都是如下說(shuō)明的:
為了更好的做負(fù)載均衡,Kafka盡量將所有的Partition均勻分配到整個(gè)集群上。Kafka分配Replica的算法如下:
將所有存活的N個(gè)Brokers和待分配的Partition排序
?將第i個(gè)Partition分配到第(i mod n)個(gè)Broker上,這個(gè)Partition的第一個(gè)Replica存在于這個(gè)分配的Broker上,并且會(huì)作為partition的優(yōu)先副本
?將第i個(gè)Partition的第j個(gè)Replica分配到第((i + j) mod n)個(gè)Broker上
?假設(shè)現(xiàn)在有5個(gè) Broker,分區(qū)數(shù)為5,副本為3的主題,按照上面的說(shuō)法,主題最終分配在整個(gè)集群的樣子如下:

假設(shè)現(xiàn)在有5個(gè) Broker,分區(qū)數(shù)為5,副本為3的主題,按照上面的說(shuō)法,主題最終分配在整個(gè)集群的樣子如下:

但事實(shí)真的是這樣的嗎?實(shí)際上如果真按照這種算法,會(huì)存在以下明顯幾個(gè)問(wèn)題:
?所有主題的第一個(gè)分區(qū)都是存放在第一個(gè)Broker上,這樣會(huì)造成第一個(gè)Broker上的分區(qū)總數(shù)多于其他的Broker,這樣就失去了負(fù)載均衡的目的;
?如果主題的分區(qū)數(shù)多于Broker的個(gè)數(shù),多于的分區(qū)都是傾向于將分區(qū)發(fā)放置在前幾個(gè)Broker上,同樣導(dǎo)致負(fù)載不均衡。
所以其實(shí)上面的算法不準(zhǔn)確。嚴(yán)格來(lái)說(shuō),上面的算法只是Kafka分配分區(qū)的一種特例(下面介紹算法部分會(huì)說(shuō)明)。下面我們來(lái)看看 Kafka 內(nèi)部到底是如何將分區(qū)分配到各個(gè) Broker 中的,其具體算法實(shí)現(xiàn)函數(shù)就是 assignReplicasToBrokers,如下:

從上面的算法可以看出:
?副本因子不能大于 Broker 的個(gè)數(shù);
?第一個(gè)分區(qū)(編號(hào)為0)的第一個(gè)副本放置位置是隨機(jī)從 brokerList 選擇的;
?其他分區(qū)的第一個(gè)副本放置位置相對(duì)于第0個(gè)分區(qū)依次往后移。也就是如果我們有5個(gè) Broker,5個(gè)分區(qū),假設(shè)第一個(gè)分區(qū)放在第四個(gè) Broker 上,那么第二個(gè)分區(qū)將會(huì)放在第五個(gè) Broker 上;第三個(gè)分區(qū)將會(huì)放在第一個(gè) Broker 上;第四個(gè)分區(qū)將會(huì)放在第二個(gè) Broker 上,依次類(lèi)推;
?剩余的副本相對(duì)于第一個(gè)副本放置位置其實(shí)是由 nextReplicaShift 決定的,而這個(gè)數(shù)也是隨機(jī)產(chǎn)生的;
所以如果我們依次如下調(diào)用上面的程序,ret 變量的輸出結(jié)果會(huì)如下:

注意,你運(yùn)行上面的程序結(jié)果可能和我的不一樣,因?yàn)樯厦嫠惴ㄖ械?startIndex 和 nextReplicaShift 變量都是隨機(jī)生成的。其實(shí) Kafka 創(chuàng)建主題就是這么調(diào)用算法的(fixedStartIndex
和 startPartitionId都是使用默認(rèn)值)。另外,第一個(gè)放置的分區(qū)副本一般都是 Leader,其余的都是 Follow 副本,也就是說(shuō),上面輸出的List第一個(gè)元素就是 Leader 副本所在的 Broker 編號(hào)。

到這里我們應(yīng)該知道,網(wǎng)上其他博客介紹的 Kafka 分區(qū)是如何分配到各個(gè) Broker 上其實(shí)是將 startIndex 設(shè)置成 0, 同時(shí) fixedStartIndex 設(shè)置成 1,這樣本文最開(kāi)頭介紹的算法就對(duì)了。但其實(shí) Kafka 內(nèi)部并不是這樣調(diào)用的,大家注意。

如果我們還考慮機(jī)架的話,情況就更復(fù)雜了。這里為了簡(jiǎn)便起見(jiàn),我們假設(shè)startIndex = 4,fixedStartIndex = 1?,F(xiàn)在如果我們有兩個(gè)機(jī)架的 Kafka 集群,brokers 0,
1 和 2 同屬于一個(gè)機(jī)架;brokers 3, 4 和 5 屬于另外一個(gè)機(jī)架?,F(xiàn)在我們對(duì)這些 Broker 進(jìn)行排序:0, 3, 1, 4, 2, 5(每個(gè)機(jī)架依次選擇一個(gè)Broker進(jìn)行排序)。按照機(jī)架的 Kafka 分區(qū)放置算法,如果分區(qū)0的第一個(gè)副本放置到broker 4上面,那么其第二個(gè)副本將會(huì)放到broker 2上面,第三個(gè)副本將會(huì)放到 broker 5上面;同理,分區(qū)1的第一個(gè)副本放置到broker 2上面,其第二個(gè)副本將會(huì)放到broker 5上面,第三個(gè)副本將會(huì)放到 broker 0上面。這就保證了這兩個(gè)副本放置到不同的機(jī)架上面,即使其中一個(gè)機(jī)架出現(xiàn)了問(wèn)題,我們的 Kafka 集群還是可以正常運(yùn)行的?,F(xiàn)在把機(jī)架因素考慮進(jìn)去的話,我們的分區(qū)看起來(lái)像下面一樣:

從上圖可以看出,只要上面其中一個(gè)機(jī)架沒(méi)有問(wèn)題,我們的數(shù)據(jù)仍然可以對(duì)外提供服務(wù)。這就大大提高了集群的可用性。

總結(jié)

以上是生活随笔為你收集整理的Kafka创建Topic时如何将分区放置到不同的Broker中的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。