Controller
一、概念
在Kafka中,Controller是Kafka集群中的一個(gè)角色,負(fù)責(zé)管理集群的元數(shù)據(jù)、分區(qū)分配、副本管理等功能。
Controller的主要職責(zé)包括:
1. 元數(shù)據(jù)管理:Controller負(fù)責(zé)維護(hù)Kafka集群的元數(shù)據(jù),包括broker的存活狀態(tài)、分區(qū)的分配情況、副本的分配情況等。它通過(guò)與Zookeeper進(jìn)行交互,監(jiān)控集群中broker的狀態(tài)變化,并更新集群的元數(shù)據(jù)。
通俗的講,就是當(dāng)Controller檢測(cè)到某個(gè)分區(qū)的ISR集合發(fā)生變化時(shí),由Controller負(fù)責(zé)通知所有Broker更新其元數(shù)據(jù)信息
2. 分區(qū)分配:當(dāng)有新的topic創(chuàng)建或者有新的broker加入集群時(shí),Controller根據(jù)一定的策略來(lái)進(jìn)行分區(qū)分配。它會(huì)根據(jù)集群的負(fù)載情況、副本的分布情況等因素,將分區(qū)均勻地分配給各個(gè)broker。
3. 副本管理:Controller負(fù)責(zé)管理副本的狀態(tài)和分配情況。它會(huì)監(jiān)控副本的健康狀態(tài),當(dāng)副本出現(xiàn)故障或離線時(shí),Controller會(huì)接管該副本的分區(qū),并重新分配該副本的副本。比如Leader副本掛了,Controller會(huì)去查看ISR中存的分區(qū),排在第一位的肯定是上一個(gè)Leader副本,后面的是理論上網(wǎng)絡(luò)狀態(tài)更優(yōu)的分區(qū),那么Controller,會(huì)將這個(gè)分區(qū)升級(jí)成Leader
4. 集群狀態(tài)管理:Controller會(huì)監(jiān)控整個(gè)集群的狀態(tài),并且在集群出現(xiàn)故障或者變化時(shí)做出相應(yīng)的調(diào)整。例如,當(dāng)集群中的broker宕機(jī)時(shí),Controller會(huì)觸發(fā)副本重新分配,確保分區(qū)的高可用性。
二、Controller選舉流程
Kafaka集群在啟動(dòng)的時(shí)候,會(huì)在Zookeeper中創(chuàng)建一個(gè)臨時(shí)序號(hào)節(jié)點(diǎn),序號(hào)最小的也就是最先啟動(dòng)的Broker節(jié)點(diǎn),被認(rèn)定為是Controller,繼續(xù)管理集群中的相關(guān)數(shù)據(jù)、分區(qū)的分配等功能
Rebalance
一、Rebalance機(jī)制
Kafka的Rebalance機(jī)制是一種自動(dòng)化的重平衡過(guò)程,用于在Consumer Group中的消費(fèi)者數(shù)量或消費(fèi)的分區(qū)數(shù)發(fā)生變化時(shí)重新分配消費(fèi)者和分區(qū)之間的關(guān)系。Rebalance機(jī)制確保了Consumer Group中的所有消費(fèi)者能夠均勻地分配訂閱的主題分區(qū),并保持負(fù)載均衡。
當(dāng)Consumer Group中的消費(fèi)者數(shù)量發(fā)生變化,或者消費(fèi)的分區(qū)數(shù)發(fā)生變化時(shí),Kafka會(huì)自動(dòng)觸發(fā)Rebalance過(guò)程。例如,當(dāng)某個(gè)消費(fèi)者實(shí)例掛掉時(shí),Kafka會(huì)自動(dòng)將該消費(fèi)者所擁有的分區(qū)重新分配給其他消費(fèi)者實(shí)例。同樣地,當(dāng)新加入的消費(fèi)者實(shí)例加入Consumer Group時(shí),Kafka也會(huì)重新分配分區(qū)給新加入的實(shí)例。
Rebalance過(guò)程中,消費(fèi)者無(wú)法從Kafka讀取消息,因此會(huì)對(duì)Kafka的TPS(每秒傳輸?shù)南⒘浚┊a(chǎn)生影響。如果Kafka集群中有大量的節(jié)點(diǎn),例如數(shù)百個(gè)節(jié)點(diǎn),那么重平衡可能會(huì)耗時(shí)極多,因此應(yīng)盡量避免在系統(tǒng)高峰期的重平衡發(fā)生。
為了優(yōu)化Rebalance過(guò)程,可以通過(guò)設(shè)置合理的配置參數(shù)來(lái)控制Rebalance的行為。例如,可以設(shè)置max.poll.interval.ms參數(shù)來(lái)控制消費(fèi)者在發(fā)生Rebalance時(shí)等待分區(qū)重新分配的最長(zhǎng)時(shí)間,以避免長(zhǎng)時(shí)間無(wú)法讀取消息。
總之,Kafka的Rebalance機(jī)制提供了一種自動(dòng)化的方式來(lái)處理Consumer Group中的消費(fèi)者和分區(qū)變化,確保了負(fù)載均衡和系統(tǒng)的可用性。
二、Rebalance機(jī)制重新分配細(xì)節(jié)
觸發(fā)Rebalance機(jī)前提:
消費(fèi)者沒有指明分區(qū)消費(fèi),當(dāng)消費(fèi)組里的消費(fèi)者和分區(qū)的關(guān)系發(fā)生變化,那么就會(huì)觸發(fā)Rebalance機(jī)制,這個(gè)機(jī)制會(huì)重新調(diào)整消費(fèi)者消費(fèi)哪個(gè)分區(qū)。
在觸發(fā)Rebalance機(jī)制前,消費(fèi)者在哪個(gè)分區(qū)消費(fèi),有下面3種策略:
1、range范圍分配:
在Kafka中,消費(fèi)者消費(fèi)分區(qū)的策略有多種,其中一種默認(rèn)的分配策略是Range范圍分配。這種策略可以確保每個(gè)消費(fèi)者消費(fèi)的分區(qū)數(shù)量是均衡的。
以下是Kafka中Range范圍分配的示例公式:
n = 分區(qū)數(shù)量 / 消費(fèi)者數(shù)量
m = 分區(qū)數(shù)量 % 消費(fèi)者數(shù)量
前m個(gè)消費(fèi)者消費(fèi)n+1個(gè)分區(qū),剩余消費(fèi)者消費(fèi)n個(gè)分區(qū)。
需要注意的是,Range范圍分配策略是針對(duì)每個(gè)主題(topic)的。要配置消費(fèi)者的分區(qū)分配策略為Range范圍分配,需要將消費(fèi)者的partition.assignment.strategy配置為org.apache.kafka.clients.consumer.RangeAssignor。
2、輪詢:輪著消費(fèi)
3、sticky:在觸發(fā)Rebalance后,在消費(fèi)者消費(fèi)的原分區(qū)不變的基礎(chǔ)上進(jìn)行調(diào)整,不會(huì)改變之前的分配。如果這個(gè)策略沒有開,那么就要全部進(jìn)行重新分配,非常消耗性能,建議開啟
HW
一、HW介紹
在Kafka中,HW(High Watermark)“高水位”是一個(gè)關(guān)鍵概念,用于表示消息復(fù)制的進(jìn)度。具體來(lái)說(shuō),HW表示已經(jīng)成功復(fù)制到所有副本的消息的位置。
HW之前的所有消息都被認(rèn)為是已提交的消息,這意味著消費(fèi)者可以安全地消費(fèi)這些消息。消費(fèi)者最多只能消費(fèi)到HW所在的位置,另外每個(gè)副本都有HW,
Leader和Follower各自更新自己的HW狀態(tài),對(duì)于Leader重新寫入消息,消費(fèi)者不能立即消費(fèi),Leader會(huì)等待該消息被所有ISR中的副本同步并更新HW,
此時(shí)消息才能被消費(fèi)者消費(fèi)。這樣就保證了如果Leader所在的Broker失效掛掉了,不會(huì)在新的Leader副本中重復(fù)消費(fèi)
二、HW圖示
根據(jù)上圖所示,為了防止消息丟失,保證消費(fèi)者的安全消費(fèi)。只有當(dāng)Leader副本將消息同步到其他所有的副本后,HW才會(huì)下移動(dòng),才能消費(fèi)到第5條消息,
否則只能消費(fèi)到第4條消息
LEO
Kafka中的LEO(Log End Offset)表示當(dāng)前日志文件中下一條待寫入消息的offset。每個(gè)partition的log最后一條Message的位置都會(huì)有一個(gè)LEO。它用于標(biāo)識(shí)消息追加到文件的最后位置。
此外,LEO還是Log End Offset的縮寫,用于標(biāo)識(shí)當(dāng)前副本中最后一條消息的offset。當(dāng)生產(chǎn)者向Leader副本追加消息時(shí),Leader副本的LEO標(biāo)記會(huì)增加;當(dāng)Follower副本成功從Leader副本拉取消息并更新到本地時(shí),F(xiàn)ollower副本的LEO也會(huì)增加。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-803667.html
至此,關(guān)于Kafka的常見關(guān)鍵技術(shù)點(diǎn)介紹完畢,知識(shí)點(diǎn)較多,希望大家能夠反復(fù)學(xué)習(xí),常學(xué)常新奧!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-803667.html
到了這里,關(guān)于Kafka篇——Kafka集群Controller、Rebalance和HW的詳細(xì)介紹,保姆級(jí)教程!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!