kafka源碼愫讀(1)、總體架構(gòu)

1蝶糯、拓?fù)浣Y(jié)構(gòu)

kafka拓?fù)浣Y(jié)構(gòu).png

2洋只、基本組成

  • Broker:一臺Kafka服務(wù)器就是一個(gè)Broker,一個(gè)集群由多個(gè)Broker組成,一個(gè)Broker可以容納多個(gè)Topic识虚,Broker和Broker之間沒有Master和Standby的概念肢扯,他們之間地位是平等的;
  • Topic:每條發(fā)送到Kafka集群的消息都屬于某個(gè)主題担锤,這個(gè)主題就稱為Topic蔚晨。物理上不同Topic的消息分開存儲(chǔ),邏輯上一個(gè)Topic的消息雖然保存在一個(gè)或多個(gè)Broker上肛循,但是用戶只需指定消息主題Topic即可生產(chǎn)或消費(fèi)數(shù)據(jù)而不需要關(guān)心數(shù)據(jù)存放在何處铭腕;
  • Partition:為了實(shí)現(xiàn)可擴(kuò)展性,一個(gè)非常大的Topic可以被分為多個(gè)Partition多糠,從而分布到多臺Broker上累舷。Partition中的每條消息都會(huì)被分配一個(gè)自增Id(Offset)。Kafka只保證按照一個(gè)Partition中的順序?qū)⑾l(fā)送給消費(fèi)者夹孔,但是不保證單個(gè)Topic中多個(gè)Partition之間的順序被盈;
  • Offset:消息在Topic的Partition中的位置,同一個(gè)Partition中的消息隨著消息的寫入其對應(yīng)的Offset也自增搭伤;
  • Replica:副本只怎,Topic的Partition有N個(gè)副本,N為副本因子闷畸。其中一個(gè)Replica為Leader尝盼,其他都為Follower,Leader處理Partition的所有讀寫請求佑菩,F(xiàn)ollower定期同步Leader上的數(shù)據(jù);
  • Message:消息是通信的基本單位裁赠。每個(gè)Producer可以向一個(gè)Topic發(fā)布消息殿漠;
  • Producer:消息生產(chǎn)者,將消息發(fā)布到指定的Topic中佩捞,也能夠決定消息所屬的Partition:比如基于Round-Robin或者Hash算法绞幌;
  • Consumer:消息消費(fèi)者,向指定的Topic獲取消息一忱,根據(jù)指定Topic的分區(qū)索引及其對應(yīng)分區(qū)上的消息偏移量來獲取消息莲蜘;
  • Consumer Group:消費(fèi)者組,每個(gè)消費(fèi)者都屬于一個(gè)組帘营。當(dāng)消費(fèi)者具有相同組時(shí)票渠,消息會(huì)在消費(fèi)者之間負(fù)載均衡。一個(gè)Partition的消息只會(huì)被相同消費(fèi)者組中的某個(gè)消費(fèi)者消費(fèi)芬迄。不同消費(fèi)者組是相互獨(dú)立的问顷;
  • Zookeeper:存放Kafka集群相關(guān)元數(shù)據(jù)的組件。Zookeeper集群中保存了Topic的狀態(tài)信息,例如分區(qū)個(gè)數(shù)杜窄、分區(qū)組成肠骆、分區(qū)的分布情況等;保存Broker的狀態(tài)信息塞耕;保存消費(fèi)者的消費(fèi)信息等蚀腿。通過這些信息,Kafka很好地將消息生產(chǎn)扫外、消息存儲(chǔ)莉钙、消息消費(fèi)的過程結(jié)合起來;

3畏浆、zk節(jié)點(diǎn)說明

kafka的zk節(jié)點(diǎn).png
  • topic注冊信息:/brokers/topics/[topic]胆胰,存儲(chǔ)topic的partitions的所有信息;

示例:

{ "version": 1, "partitions": { "0": [1, 2], "1": [2, 1], "2": [1, 2] } }

  • partition狀態(tài)信息:/brokers/topics/[topic]/partitions/[partitionId]/state刻获,存儲(chǔ)分區(qū)狀態(tài)信息蜀涨;

示例:

{ "controller_epoch": 1, "leader": 2, "version": 1, "leader_epoch": 0, "isr": [2, 1] }

  • broker注冊信息:/brokers/ids/[0...N] ,每個(gè)broker都會(huì)對應(yīng)一個(gè)全局的id蝎毡,此節(jié)點(diǎn)為臨時(shí)節(jié)點(diǎn)厚柳;

示例:

{ "jmx_port": 6061, "timestamp": "1403061899859", "version": 1, "host": "192.168.1.148", "port": 9092 }

  • ControllerEpoch信息:/controller_epoch,值為數(shù)字沐兵,每當(dāng)主controller變更時(shí)别垮,其對應(yīng)的epoch就會(huì)增大;
  • Controller注冊信息:/controller扎谎,存儲(chǔ)主控制器所在的broker節(jié)點(diǎn)信息碳想;

示例:

{ "version": 1, "brokerid": 3, "timestamp": "1403061802981" }

  • Consumer offset:/consumers/[groupId]/offsets/[topic]/[partitionId],用來跟蹤每個(gè)Consumer所消費(fèi)的分區(qū)的最大offset毁靶,此節(jié)點(diǎn)為持久化節(jié)點(diǎn)胧奔。
  • 刪除的topic信息:/admin/delete_topics,需要?jiǎng)h除的topic信息预吆;

示例:

{ "version": 1, "topics": ["foo", "bar"] }

  • Topic配置信息:/config/topics/[topic_name]

示例:

{ "version": 1, "config": { "config.a": "x", "config.b": "y" } }

4龙填、Broker模塊

kafka的server模塊.png

kafka集群一般由多個(gè) broker 節(jié)點(diǎn)構(gòu)成,Kafka 會(huì)從中選舉一個(gè) broker 節(jié)點(diǎn)作為 Leader 角色拐叉,并通過節(jié)點(diǎn)上運(yùn)行的 KafkaController 組件控制整個(gè)集群中各個(gè) broker 節(jié)點(diǎn)的協(xié)同運(yùn)行岩遗,以統(tǒng)一對外提供服務(wù)。就單個(gè) broker 節(jié)點(diǎn)而言凤瘦,Kafka 會(huì)為節(jié)點(diǎn)綁定一個(gè) Acceptor宿礁,用于接收來自客戶端和其它 broker 節(jié)點(diǎn)的連接,Processor 組件會(huì)從這些連接中獲取請求并交由 Handler 線程進(jìn)行處理廷粒。Handler 基于 KafkaApis 組件解析具體的請求類型并分發(fā)給具體的組件窘拯,同時(shí)負(fù)責(zé)構(gòu)造和發(fā)送響應(yīng)結(jié)果红且。KafkaApis組件使用LogManager、ReplicaManager 和 GroupCoordinator等組件完成協(xié)議的處理涤姊。

  • SocketServer:首先開啟一個(gè)Acceptor線程來監(jiān)聽9092端口暇番,當(dāng)有新連接建立成功時(shí),會(huì)將對應(yīng)的SocketChannel輪詢交由Processor線程池中的某個(gè)線程處理思喊。Processor線程會(huì)監(jiān)聽客戶端網(wǎng)絡(luò)上的的讀寫事件壁酬,當(dāng)有讀事件時(shí),會(huì)讀取數(shù)據(jù)并放入RequestChannel的請求隊(duì)列恨课;當(dāng)有數(shù)據(jù)發(fā)送時(shí)舆乔,會(huì)從RequestChannel的相應(yīng)隊(duì)列讀取并發(fā)送給客戶端;
  • KafkaRequestHandlerPool:處理Socket讀寫請求的線程池剂公,線程KafkaRequestHandler從RequestChannel的請求隊(duì)列中獲取請求希俩,然后調(diào)用KafkaApis處理業(yè)務(wù)邏輯,最后將響應(yīng)回寫只RequestChannel中的響應(yīng)隊(duì)列纲辽,并最終交由SocketServer中的Processor線程發(fā)送給客戶端颜武;
  • LogManager:日志管理模塊。提供日志文件管理拖吼,索引文件管理鳞上,刪除過期數(shù)據(jù)及冗余數(shù)據(jù)、刷新臟數(shù)據(jù)吊档、日志文件checkPoint等功能篙议;
  • ReplicaManager:副本管理模塊。提供Topic的副本分區(qū)管理怠硼,Leader及ISR狀態(tài)管理鬼贱,副本變更管理等;
  • OffsetManager:偏移量管理模塊香璃。提供對偏移量的管理功能吩愧;
  • GroupCoordinator:消費(fèi)分組協(xié)調(diào)模塊。主要提供對消費(fèi)者分組內(nèi)分區(qū)的分配管理增显,維護(hù)分組內(nèi)消費(fèi)偏移量等;
  • KafkaScheduler:后臺任務(wù)資源調(diào)度模塊脐帝。主要為LogManager同云、ReplicaManager、OffsetManager等提供定期的任務(wù)調(diào)用服務(wù)堵腹;
  • KafkaApis:kafka業(yè)務(wù)邏輯實(shí)現(xiàn)模塊炸站。根據(jù)不同的Request,利用LogManager疚顷、ReplicaManager旱易、OffsetManager等來處理具體的業(yè)務(wù)邏輯禁偎。
  • KafkaHealthCheck:broker在/brokers/ids上注冊自己的id,當(dāng)broker上/下線的時(shí)候會(huì)在更新自己的id阀坏;
  • TopicConfigManager:在/config/changes上注冊自己的回調(diào)函數(shù)來監(jiān)測Topic配置信息的變更如暖;
  • KafkaController:集群控制管理模塊。集群元數(shù)據(jù)信息保存在zk上忌堂,此模塊通過在不同的節(jié)點(diǎn)注冊回調(diào)函數(shù)來達(dá)到監(jiān)測集群狀態(tài)的目的盒至;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市士修,隨后出現(xiàn)的幾起案子枷遂,更是在濱河造成了極大的恐慌,老刑警劉巖棋嘲,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酒唉,死亡現(xiàn)場離奇詭異,居然都是意外死亡沸移,警方通過查閱死者的電腦和手機(jī)痪伦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阔籽,“玉大人流妻,你說我怎么就攤上這事“手疲” “怎么了绅这?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長在辆。 經(jīng)常有香客問我证薇,道長,這世上最難降的妖魔是什么匆篓? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任浑度,我火速辦了婚禮,結(jié)果婚禮上鸦概,老公的妹妹穿的比我還像新娘箩张。我一直安慰自己,他們只是感情好窗市,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布先慷。 她就那樣靜靜地躺著,像睡著了一般咨察。 火紅的嫁衣襯著肌膚如雪论熙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天摄狱,我揣著相機(jī)與錄音脓诡,去河邊找鬼无午。 笑死,一個(gè)胖子當(dāng)著我的面吹牛祝谚,可吹牛的內(nèi)容都是我干的宪迟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼踊跟,長吁一口氣:“原來是場噩夢啊……” “哼踩验!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起商玫,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤箕憾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拳昌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袭异,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年炬藤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了御铃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沈矿,死狀恐怖上真,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羹膳,我是刑警寧澤睡互,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站陵像,受9級特大地震影響就珠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜醒颖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一妻怎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泞歉,春花似錦逼侦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沟优,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睬辐,已是汗流浹背挠阁。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工宾肺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侵俗。 一個(gè)月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓锨用,卻偏偏與公主長得像,于是被迫代替她去往敵國和親隘谣。 傳聞我的和親對象是個(gè)殘疾皇子增拥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

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