【趙強老師】Kafka的消息持久化

1、Kafka消息持久性概述

    Kakfa依賴文件系統來存儲和緩存消息。對於硬盤的傳統觀念是硬盤總是很慢,基於文件系統的架構能否提供優異的性能?實際上硬盤的快慢完全取決於使用方式。同時 Kafka 基於 JVM 內存有以下缺點:

  • 對象的內存開銷非常高,通常是要存儲的數據的兩倍甚至更高

  • 隨着堆內數據的增加,GC的速度越來越慢

實際上磁盤線性寫入的性能遠遠大於任意位置寫的性能,線性讀寫由操作系統進行了大量優化(read-ahead、write-behind 等技術),甚至比隨機的內存讀寫更快。所以與常見的數據緩存在內存中然後刷到硬盤的設計不同,Kafka 直接將數據寫到了文件系統的日誌中:

  • 寫操作:將數據順序追加到文件中

  • 讀操作:從文件中讀取

    這樣實現的好處:

  • 讀操作不會阻塞寫操作和其他操作,數據大小不對性能產生影響

  • 硬盤空間相對於內存空間容量限制更小

  • 線性訪問磁盤,速度快,可以保存更長的時間,更穩定

2、Kafka的持久化原理解析

一個Topic 被分成多 Partition,每個 Partition 在存儲層面是一個 append-only 日誌文件,屬於一個 Partition 的消息都會被直接追加到日誌文件的尾部,每條消息在文件中的位置稱爲 offset(偏移量)。

如下圖所示,我們之前創建了mytopic1,具有三個分區。我們可以到對應的日誌目錄下進行查看。

Kafka日誌分爲index與log(如上圖所示),兩個成對出現:index文件存儲元數據,log存儲消息。索引文件元數據指向對應log文件中message的遷移地址;例如2,128指log文件的第2條數據,偏移地址爲128;而物理地址(在index文件中指定)+ 偏移地址可以定位到消息。
我們可以使用Kafka自帶的工具來查看log日誌文件中的數據信息:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章