Kafka核心總結

2021-08-08 22:55:23 字數 3488 閱讀 6234

乙個kafka的message由乙個固定長度的header和乙個變長的訊息體body組成。

header部分由乙個位元組的magic(檔案格式)和四個位元組的crc32(用於判斷body訊息體是否正常)構成。當magic的值為1時,會在magic和crc32之間多乙個位元組的資料:attributes(儲存一些相關屬性,比如是否壓縮、壓縮格式等資訊);如果magic的值為0,那麼不存在attributes屬性。

body是由n個位元組構成的乙個訊息體,包含了具體的key/value訊息

儲存在磁碟的日誌採用不同於producer傳送的訊息格式,每個日誌檔案都是乙個」log entries」序列,每乙個log entry包含乙個offset(佔8位元組)資訊,message size(四位元組,整個log entry的長度),crc32(4位元組),magic(1位元組),attributes(1位元組),key length(4位元組),key(實際的key的值,它的長度是key length),payload length(4位元組,表示實際內容所佔的長度),payload(實際存放的內容)。log entry的具體格式如下圖所示:

這個log entries並非由乙個檔案構成,而是分成多個segment file(日誌檔案,儲存具體的訊息記錄)和乙個索引檔案(儲存每個segment檔案的offset偏移量範圍)。結構如下圖所示:

乙個topic分為多個partition來進行資料管理,乙個partition中的資料是有序的、不可變的,使用偏移量(offset)唯一標識一條資料,是乙個long型別的資料。

partition接收到 producer傳送過來資料後,會產生乙個遞增的offset偏移量資料,同時將資料儲存到本地的磁碟檔案中(檔案內容追加的方式寫入資料);partition中的資料存活時間超過引數值(log.retention.,預設為7天)的時候進行刪除。

consumer根據offset消費對應topic的partition中的資料(也就是每個consumer消費的每個topic的partition都擁有自己的offset偏移量)

注意:kafka的資料消費是順序讀寫的,磁碟的順序讀寫速度(600mb/sec)比隨機讀寫速度(100k/sec)要快得多。

tip:

硬碟的順序讀寫比記憶體的隨機讀寫速度要快

硬碟的主要效能消耗是尋道和旋轉延時,真正用於讀寫資料的時間很少,順序讀寫避免了過多的尋道和旋轉延時。

kafka將檔案寫到記憶體的頁快取,然後按定製的策略flush到硬碟,預設且推薦的策略是不配置下面的引數而是依賴作業系統的flush策略。

- log.flush.interval.messages

- log.flush.interval.ms

- log.flush.scheduler.interval.ms

乙個topic中的所有資料分布式的儲存在kafka集群的所有機器(broker)上,以分割槽(partition)的形式進行資料儲存;每個分割槽允許存在備份資料/備份分割槽(儲存在同乙個kafka集群的其它broker上的分割槽)

每個資料分割槽在kafka集群中存在乙個broker節點上的分割槽叫做leader,儲存在其它broker上的備份分割槽叫做followers;只有leader節點負責該分割槽的資料讀寫操作followers節點作為leader節點的熱備節點,從leader節點備份資料;當leader節點掛掉的時候,followers節點中會有乙個節點變成leader節點,重新提供服務。kafka集群的分割槽partition的leader和followers切換依賴zookeeper。

kafka分布式保證的第乙個特性就是:kafka的replication,kafka的replication指的是partition的複製,乙個partition的所有分割槽中只有乙個分割槽是leader節點,其它分割槽是follower節點。

replication對kafka的吞吐率有一定的影響,但是極大的增強了可用性follower節點會定時的從leader節點上獲取增量資料,乙個活躍的follower節點必須滿足以下兩個條件:

1. 所有的節點必須維護和zookeeper的連線(通過zk的heartbeat實現)

2. follower必須能夠及時的將leader上的writing複製過來,不能落後太多;落後太多由 引數和決定。

kafka分布式保證的第二個特性就是 :kafka leader election

kafka提供了乙個in-syc replicas(isr)來確保kafka的leader選舉,isr是乙個儲存分割槽node的集合,如果乙個node宕機了或資料落後太多,leader會將node節點從isr中移除,之後isr中的follower節點才有可能成為leader節點

leader節點的切換基於zookeeper的watcher機制,當leader節點宕機的時候,其他isr中的follower節點會競爭在zk中建立乙個檔案目錄(只有乙個follower節點建立成功),建立成功的follower節點成為leader節點。

kafka集群中由producer負責資料的生產,併發送到對應的topic;producer通過push的方式將資料傳送到對應的topic的分割槽。

producer傳送到topic的資料是由key/value鍵值對組成,kafka根據key的不同的值決定資料傳送到不同的partition,預設採用hash的機制傳送資料到對應topic的不同partiiton中,配置引數為

producer傳送資料的方式分為sync(同步)和async(非同步)兩種,預設為同步的方式,由引數決定;當為非同步傳送模式的時候priducer提供重試機制,預設失敗重試傳送3次

kafka有兩種模式消費資料:佇列和發布訂閱;在佇列模式下,一條資料只會傳送給customer group中的乙個customer進行消費;在發布訂閱模式下,一條資料會傳送給多個customer進行消費。

kafka的customer基於offset對kafka中的資料進行消費,對於乙個customer group中的所有customer共享乙個offset偏移量。

kafka中通過控制customer的引數來決定kafka是什麼資料消費模式,如果所有消費者的該引數值是相同的,那麼此時的kafka就是類似於佇列模式資料只會傳送到乙個customer,此時kafka類似於負載均衡;否則就是發布訂閱模式;在佇列模式下,可能會觸發kafka的consumer rebalance。

kafka的資料是按照分割槽進行排序的(插入的順序),也就是每個分割槽中的資料是有序的,在consumer進行資料消費時候,也是對分割槽的資料進行有序的消費,但是不保證所有資料的有序性(在多個分割槽之間)

consumer rebalance:當乙個consumer group中的消費者數量和對應的topic分割槽數量一致的時候,此時乙個consumer消費乙個partition的資料;如果不一致,那麼可能出現乙個consumer消費多個partition的資料或者不消費資料的情況,這個機制是根據consumer和partition的數量同台變化的。

consumer通過poll的方式主動從kafka集群中獲取資料:

kafka學習總結之kafka核心

1 kafka核心元件 1 replication 副本 partition 分割槽 乙個topic可以有多個副本,副本的數量決定了有多少個broker存放寫入的資料 副本是以partition為單位的,存放副本即是備份若干個partition,但是只有乙個partition被選為leader用於讀...

kafka核心原理總結

新霸哥發現在新的技術發展時代,訊息中介軟體也越來越受重視,很多的企業在招聘的過程中著重強調能夠熟練使用訊息中介軟體,所有做為乙個軟體開發愛好者,新霸哥在此提醒廣大的軟體開發朋友有時間多學習。kafka已經被很多的中小公司使用,訊息傳送接受,有用過的朋友可能就很清楚了,kafka是乙個支援分割槽的 分...

kafka核心原理總結

新霸哥發現在新的技術發展時代,訊息中介軟體也越來越受重視,很多的企業在招聘的過程中著重強調能夠熟練使用訊息中介軟體,所有做為乙個軟體開發愛好者,新霸哥在此提醒廣大的軟體開發朋友有時間多學習。kafka已經被很多的中小公司使用,訊息傳送接受,有用過的朋友可能就很清楚了,kafka是乙個支援分割槽的 分...