1蝶糯、拓?fù)浣Y(jié)構(gòu)
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)說明
- 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集群一般由多個(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)的目的盒至;