kafka的每個(gè)topic都可以創(chuàng)建多個(gè)partition啦撮,partition的數(shù)量無(wú)上限幅慌,并不會(huì)像replica一樣受限于broker的數(shù)量姑丑,因此partition的數(shù)量可以隨心所欲的設(shè)置集嵌。那確定partition的數(shù)量就需要思考一些權(quán)衡因素。
越多的partition可以提供更高的吞吐量
在kafka中,單個(gè)partition是kafka并行操作的最小單元。每個(gè)partition可以獨(dú)立接收推送的消息以及被consumer消費(fèi),相當(dāng)于topic的一個(gè)子通道沈条,partition和topic的關(guān)系就像高速公路的車(chē)道和高速公路的關(guān)系一樣,起始點(diǎn)和終點(diǎn)相同诅炉,每個(gè)車(chē)道都可以獨(dú)立實(shí)現(xiàn)運(yùn)輸蜡歹,不同的是kafka中不存在車(chē)輛變道的說(shuō)法,入口時(shí)選擇的車(chē)道需要從一而終涕烧。而kafka的吞吐量顯而易見(jiàn)月而,在資源足夠的情況下,partition越多速度越快议纯。
這里提到的資源充足解釋一下父款,假設(shè)我現(xiàn)在一個(gè)partition的最大傳輸速度為p,目前kafka集群共有三個(gè)broker瞻凤,每個(gè)broker的資源足夠支撐三個(gè)partition最大速度傳輸憨攒,那我的集群最大傳輸速度為3*3*p=9p,假設(shè)在不增加資源的情況下將partition增加到18個(gè)阀参,每個(gè)partition只能以p/2的速度傳輸數(shù)據(jù)肝集,因此傳輸速度上限還是9p,并不能再提升结笨,因此吞吐量的設(shè)計(jì)需要考慮broker的資源上限包晰。當(dāng)然,kafka跟其他集群一樣炕吸,可以橫向擴(kuò)展,再增加三個(gè)相同資源的broker勉痴,那傳輸速度即可達(dá)到18p赫模。
越多的分區(qū)需要打開(kāi)更多的文件句柄
在kafka的broker中,每個(gè)分區(qū)都會(huì)對(duì)照著文件系統(tǒng)的一個(gè)目錄蒸矛。
在kafka的數(shù)據(jù)日志文件目錄中瀑罗,每個(gè)日志數(shù)據(jù)段都會(huì)分配兩個(gè)文件,一個(gè)索引文件和一個(gè)數(shù)據(jù)文件雏掠。因此乡话,隨著partition的增多屋群,需要的文件句柄數(shù)急劇增加降狠,必要時(shí)需要調(diào)整操作系統(tǒng)允許打開(kāi)的文件句柄數(shù)柏肪。
更多的分區(qū)會(huì)導(dǎo)致端對(duì)端的延遲
kafka端對(duì)端的延遲為producer端發(fā)布消息到consumer端消費(fèi)消息所需的時(shí)間,即consumer接收消息的時(shí)間減去produce發(fā)布消息的時(shí)間。kafka在消息正確接收后才會(huì)暴露給消費(fèi)者,即在保證in-sync副本復(fù)制成功之后才會(huì)暴露辆苔,瓶頸則來(lái)自于此菲驴。在一個(gè)broker上的副本從其他broker的leader上復(fù)制數(shù)據(jù)的時(shí)候只會(huì)開(kāi)啟一個(gè)線程巧涧,假設(shè)partition數(shù)量為n,每個(gè)副本同步的時(shí)間為1ms,那in-sync操作完成所需的時(shí)間即n*1ms婿失,若n為10000哩照,則需要10秒才能返回同步狀態(tài),數(shù)據(jù)才能暴露給消費(fèi)者懒浮,這就導(dǎo)致了較大的端對(duì)端的延遲飘弧。
越多的partition意味著需要更多的內(nèi)存
在新版本的kafka中可以支持批量提交和批量消費(fèi),而設(shè)置了批量提交和批量消費(fèi)后砚著,每個(gè)partition都會(huì)需要一定的內(nèi)存空間次伶。假設(shè)為100k,當(dāng)partition為100時(shí)稽穆,producer端和consumer端都需要10M的內(nèi)存冠王;當(dāng)partition為100000時(shí),producer端和consumer端則都需要10G內(nèi)存舌镶。無(wú)限的partition數(shù)量很快就會(huì)占據(jù)大量的內(nèi)存柱彻,造成性能瓶頸。
越多的partition會(huì)導(dǎo)致更長(zhǎng)時(shí)間的恢復(fù)期
kafka通過(guò)多副本復(fù)制技術(shù)餐胀,實(shí)現(xiàn)kafka的高可用性和穩(wěn)定性哟楷。每個(gè)partition都會(huì)有多個(gè)副本存在于多個(gè)broker中,其中一個(gè)副本為leader骂澄,其余的為follower吓蘑。當(dāng)kafka集群其中一個(gè)broker出現(xiàn)故障時(shí),在這個(gè)broker上的leader會(huì)需要在其他broker上重新選擇一個(gè)副本啟動(dòng)為leader坟冲,這個(gè)過(guò)程由kafka controller來(lái)完成,主要是從Zookeeper讀取和修改受影響partition的一些元數(shù)據(jù)信息溃蔫。
通常情況下健提,當(dāng)一個(gè)broker有計(jì)劃的停機(jī)上,該broker上的partition leader會(huì)在broker停機(jī)前有次序的一一移走伟叛,假設(shè)移走一個(gè)需要1ms私痹,10個(gè)partition leader則需要10ms,這影響很小,并且在移動(dòng)其中一個(gè)leader的時(shí)候紊遵,其他九個(gè)leader是可用的账千,因此實(shí)際上每個(gè)partition leader的不可用時(shí)間為1ms。但是在宕機(jī)情況下暗膜,所有的10個(gè)partition
leader同時(shí)無(wú)法使用匀奏,需要依次移走,最長(zhǎng)的leader則需要10ms的不可用時(shí)間窗口学搜,平均不可用時(shí)間窗口為5.5ms娃善,假設(shè)有10000個(gè)leader在此宕機(jī)的broker上,平均的不可用時(shí)間窗口則為5.5s瑞佩。
更極端的情況是聚磺,當(dāng)時(shí)的broker是kafka controller所在的節(jié)點(diǎn),那需要等待新的kafka leader節(jié)點(diǎn)在投票中產(chǎn)生并啟用炬丸,之后新啟動(dòng)的kafka leader還需要從zookeeper中讀取每一個(gè)partition的元數(shù)據(jù)信息用于初始化數(shù)據(jù)瘫寝。在這之前partition leader的遷移一直處于等待狀態(tài)。
總結(jié)
通常情況下稠炬,越多的partition會(huì)帶來(lái)越高的吞吐量焕阿,但是同時(shí)也會(huì)給broker節(jié)點(diǎn)帶來(lái)相應(yīng)的性能損耗和潛在風(fēng)險(xiǎn),雖然這些影響很小酸纲,但不可忽略捣鲸,因此需要根據(jù)自身broker節(jié)點(diǎn)的實(shí)際情況來(lái)設(shè)置partition的數(shù)量以及replica的數(shù)量。