Kafka (十)Kafka 如何實現高吞吐量

2021-10-02 22:12:00 字數 1709 閱讀 8531

kafka的訊息是不斷追加到檔案中的,這個特性使kafka可以充分利用磁碟的順序讀寫效能

順序讀寫不需要硬碟磁頭的尋道時間,只需很少的扇區旋轉時間,所以速度遠快於隨機讀寫

生產者負責寫入資料,kafka會將訊息持久化到磁碟,保證不會丟失資料,kafka採用了倆個技術提高寫入的速度。

1.順序寫入:在大學的計算機組成(劃重點)裡我們學過,硬碟是機械結構,需要指標定址找到儲存資料的位置,所以,如果是隨機io,磁碟會進行頻繁的定址,導致寫入速度下降。kafka使用了順序io提高了磁碟的寫入速度,kafka會將資料順序插入到檔案末尾,消費者端通過控制偏移量來讀取訊息,這樣做會導致資料無法刪除,時間一長,磁碟空間會滿,kafka提供了2種策略來刪除資料:基於時間刪除和基於partition檔案的大小刪除。

在這之前先來了解一下零拷貝(直接讓作業系統的 cache 中的資料傳送到網絡卡後傳輸給下游的消費者):平時從伺服器讀取靜態檔案時,伺服器先將檔案從複製到核心空間,再複製到使用者空間,最後再複製到核心空間並通過網絡卡傳送出去,而零拷貝則是直接從核心到核心再到網絡卡,省去了使用者空間的複製。

kafka把所有的訊息存放到乙個檔案中,當消費者需要資料的時候直接將檔案傳送給消費者,比如10w的訊息共10m,全部傳送給消費者,10m的訊息在內網中傳輸是非常快的,假如需要1s,那麼kafka的tps就是10w。zero copy對應的是linux中sendfile函式,這個函式會接受乙個offsize來確定從**開始讀取。現實中,不可能將整個檔案全部發給消費者,他通過消費者傳遞過來的偏移量來使用零拷貝讀取指定內容的資料返回給消費者。

在linux kernel2.2 之後出現了一種叫做"零拷貝(zero-copy)"系統呼叫機制,就是跳過「使用者緩衝區」的拷貝,建立乙個磁碟空間和記憶體的直接對映,資料不再複製到「使用者態緩衝區」,系統上下文切換減少為2次,可以提公升一倍的效能。

kafka中的topic中的內容可以被分為多分partition存在,每個partition又分為多個段segment,所以每次操作都是針對一小部分做操作,很輕便,並且增加並行操作的能力

kafka允許進行批量傳送訊息,producter傳送訊息的時候,可以將訊息快取在本地,等到了固定條件傳送到kafka

等訊息條數到固定條數

一段時間傳送一次

producer壓縮之後,在consumer需進行解壓,雖然增加了cpu的工作,但在對大資料處理上,瓶頸在網路上而不是cpu,所以這個成本很值得

批量傳送資料壓縮一起使用,單條做資料壓縮的話,效果不明顯

kafka的設計目標是高吞吐量,它比其它訊息系統快的原因體現在以下幾方面:

1、kafka操作的是序列檔案i / o(序列檔案的特徵是按順序寫,按順序讀),為保證順序,kafka強制點對點的按順序傳遞訊息,這意味著,乙個consumer在訊息流(或分割槽)中只有乙個位置。

2、kafka不儲存訊息的狀態,即訊息是否被「消費」。一般的訊息系統需要儲存訊息的狀態,並且還需要以隨機訪問的形式更新訊息的狀態。而kafka 的做法是儲存consumer在topic分割槽中的位置offset,在offset之前的訊息是已被「消費」的,在offset之後則為未「消費」的,並且offset是可以任意移動的,這樣就消除了大部分的隨機io。

3、kafka支援點對點的批量訊息傳遞。

4、kafka的訊息儲存在os pagecache(頁快取,page cache的大小為一頁,通常為4k,在linux讀寫檔案時,它用於快取檔案的邏輯內容,從而加快對磁碟上映像和資料的訪問)。

Kafka 如何實現 Exactly Once

流式系統中最重要的保證 exactly once,即訊息不會丟失,也不會被重 送 在 kafka 0.11 之前,開啟重試機制只能保證資料不丟失,但是資料有可能有重複 在 kafka 0.11 之後,可以實現資料的精準一次,它能保證多條訊息原子性地寫入到目標分割槽,即要不一起成功,要不都失敗 主要靠...

Kafka 如何理解Kafka的「快」?

據了解,kafka吞吐量峰值每秒百萬,就算在記憶體個cpu都不高的情況下,最高可達每秒十萬,並且還能做到持久化儲存。kafka如此高吞吐率的原因是什麼?隨機寫每秒幾十幾百k。作業系統從磁碟將資料copy dma copy 到核心空間緩衝區 kernel buffer 應用程式從核心空間緩衝區 ker...

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

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