Kafka主題和分區(qū)

????????主題作為消息的歸類,可以再細(xì)分為一個或多個分區(qū)治泥,分區(qū)可以看作對消息的二級歸類暂幼。分區(qū)的劃分不僅為Kafka提供了可伸縮性筏勒、水平擴(kuò)展的功能,還通過多副本機(jī)制為Kafka提供數(shù)據(jù)冗余以提高數(shù)據(jù)可靠性旺嬉。

????????從Kafka的底層來說管行,主題和分區(qū)都是邏輯上的概念,分區(qū)可以有一到多個副本邪媳,每個副本對應(yīng)一到多個日志文件捐顷,每個日志文件對應(yīng)一到多個日志分段(LogSegment),每個日志文件可以細(xì)分為索引文件雨效、日志存儲文件和快照文件等迅涮。

1、主題的管理

1.1徽龟、創(chuàng)建主題

????????如果broker端配置參數(shù)auto.create.topics.enable配置為true(默認(rèn)值為true)叮姑,那么當(dāng)生產(chǎn)者向一個尚未創(chuàng)建的主題發(fā)送消息時,會自動創(chuàng)建一個分區(qū)數(shù)為num.partitions(默認(rèn)值為1)据悔、副本因子為default.replication.factor(默認(rèn)值為1)的主題戏溺。很多時候,這種自動創(chuàng)建主題的行為都是非預(yù)期的屠尊。除非有特殊應(yīng)用需求旷祸,否則不建議將auto.create.topics.enable設(shè)置為true。

????????更加推薦的是通過kafka-topics.sh腳本來創(chuàng)建主題讼昆。

? bin/kafka-topics.sh? --zookeeper localhost:2181/kafka? --create? --topic topic-create? --partion 4 --replication-factor 2

????????上面是創(chuàng)建分區(qū)數(shù)為4托享,副本因子是2的主題〗眨可以通過describe指令類型來查看分區(qū)副本的分配細(xì)節(jié)闰围。

????bin/kafka-topics.sh? --zookeeper localhost:2181/kafka? --describe? --topic topic-create

????????上述創(chuàng)建主題的時候,分區(qū)副本都是按照既定的內(nèi)部邏輯來進(jìn)行分配的既峡。kafka-topics.sh腳本還提供了一個replica-assignment參數(shù)來手動指定分區(qū)副本的分配方案羡榴。

????????bin/kafka-topics.sh? --zookeeper localhost:2181/kafka? --create? --topic topic-create? --replica-assignment 2:2,0:1,1:2,2:1

????????代表了主題中每個分區(qū)在broker的分配情況。

1.2运敢、分區(qū)副本的分配

????????生產(chǎn)者的分區(qū)分配是指為每條消息指定其要發(fā)往的分區(qū)校仑,消費(fèi)者的分區(qū)分配是指為消費(fèi)者指定其可以消費(fèi)消息的分區(qū),而這里的分區(qū)分配是指為集群指定創(chuàng)建主題時的分區(qū)分配方案传惠,即在哪個broker中創(chuàng)建哪些分區(qū)的副本迄沫。

????????如果指定了replica-assignment參數(shù),那么就按照指定的方案來進(jìn)行分區(qū)副本的創(chuàng)建卦方。如果沒有使用羊瘩,則按照內(nèi)部分配邏輯來計(jì)算分區(qū)分配方案。

1.3、修改主題

????????當(dāng)一個主題被創(chuàng)建后尘吗,依然允許我們進(jìn)行一些修改逝她,比如修改分區(qū)數(shù)量、修改配置等睬捶,都是通過alter指令完成黔宛。

????????bin/kafka-topics.sh? --zookeeper localhost:2181/kafka? --alter? --topic topic-create --partition 3

????????比如上述的修改分區(qū)數(shù)量。不過要注意的是侧戴,分區(qū)數(shù)量修改之后宁昭,如果是key強(qiáng)相關(guān)的業(yè)務(wù)會受到影響,修改分區(qū)數(shù)量要謹(jǐn)慎酗宋。

????????目前kafak只支持增加分區(qū)數(shù)量积仗,不支持減少分區(qū)數(shù)量,原因

????????按照現(xiàn)在的代碼邏輯蜕猫,此功能完全可以實(shí)現(xiàn)寂曹,為什么不這樣做。因?yàn)閷?shí)現(xiàn)此功能需要考慮的因素太多回右。比如被刪除的分區(qū)中的消息如何處理隆圆?如果隨著分區(qū)一起消失則消息的可靠性得不到保障,如果需要保留怎么保留呢翔烁?如果直接存儲到現(xiàn)有的分區(qū)尾部渺氧,消息的時間戳就不會遞增,如此對于Spark這類需要時間戳的組建會受到影響蹬屹,如果分散插入現(xiàn)有的分區(qū)侣背,那么在消息量很大的時候,內(nèi)部的數(shù)據(jù)復(fù)制會占用很大的資源慨默,而且在復(fù)制期間贩耐,主題的可靠性怎么得到保障呢?因此厦取,這個功能的收益點(diǎn)是很低的潮太。

????????除了修改分區(qū)數(shù),alter指令還可以修改主題的配置虾攻,比如修改max.message.bytes從10000修改到20000铡买。

????????bin/kafka-topics.sh? --zookeeper localhost:2181/kafka? --alter? --topic topic-create --config max.message.bytes=20000

2、分區(qū)的管理

????????Kafka雖然通過多副本機(jī)制來提高可靠性台谢,但是Kafka只有l(wèi)eader副本負(fù)責(zé)讀寫寻狂,follower副本只負(fù)責(zé)在內(nèi)部進(jìn)行消息的同步。也就是說朋沮,Kafka并不實(shí)現(xiàn)類似redis、數(shù)據(jù)庫等讀寫分離功能。

????????在創(chuàng)建分區(qū)的時候樊拓,分區(qū)的副本都會盡可能均勻分配到Kafka集群的各個節(jié)點(diǎn)上纠亚。對應(yīng)的leader副本分配也會比較平均。Kafka集群的一個broker中最多只能有它的一個副本筋夏。

????????隨著時間的更替蒂胞,broker不可避免的會出現(xiàn)宕機(jī)的問題,當(dāng)分區(qū)的broke節(jié)點(diǎn)發(fā)生故障的時候条篷,其中一個follower節(jié)點(diǎn)就會成為新的leader節(jié)點(diǎn)骗随,這樣會導(dǎo)致集群的負(fù)載不均衡。(比如一個broker上的leader副本會多一些赴叹,其他broker上的leader副本少一些鸿染,畢竟只有l(wèi)eader節(jié)點(diǎn)負(fù)責(zé)讀寫,有的broker節(jié)點(diǎn)就會負(fù)載高一點(diǎn))乞巧。

????????為了能有效得治理負(fù)載失衡的情況涨椒,Kafka引進(jìn)了優(yōu)先副本的概念。比如分區(qū)0的AR集合是[1,2,0]绽媒,那么分區(qū)0的優(yōu)先副本就是broker1蚕冬。理想情況下,優(yōu)先副本就應(yīng)該是leader副本是辕。

????????所謂的優(yōu)先副本選舉就是通過一定的方式促使優(yōu)先副本選舉為leader副本囤热,以此來達(dá)到集群的負(fù)載的均衡,也叫“分區(qū)平衡”获三。但是分區(qū)平衡并不意味著Kafka 集群的負(fù)載均衡旁蔼,因?yàn)檫€要考慮到集群中的分區(qū)分配是否據(jù)哼。比如有的leader副本負(fù)載很高石窑,TPS有3000多牌芋,有的很低。

????????這里很多內(nèi)容不細(xì)究松逊。躺屁。。经宏。犀暑。。烁兰。耐亏。。沪斟。广辰。。

3、如何選擇合適的分區(qū)數(shù)

3.1择吊、性能測試工具

????????生產(chǎn)者的性能測試工具kafka-producer-perf-test.sh李根,消費(fèi)者性能測試工具kafka-consumer-perf-test.sh。

????????bin/kafka-producer-perf-test.sh --topic topic-test --num-records 100000 --record-size 1024 --throught 1 -- producer-props bootstrap.servers-localhost:9092 acks=1

????????上面就是測試生產(chǎn)者几睛。打印的數(shù)據(jù)是:

????????502 records sent, 100.3records/sec(0.10 MB/sec), 2.5ms avg latency, 266.0 max lantcy

????????501 records sent, 99.5records/sec(0.10 MB/sec), 2.5ms avg latency, 266.0 max lantcy

????????可以看到發(fā)送數(shù)據(jù)的效率房轿。

3.2、分區(qū)數(shù)越高吞吐量越高嗎

????????理論上所森,如果一個主題中的分區(qū)數(shù)越多囱持,理論上所能達(dá)到的吞吐量就越大。實(shí)際上不是這樣的焕济,會有一個閾值纷妆,超過這個閾值吞吐量反而會下降。

3.3吼蚁、分區(qū)數(shù)的上限

????????如果創(chuàng)建1萬個分區(qū)的主題凭需,你會發(fā)現(xiàn)Kafka進(jìn)程要崩潰。是內(nèi)存不足嗎肝匆,其實(shí)不是的粒蜈,這點(diǎn)內(nèi)存還不足以讓Kafka“畏懼”。

????????我們會發(fā)現(xiàn)服務(wù)日志中出現(xiàn)大量的異常: Too many open files旗国。

????????主要是受限于Linux系統(tǒng)文件描述符不足枯怖。

????????當(dāng)然可以修改系統(tǒng)的文件描述符,具體不細(xì)究能曾。

3.4度硝、考量因素

????????從吞吐量考慮,增加合適的分區(qū)數(shù)可以在一定程度上提升吞吐量寿冕,但超過對應(yīng)的閾值后吞吐量不升反降蕊程。如果對吞吐量有一定要求,則建議在投入生產(chǎn)環(huán)境之前做吞吐量相關(guān)的測試驼唱。

????????在創(chuàng)建topic之后藻茂,我們確實(shí)還可以增加分區(qū)數(shù),但是基于key計(jì)算的主題需要謹(jǐn)慎對待玫恳。對于和key高關(guān)聯(lián)的應(yīng)用辨赐,在常見主題的時候可以適當(dāng)去多創(chuàng)建一些分區(qū),以備長遠(yuǎn)打算京办。

????????分區(qū)數(shù)的多少還會影響系統(tǒng)的可用性掀序。分區(qū)在leader角色切換的過程中會變得不可用,不過對于單個分區(qū)來說這個過程非常短暫惭婿,但是如果集群中某個broker節(jié)點(diǎn)宕機(jī)不恭,那么就會有大量的leader角色切換叶雹,這個切換過程會消耗很大一筆時間,并且在整個時間窗口內(nèi)這些分區(qū)也會變得不可用县袱。

????????如何選擇合適的分區(qū)數(shù)浑娜?從某種意義上來說佑力,要取決于實(shí)戰(zhàn)經(jīng)驗(yàn)式散,更透徹的說,是要從Kafka本身打颤、業(yè)務(wù)使用暴拄、硬件資源等等方面綜合考慮。一般情況下编饺,根據(jù)吞吐量以及是否與key相關(guān)的規(guī)則來設(shè)定分區(qū)數(shù)即可乖篷,后期可以增加分區(qū)數(shù)、增加broker或分區(qū)重分配手段來進(jìn)行改造透且。如果有一定準(zhǔn)則撕蔼,建議將分取設(shè)定為broker數(shù)量的倍數(shù)。

4秽誊、問題

????????當(dāng)所有ISR副本都不可用時鲸沮,kafka會怎樣?unclean.leader.election.enable參數(shù)锅论,默認(rèn)為false讼溺,表示選舉leader副本是否必須從ISR中選擇,默認(rèn)是必須最易。參考文章:https://blog.csdn.net/u013256816/article/details/80790185

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怒坯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子藻懒,更是在濱河造成了極大的恐慌剔猿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嬉荆,死亡現(xiàn)場離奇詭異归敬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)员寇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門弄慰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝶锋,你說我怎么就攤上這事陆爽。” “怎么了扳缕?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵慌闭,是天一觀的道長别威。 經(jīng)常有香客問我,道長驴剔,這世上最難降的妖魔是什么省古? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮丧失,結(jié)果婚禮上豺妓,老公的妹妹穿的比我還像新娘。我一直安慰自己布讹,他們只是感情好琳拭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著描验,像睡著了一般白嘁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膘流,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天絮缅,我揣著相機(jī)與錄音,去河邊找鬼呼股。 笑死耕魄,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卖怜。 我是一名探鬼主播屎开,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼马靠!你這毒婦竟也來了奄抽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤甩鳄,失蹤者是張志新(化名)和其女友劉穎逞度,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妙啃,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡档泽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揖赴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馆匿。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖燥滑,靈堂內(nèi)的尸體忽然破棺而出渐北,到底是詐尸還是另有隱情,我是刑警寧澤铭拧,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布赃蛛,位于F島的核電站恃锉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呕臂。R本人自食惡果不足惜破托,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歧蒋。 院中可真熱鬧土砂,春花似錦、人聲如沸疏尿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥琐。三九已至,卻和暖如春晤郑,著一層夾襖步出監(jiān)牢的瞬間敌呈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工造寝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磕洪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓诫龙,卻偏偏與公主長得像析显,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子签赃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容