Kafka高吞吐量,就是通過partition將topic中消息存到Kafka集群不同broker中。partition并行度調(diào)優(yōu)最小單元
理論分區(qū)越多,吞吐量就越大。
一、實(shí)際分區(qū)過多弊端:
1、客戶端/服務(wù)器端需內(nèi)存就越多
1)Kafka0.8.2后,producer參數(shù)batch.size(默認(rèn)16KB),為每個(gè)分區(qū)緩存消息,積累一定大小或時(shí)間,移除發(fā)往broker。分區(qū)多,內(nèi)存占用多
2)consumer消費(fèi)線程數(shù)也增加。如10000個(gè)分區(qū),創(chuàng)建10000個(gè)線程,創(chuàng)建大約10000個(gè)Socket獲取分區(qū)數(shù)據(jù)。線程的開銷成本高
3——服務(wù)器端緩存成本大,服務(wù)器端維護(hù)controller,F(xiàn)etcherManager等
2、文件句柄的開銷
broker每個(gè)partition對(duì)應(yīng)磁盤一個(gè)目錄。每個(gè)日志數(shù)據(jù)分配索引和數(shù)據(jù)文件。打開index文件句柄和數(shù)據(jù)文件句柄。partition多,句柄數(shù)也多,超過操作系統(tǒng)文件句柄數(shù)量限制
3、能增加端對(duì)端的延遲
延遲時(shí)間:producer發(fā)送 到 consumer接收時(shí)間
? ??1)問題原因:producer消息提交后暴露。例,所有in-sync副本同步復(fù)制完才暴露。復(fù)制時(shí)間是延遲最原因。默認(rèn)broker只分配一個(gè)線程復(fù)制。
? ??2)解決:增大kafka集群緩解。例,1000個(gè)分區(qū)leader放1個(gè)/10個(gè)broker節(jié)點(diǎn),延遲差異。每個(gè)broker節(jié)點(diǎn)平均處理100個(gè)分區(qū),數(shù)十毫秒變幾毫秒
? ??3)根據(jù)經(jīng)驗(yàn),b個(gè)broker節(jié)點(diǎn)和復(fù)制因子r,整個(gè)kafka集群partition數(shù)量<=100*b*r個(gè),即單partition的leader<=100。
4、降低高可用性
partition多個(gè)副本,在不同broker,一個(gè)leader,其他follower
1)集群自動(dòng)化管理副本,通過leader確保同步。broker故障里面partition暫不可用。controller節(jié)點(diǎn)broker自動(dòng)選leader,接收請(qǐng)求。從zk讀和改影響partition元數(shù)據(jù)信息。
2)broker停止服務(wù)前,controller將該broker所有leader一個(gè)個(gè)移走。從客戶層面看,系統(tǒng)在很小時(shí)間不可用
3)broker意外停服(kill -9方式),不可用時(shí)間與受影響partition數(shù)有關(guān):如2節(jié)點(diǎn)集群2000partition,每個(gè)2個(gè)副本。一個(gè)broker宕,1000個(gè)partition同時(shí)不可用。每個(gè)partition 5ms恢復(fù),1000個(gè)5秒鐘。
4)恢復(fù)慢:如controller節(jié)點(diǎn)broker宕:選舉恢復(fù)到新broker不啟動(dòng),自動(dòng)錯(cuò)誤恢復(fù),但新的controller要從zk中讀每個(gè)partition元數(shù)據(jù)用于初始化數(shù)據(jù)。partition多不可用時(shí)間長
總之,partition多帶高吞吐量。但partition過大過多,對(duì)可用性和消息延遲帶負(fù)面影響
二、如何確定合理分區(qū)數(shù)?
partition均衡負(fù)載是吞吐量關(guān)鍵,根據(jù)生產(chǎn)和消費(fèi)者目標(biāo)吞吐量估計(jì)。
測(cè)試topic的producer和consumer吞吐量,Tp和Tc,MB/s。目標(biāo)吞吐量Tt,numPartitions = Tt / max(Tp, Tc)
https://mp.weixin.qq.com/s/0EGp8V_OwbU47nHCzUWLuA