大数据之Kafka内部原理详细介绍
- 目錄
- 前言:
- 1、Kafka整體結(jié)構(gòu)
- 2、Consumer與topic關(guān)系
- 3、Kafka消息的分發(fā)
- 4、Consumer的負(fù)載均衡
- 5、kafka文件存儲(chǔ)機(jī)制
- 總結(jié):
目錄
前言:
本篇文章所介紹的內(nèi)容還是以了解為主,主要目的還是為了對(duì)Kafka有一個(gè)更深入的理解。主要介紹了以下幾個(gè)知識(shí)點(diǎn):Kafka的負(fù)載均衡、Producer生產(chǎn)數(shù)據(jù)、Kafka文件存儲(chǔ)機(jī)制等(不過總感覺這篇文章總結(jié)的亂七八糟。。請(qǐng)大家多多包涵,隨著后面的學(xué)習(xí),自己會(huì)再回過頭來進(jìn)行修改)
1、Kafka整體結(jié)構(gòu)
Kafka名詞解釋和工作方式
- kafka:是一個(gè)生產(chǎn)-消費(fèi)模型。類JMS消息隊(duì)列,結(jié)合JMS中的兩種模式,可以有多個(gè)消費(fèi)者主動(dòng)拉取數(shù)據(jù),在JMS中只有點(diǎn)對(duì)點(diǎn)模式才有消費(fèi)者主動(dòng)拉取數(shù)據(jù)。
- Producer :消息生產(chǎn)者,就是向kafka broker發(fā)消息的客戶端。數(shù)據(jù)的分發(fā)策略由producer決定,默認(rèn)是defaultPartition Utils.abs(key.hashCode) % numPartitions
- Consumer :消息消費(fèi)者,向kafka broker取消息的客戶端
- Topic :可以理解為一個(gè)隊(duì)列或者目標(biāo)發(fā)送的目的地,這是一個(gè)邏輯上的概念,落到磁盤上是一個(gè)partition的目錄。partition的目錄中有多個(gè)segment組合(index,log),一個(gè)Topic對(duì)應(yīng)多個(gè)partition[0,1,2,3],一個(gè)partition對(duì)應(yīng)多個(gè)segment組合。一個(gè)segment有默認(rèn)的大小是1G。每個(gè)partition可以設(shè)置多個(gè)副本(replication-factor 1),會(huì)從所有的副本中選取一個(gè)leader出來。所有讀寫操作都是通過leader來進(jìn)行的。特別強(qiáng)調(diào),和mysql中主從有區(qū)別,mysql做主從是為了讀寫分離,在kafka中讀寫操作都是leader。
- Consumer Group(CG):數(shù)據(jù)消費(fèi)者組,ConsumerGroup可以有多個(gè),每個(gè)ConsumerGroup消費(fèi)的數(shù)據(jù)都是一樣的。可以把多個(gè)consumer線程劃分為一個(gè)組,組里面所有成員共同消費(fèi)一個(gè)topic的數(shù)據(jù),組員之間不能重復(fù)消費(fèi)。
- Broker :一臺(tái)kafka服務(wù)器就是一個(gè)broker。一個(gè)集群由多個(gè)broker組成。一個(gè)broker可以容納多個(gè)topic。只管數(shù)據(jù)存儲(chǔ),不管是誰生產(chǎn),不管是誰消費(fèi)。
- Partition:為了實(shí)現(xiàn)擴(kuò)展性,一個(gè)非常大的topic可以分布到多個(gè)broker(即服務(wù)器)上,一個(gè)topic可以分為多個(gè)partition,每個(gè)partition是一個(gè)有序的隊(duì)列。partition中的每條消息都會(huì)被分配一個(gè)有序的id(offset)。kafka只保證按一個(gè)partition中的順序?qū)⑾l(fā)給consumer,不保證一個(gè)topic的整體(多個(gè)partition間)的順序。
- Offset:kafka的存儲(chǔ)文件都是按照offset.kafka來命名,用offset做名字的好處是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。當(dāng)然the first offset就是00000000000.kafka。
2、Consumer與topic關(guān)系
本質(zhì)上kafka只支持Topic;
- 每個(gè)group中可以有多個(gè)consumer,每個(gè)consumer屬于一個(gè)consumer group;
通常情況下,一個(gè)group中會(huì)包含多個(gè)consumer,這樣不僅可以提高topic中消息的并發(fā)消費(fèi)能力,而且還能提高”故障容錯(cuò)”性,如果group中的某個(gè)consumer失效那么其消費(fèi)的partitions將會(huì)有其他consumer自動(dòng)接管。 - 對(duì)于Topic中的一條特定的消息,只會(huì)被訂閱此Topic的每個(gè)group中的其中一個(gè)consumer消費(fèi),此消息不會(huì)發(fā)送給一個(gè)group的多個(gè)consumer;那么一個(gè)group中所有的consumer將會(huì)交錯(cuò)的消費(fèi)整個(gè)Topic,每個(gè)group中consumer消息消費(fèi)互相獨(dú)立,我們可以認(rèn)為一個(gè)group是一個(gè)”訂閱”者。
- 在kafka中,一個(gè)partition中的消息只會(huì)被group中的一個(gè)consumer消費(fèi)(同一時(shí)刻);
一個(gè)Topic中的每個(gè)partions,只會(huì)被一個(gè)”訂閱者”中的一個(gè)consumer消費(fèi),不過一個(gè)consumer可以同時(shí)消費(fèi)多個(gè)partitions中的消息。 - kafka的設(shè)計(jì)原理決定,對(duì)于一個(gè)topic,同一個(gè)group中不能有多于partitions個(gè)數(shù)的consumer同時(shí)消費(fèi),否則將意味著某些consumer將無法得到消息。
kafka只能保證一個(gè)partition中的消息被某個(gè)consumer消費(fèi)時(shí)是順序的;事實(shí)上,從Topic角度來說,當(dāng)有多個(gè)partitions時(shí),消息仍不是全局有序的。
3、Kafka消息的分發(fā)
Producer客戶端負(fù)責(zé)消息的分發(fā)
- kafka集群中的任何一個(gè)broker都可以向producer提供metadata信息,這些metadata中包含”集群中存活的servers列表”/”partitions leader列表”等信息;
- 當(dāng)producer獲取到metadata信息之后, producer將會(huì)和Topic下所有partition
leader保持socket連接; - 消息由producer直接通過socket發(fā)送到broker,中間不會(huì)經(jīng)過任何”路由層”,事實(shí)上,消息被路由到哪個(gè)partition上由producer客戶端決定;
比如可以采用”random”“key-hash”“輪詢”等,如果一個(gè)topic中有多個(gè)partitions,那么在producer端實(shí)現(xiàn)”消息均衡分發(fā)”是必要的。
在producer端的配置文件中,開發(fā)者可以指定partition路由的方式。
Producer消息發(fā)送的應(yīng)答機(jī)制
ack機(jī)制:broker表示發(fā)來的數(shù)據(jù)已確認(rèn)接收無誤,表示數(shù)據(jù)已經(jīng)保存到磁盤。
設(shè)置發(fā)送數(shù)據(jù)是否需要服務(wù)端的反饋,有三個(gè)值0,1,-1
0: producer不會(huì)等待broker發(fā)送ack
1: 當(dāng)leader接收到消息之后發(fā)送ack
-1: 當(dāng)所有的follower都同步消息成功后發(fā)送ack
request.required.acks=0
4、Consumer的負(fù)載均衡
當(dāng)一個(gè)group中,有consumer加入或者離開時(shí),會(huì)觸發(fā)partitions均衡.均衡的最終目的,是提升topic的并發(fā)消費(fèi)能力,步驟如下:
- M -1)]
5、kafka文件存儲(chǔ)機(jī)制
5.1、Kafka文件存儲(chǔ)基本結(jié)構(gòu)
- 在Kafka文件存儲(chǔ)中,同一個(gè)topic下有多個(gè)不同partition,每個(gè)partition為一個(gè)目錄,partiton命名規(guī)則為topic名稱+有序序號(hào),第一個(gè)partiton序號(hào)從0開始,序號(hào)最大值為partitions數(shù)量減1。
- 每個(gè)partition(目錄)相當(dāng)于一個(gè)巨型文件被平均分配到多個(gè)大小相等segment(段)數(shù)據(jù)文件中。但每個(gè)段segment file消息數(shù)量不一定相等,這種特性方便old segment file快速被刪除。默認(rèn)保留7天的數(shù)據(jù)。
- 每個(gè)partiton只需要支持順序讀寫就行了,segment文件生命周期由服務(wù)端配置參數(shù)決定。(什么時(shí)候創(chuàng)建,什么時(shí)候刪除)
5.2、Kafka Partition Segment
- Segment file組成:由2大部分組成,分別為index file和data file,此2個(gè)文件一一對(duì)應(yīng),成對(duì)出現(xiàn),后綴”.index”和“.log”分別表示為segment索引文件、數(shù)據(jù)文件。
- Segment文件命名規(guī)則:partion全局的第一個(gè)segment從0開始,后續(xù)每個(gè)segment文件名為上一個(gè)segment文件最后一條消息的offset值。數(shù)值最大為64位long大小,19位數(shù)字字符長(zhǎng)度,沒有數(shù)字用0填充。
- 索引文件存儲(chǔ)大量元數(shù)據(jù),數(shù)據(jù)文件存儲(chǔ)大量消息,索引文件中元數(shù)據(jù)指向?qū)?yīng)數(shù)據(jù)文件中message的物理偏移地址。
上述圖中索引文件存儲(chǔ)大量元數(shù)據(jù),數(shù)據(jù)文件存儲(chǔ)大量消息,索引文件中元數(shù)據(jù)指向?qū)?yīng)數(shù)據(jù)文件中message的物理偏移地址。
其中以索引文件中元數(shù)據(jù)3,497為例,依次在數(shù)據(jù)文件中表示第3個(gè)message(在全局partiton表示第368772個(gè)message)、以及該消息的物理偏移地址為497。
5.3、Kafka 查找message
讀取offset=368776的message,需要通過下面2個(gè)步驟查找。
5.3.1、查找segment file
00000000000000000000.index表示最開始的文件,起始偏移量(offset)為0
00000000000000368769.index的消息量起始偏移量為368770 = 368769 + 1
00000000000000737337.index的起始偏移量為737338=737337 + 1
其他后續(xù)文件依次類推。
以起始偏移量命名并排序這些文件,只要根據(jù)offset 二分查找文件列表,就可以快速定位到具體文件。當(dāng)offset=368776時(shí)定位到00000000000000368769.index和對(duì)應(yīng)log文件。
5.3.2、通過segment file查找message
當(dāng)offset=368776時(shí),依次定位到00000000000000368769.index的元數(shù)據(jù)物理位置和00000000000000368769.log的物理偏移地址
然后再通過00000000000000368769.log順序查找直到offset=368776為止。
總結(jié):
需要了解的知識(shí)點(diǎn)有以下幾個(gè):
1、Kafka的內(nèi)部名詞及各個(gè)名詞的含義及作用。
2、Kafka消息分發(fā)的機(jī)制。
3、Consumer的負(fù)載均衡機(jī)制。
4、Kafka文件存儲(chǔ)機(jī)制。
總感覺這篇文章總結(jié)的比較亂,也許可以把其中的模塊拆開來寫吧。Anyway,就先總結(jié)成這樣吧,以后有機(jī)會(huì)會(huì)再修改。
總結(jié)
以上是生活随笔為你收集整理的大数据之Kafka内部原理详细介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有没有大佬无偿提供一下 华为HCNA-C
- 下一篇: android实现应用商店开发,基于An