Kafka之所以有那麼高的吞吐量,很大程度取決於它的存儲機制,一個主題可以有多個partition,每個partition有一個leader和多個副本,讀寫主要通過leader,副本的主要功能還是爲了保證數據的安全性和保證可靠性,當某個partition的leader出現異常後,剩餘副本可以選舉出新的leader;每個partition下面包含多個log文件和index文件,一對log文件和index文件組成一個segment,所以也可以理解爲一個partition包含多個segment,其中log文件存儲的是具體數據。
kafka消息通過offset劃分爲多個segment,這樣一方面可以增加查詢效率,另一個方面也方便按照segment進行數據刪除,segment的劃分可以通過配置時間定期生成一個新的,也可以配置每個segment文件大小,達到設置閥值後生成一個新的segment。索引分爲全量索引和稀疏索引,區別就是一個是部分數據有索引,減少索引的存儲量。
Kafka採用的是稀疏索引,索引文件裏面就兩列,一列存offset,另一列存position,比如(3,555)表示這個文件的第三條,在這個文件的第555個字節開始,通過二分查找可以很快的定位到文件。
其中消息的存儲格式如下圖4、圖5