kafka傳遞檔案 kafka學習文件

2021-10-16 15:28:35 字數 4760 閱讀 5739

kafka

kafka是乙個分布式訊息佇列。具有高效能、持久化、多副本備份、橫向擴充套件能力。生產者往佇列裡寫訊息,消費者從佇列裡取訊息進行業務邏輯。kafka就是一種發布-訂閱模式。將訊息儲存在磁碟中,以順序讀寫方式訪問磁碟,避免隨機讀寫導致效能瓶頸。

kafka對外使用topic的概念,生產者往topic裡寫訊息,消費者從讀訊息。為了做到水平擴充套件,乙個topic實際是由多個partition組成的,遇到瓶頸時,可以通過增加partition的數量來進行橫向擴容。單個parition內是保證訊息有序。

1.producer

生產者即資料的發布者,建立一條記錄,記錄中乙個要指定對應的topic和value,key和partition可選。 先序列化,然後按照topic和partition,放進對應的傳送佇列中。kafka produce都是批量請求,會積攢一批,然後一起傳送,不是調send()就進行立刻進行網路發包。

該角色將訊息發布到kafka的topic中。broker接收到生產者傳送的訊息後,broker將該訊息追加到當前用於追加資料的segment檔案中。生產者傳送的訊息,儲存到乙個partition中,生產者也可以指定資料儲存的partition。1)key有填: 按照key進行雜湊,相同key去乙個partition。(如果擴充套件了partition的數量那麼就不能保證了);2)key沒填:round-robin來選partition。

2.topic

3.partition(leader, follower)

當存在多副本的情況下,會盡量把多個副本,分配到不同的broker上。kafka會為partition選出乙個leader,之後所有該partition的請求,實際操作的都是leader,然後再同步到其他的follower。follower只是單調的和leader跟進,同步訊息即可。當乙個broker歇菜後,所有leader在該broker上的partition都會重新選舉,選出乙個leader。

leader負責跟蹤所有的follower狀態,如果follower"落後"太多或者失效,leader將會把它從「in sync replicas」(isr)同步列表中刪除.當所有的follower都將一條訊息儲存成功,此訊息才被認為是"committed",那麼此時consumer才能消費它。

乙個partition內訊息是有序的,但不保證多個partition之間的資料有序。同一topic下的不同分割槽包含的訊息不同。

多副本同步:生產者生產訊息的時候,通過request.required.acks引數來設定資料的可靠性。

4.broker

kafka 集群包含乙個或多個伺服器,伺服器節點稱為broker。負責訊息的讀取和儲存,接受生產者發過來的訊息,分配offser,儲存到磁碟中。

broker儲存topic的資料。如果某topic有n個partition,集群有n個broker,那麼每個broker儲存該topic的乙個partition。

如果某topic有n個partition,集群有(n+m)個broker,那麼其中有n個broker儲存該topic的乙個partition,剩下的m個broker不儲存該topic的partition資料。

如果某topic有n個partition,集群中broker數目少於n個,那麼乙個broker儲存該topic的乙個或多個partition。在實際生產環境中,盡量避免這種情況的發生,這種情況容易導致kafka集群資料不均衡。

檔案組織:

kafka的資料,實際上是以檔案的形式儲存在檔案系統的。topic下有partition,partition下有segment,segment是實際的乙個個檔案,topic和partition都是抽象概念。

在目錄/$-/下,儲存著實際的log檔案(即segment),還有對應的索引檔案。

每個segment檔案大小相等,檔名以這個segment中最小的offset命名,副檔名是.log;segment對應的索引的檔案名字一樣,副檔名是.index。有兩個index檔案,乙個是offset index用於按offset去查message,乙個是time index用於按照時間去查,其實這裡可以優化合到一起,下面只說offset index。

5.controller(broker)

關於partition的分配,還有leader的選舉,總得有個執行者。在kafka中,這個執行者就叫controller。kafka使用zookeeper在broker中選出乙個controller,用於partition分配和leader選舉。

partition的分配

·將所有broker(假設共n個broker)和待分配的partition排序

·將第i個partition分配到第(i mod n)個broker上 (這個就是leader)

·將第i個partition的第j個replica分配到第((i + j) mode n)個broker上

leader容災

controller會在zookeeper的/brokers/ids節點上註冊watch,一旦有broker宕機,它就能知道。當broker宕機後,controller就會給受到影響的partition選出新leader。controller從zk的/brokers/topics/[topic]/partitions/[partition]/state中,讀取對應partition的isr(in-sync replica已同步的副本)列表(跟leader有一定時差),選乙個出來做leader。選出leader後,更新zk,然後傳送leaderandisrrequest給受影響的broker,讓它們改變知道這事。為什麼這裡不是使用zk通知,而是直接給broker傳送rpc請求,我的理解可能是這樣做zk有效能問題吧。

如果isr列表是空,那麼會根據配置,隨便選乙個replica做leader,或者乾脆這個partition就是歇菜。如果isr列表的有機器,但是也歇菜了,那麼還可以等isr的機器活過來。

6.消費(coordinator)

訂閱topic是以乙個消費組來訂閱的,乙個消費組裡面可以有多個消費者(可以向consumer group中增加新的 consumer,來水平擴充套件消費能力。)。同乙個消費組中的兩個消費者,不會同時消費乙個partition。換句話來說,就是乙個partition,只能被消費組裡的乙個消費者消費,但是可以同時被多個消費組消費。因此,如果消費組內的消費者如果比partition多的話,那麼就會有個別消費者一直空閒。

生產過程中broker要分配partition,消費過程這裡,也要分配partition給消費者。類似broker中選了乙個controller出來,消費也要從broker中選乙個coordinator,用於分配partition。

7.zookeeper

kafka集群幾乎不需要維護任何consumer和producer狀態資訊,這些資訊有zookeeper儲存;因此producer和consumer的客戶端實現非常輕量級,它們可以隨意離開,而不會對集群造成額外的影響。

zookeeper主要用於集群中不同節點之間的通訊。進行leader檢測、分布式同步、配置管理、識別新節點何時離開或連線(通過心跳機制檢查每個節點的連線)、集群節點實時狀態等。

當乙個broker啟動時,會向zookeeper註冊自己持有的topic和partitions資訊。每個consumer客戶端被建立時,會向zookeeper註冊自己的資訊;此作用主要是為了"負載均衡".

1) producer端使用zookeeper用來"發現"broker列表,以及和topic下每個partition leader建立socket連線並傳送訊息.

2) broker端使用zookeeper用來註冊broker資訊,已經監測partitionleader存活性.

3) consumer端使用zookeeper用來註冊consumer資訊,其中包括consumer消費的partition列表等,同時也用來發現broker列表,並和partition leader建立socket連線,並獲取訊息.

8.kafka支援3種訊息投遞語義

`at most once:最多一次,訊息可能會丟失,但不會重複。先獲取資料,再commit offset,最後進行業務處理。

`at least once:最少一次,訊息不會丟失,可能會重複。先獲取資料,再進行業務處理,業務處理成功後commit offset。(在業務中,常常都是使用at least once的模型)

`exactly once:隻且一次,訊息不丟失不重複,隻且消費一次(0.11中實現,僅限於下游也是kafka)

9.其他面試題目:

1.kafka與傳統訊息系統之間的區別:

傳統的訊息傳遞方法包括兩種:

·排隊:在佇列中,一組使用者可以從伺服器中讀取訊息,每條訊息都傳送給其中乙個人。

·發布-訂閱:在這個模型中,訊息被廣播給所有的使用者

優勢:1)快速

2)持久跟容錯性:訊息是永續性的,並在集群中進行複製,以防止資料丟失。

3)可伸縮性:是乙個分布式系統,以集群凡是群星,可以靈活伸縮。

2.kafka伺服器能接收到的最大資訊是多少?

kafka伺服器可以接收到的訊息的最大大小是1000000位元組。

3.kafka的零拷貝技術

傳統讀取檔案傳送到網路的過程,會複製4次。

(1)作業系統將資料從磁碟檔案中讀取到核心空間的頁面快取;(2)應用程式將資料從核心空間讀入使用者空間緩衝區;(3)應用程式將讀到資料寫回核心空間並放入socket緩衝區;(4)作業系統將資料從socket緩衝區複製到網絡卡介面,此時資料才能通過網路傳送。

kafka,儲存在磁碟上的資料格式與從生產者傳送過來或者傳送給消費者的訊息格式是一樣的,因為使用了相同的訊息格式進行磁碟儲存和網路傳輸,kafka可以使用零複製技術將訊息直接傳送給消費者。「零拷貝技術」只用將磁碟檔案的資料複製到頁面快取中一次,然後將資料從頁面快取直接傳送到網路中(傳送給不同的訂閱者時,都可以使用同乙個頁面快取),避免了重複複製操作。

kafka學習 Kafka核心技術與實戰學習筆記

session.timout.ms決定了consumer存活性的時間間隔 heartbeat.interval.ms決定存活心跳傳送間隔。max.poll.interval.ms 它限定了consumer端應 程式兩次調 poll 法的最 時間間隔。消費者例項在kafkaconsumer.poll建...

Kafka學習筆記(十) Kafka檔案儲存機制

kafka的訊息以日誌檔案的形式進行儲存。不同主題下不同分割槽的訊息是分開儲存的。同乙個分割槽的不同副本也是以日誌的形式,分布在不同的broker上儲存 檢視 tmp kafka logs目錄,假設有4個partition 在kafka檔案儲存中,同乙個topic下有多個不同的partition,每...

kafka 非同步傳送阻塞 kafka配置檔案

在kafka config 目錄下面有3個配置檔案 producer.properties 生產端的配置檔案 consumer.properties 消費端的配置檔案 消費者集群通過連線zookeeper來找到broker。zookeeper連線伺服器位址 zookeeper.connect zk0...