(六)kafka負(fù)載均衡機(jī)制
A. 服務(wù)端broker負(fù)載均衡機(jī)制
- 概述:生產(chǎn)者、消費(fèi)者真實(shí)對(duì)應(yīng)的實(shí)體是partition的leader副本,因此broker的負(fù)載均衡取決于leader副本分布是否均勻。
1. leader副本的均衡分布實(shí)現(xiàn)
-
初始分布
- 若共有5臺(tái)brokers,創(chuàng)建一個(gè)分區(qū)數(shù)partition為5且副本數(shù)replicas數(shù)為3的topicA。
- 具體的partition下0 - 4的leader副本分布順序?qū)?yīng)broker0 - 4,并將follower副本依次放在后兩位broker。比如:partition0的follower副本放在broker1 & 2上。
-
分布結(jié)果AR:AR = ISR +OSR
分區(qū)名 副本所在的broker列表 備注 topicA-partition0 0,1,2 leader副本在broker0 topicA-partition1 1,2,3 leader副本在broker1 topicA-partition2 2,3,4 leader副本在broker2 topicA-partition3 3,4,0 leader副本在broker3 topicA-partition4 4,0,1 leader副本在broker4 優(yōu)先副本:broker列表中,第一個(gè)即為優(yōu)先副本,優(yōu)先選擇其為leader副本。
2. 分區(qū)自動(dòng)重平衡
- 場(chǎng)景概述:隨著時(shí)間推移、集群狀態(tài)變化,leader副本或多或少會(huì)有遷移或切換,導(dǎo)致部分broker上的leader副本偏多。
-
auto.leader.rebalance.enable:該參數(shù)默認(rèn)開啟,使集群中的controller啟動(dòng)定時(shí)任務(wù),默認(rèn)每隔5min輪詢所有brokers,計(jì)算每一個(gè)節(jié)點(diǎn)的分區(qū)不平衡率,默認(rèn)閾值為10%,高于該值會(huì)觸發(fā)分區(qū)遷移。 - 分區(qū)不平衡率
- 計(jì)算公式:分區(qū)不平衡率 = 當(dāng)前broker的非優(yōu)先副本leader個(gè)數(shù) / 當(dāng)前broker分區(qū)總數(shù)。
- 案例場(chǎng)景:broker0上原本僅有topicA-partition0,3 & 4三個(gè)副本,其中0是優(yōu)先副本也是leader副本。后來(lái)broker4宕機(jī)了,所以topicA-partition4此時(shí)將leader副本從broker4轉(zhuǎn)移到broker0上,此時(shí)broker0依然擁有3個(gè)副本,但是topicA-partition4變成leader副本(非優(yōu)先副本),此時(shí)分區(qū)不平衡率為1/3,若broker4后續(xù)恢復(fù)后,觸發(fā)分區(qū)自動(dòng)遷移機(jī)制。
- 自動(dòng)遷移可能會(huì)影響性能,可手動(dòng)腳本kafka-preferred-replica-election.sh執(zhí)行該操作。
3. broker負(fù)載不均衡常見(jiàn)場(chǎng)景
- 集群狀態(tài)變化導(dǎo)致leader切換,但默認(rèn)開啟分區(qū)自動(dòng)重平衡,無(wú)須過(guò)分擔(dān)心。
- kafka當(dāng)前負(fù)載最大痛點(diǎn)即新增broker后,若沒(méi)有新建topic或者是將老的topic遷移分區(qū),則該broker不會(huì)有任何流量。需手動(dòng)完成分區(qū)重新分配 & 數(shù)據(jù)遷移。
- kafka設(shè)置了
broker.rack,分區(qū)算法從本來(lái)順延方法調(diào)整為盡量避免副本在同一個(gè)機(jī)架上,可能導(dǎo)致分配不均。
B. 生產(chǎn)者producer負(fù)載均衡機(jī)制
- 概述:生產(chǎn)端的負(fù)載均衡就是保障生產(chǎn)消息發(fā)往哪個(gè)partition(leader副本)。
- 手段
- 無(wú)key:基于輪訓(xùn)算法,計(jì)算發(fā)往的具體partition。
- 有key:hash計(jì)算目標(biāo)partition,不論partition是否活躍。
- Producer負(fù)載不均衡常見(jiàn)場(chǎng)景
- 生產(chǎn)者指定了key,創(chuàng)建topic時(shí)分區(qū)器選擇指定key的模式,會(huì)將消息定向發(fā)給具體的broker上導(dǎo)致leader不平均。
- 業(yè)務(wù)使用上,個(gè)別topic的流量遠(yuǎn)大于其他topic。
C. 消費(fèi)者consumer負(fù)載均衡機(jī)制
- 概述:若topic共有100w數(shù)據(jù),消費(fèi)組共有4個(gè)消費(fèi)者,消費(fèi)者端的負(fù)載均衡就是想辦法保障讓每個(gè)消費(fèi)者拉取25w條數(shù)據(jù)。
- 手段:消費(fèi)端的實(shí)體是partition(leader副本),需要把partition均勻分配給消費(fèi)組內(nèi)的consumer。
-
partition.assignment.strategy:重平衡時(shí)在所有consumer都發(fā)送完join_group后broker響應(yīng)后,消費(fèi)組中l(wèi)eader發(fā)出sync_group時(shí)采用的分區(qū)分配策略參數(shù)。 - 策略類型
- 默認(rèn)類型為rangeAssignor
- 輪詢分配roundRobinAssignor
- 當(dāng)前最優(yōu)解stickyAssignor
-
- Consumer負(fù)載不均衡常見(jiàn)場(chǎng)景
- 分區(qū)分配策略不佳,導(dǎo)致負(fù)載不均。
- 業(yè)務(wù)使用問(wèn)題,個(gè)別topic流量遠(yuǎn)大于其他topic。