天天看點

【硬剛Kafka】KAFKA基礎(六):Kafka架構深入(4)高效讀寫資料

本文是對《【硬剛大資料之學習路線篇】從零到大資料專家的學習指南(全面更新版)》的Kafka部分補充。

1)順序寫磁盤

Kafka 的 producer 生産資料,要寫入到 log 檔案中,寫的過程是一直追加到檔案末端,為順序寫。官網有資料表明,同樣的磁盤,順序寫能到 600M/s,而随機寫隻有 100K/s。這與磁盤的機械機構有關,順序寫之是以快,是因為其省去了大量磁頭尋址的時間。

2)應用

Kafka資料持久化是直接持久化到Pagecache中,這樣會産生以下幾個好處: 

I/O Scheduler 會将連續的小塊寫組裝成大塊的實體寫進而提高性能

I/O Scheduler 會嘗試将一些寫操作重新按順序排好,進而減少磁盤頭的移動時間

充分利用所有空閑記憶體(非 JVM 記憶體)。如果使用應用層 Cache(即 JVM 堆記憶體),會增加 GC 負擔

讀操作可直接在 Page Cache 内進行。如果消費和生産速度相當,甚至不需要通過實體磁盤(直接通過 Page Cache)交換資料

如果程序重新開機,JVM 内的 Cache 會失效,但 Page Cache 仍然可用

盡管持久化到Pagecache上可能會造成當機丢失資料的情況,但這可以被Kafka的Replication機制解決。如果為了保證這種情況下資料不丢失而強制将 Page Cache 中的資料 Flush 到磁盤,反而會降低性能

3)零複制技術

原始複制

【硬剛Kafka】KAFKA基礎(六):Kafka架構深入(4)高效讀寫資料

kafka複制

【硬剛Kafka】KAFKA基礎(六):Kafka架構深入(4)高效讀寫資料

kafka中的消費者在讀取服務端的資料時,需要将服務端的磁盤檔案通過網絡發送到消費者程序,網絡發送需要經過幾種網絡節點。如下圖所示:

【硬剛Kafka】KAFKA基礎(六):Kafka架構深入(4)高效讀寫資料

傳統的讀取檔案資料并發送到網絡的步驟如下:

(1)作業系統将資料從磁盤檔案中讀取到核心空間的頁面緩存;

(2)應用程式将資料從核心空間讀入使用者空間緩沖區;

(3)應用程式将讀到資料寫回核心空間并放入socket緩沖區;

(4)作業系統将資料從socket緩沖區複制到網卡接口,此時資料才能通過網絡發送。

通常情況下,Kafka的消息會有多個訂閱者,生産者釋出的消息會被不同的消費者多次消費,為了優化這個流程,Kafka使用了“零拷貝技術”,如下圖所示:

【硬剛Kafka】KAFKA基礎(六):Kafka架構深入(4)高效讀寫資料

“零拷貝技術”隻用将磁盤檔案的資料複制到頁面緩存中一次,然後将資料從頁面緩存直接發送到網絡中(發送給不同的訂閱者時,都可以使用同一個頁面緩存),避免了重複複制操作。

如果有10個消費者,傳統方式下,資料複制次數為4*10=40次,而使用“零拷貝技術”隻需要1+10=11次,一次為從磁盤複制到頁面緩存,10次表示10個消費者各自讀取一次頁面緩存。