kafka的topic-partition資料夾下有多個檔案包括 .log .idex .timeindex 這三個核心檔案 還包括 .deleted .cleaned .swap 等臨時檔案 還可能有 .snapshot .txnindex leader-epoch-checkpoint 等檔案
.log檔案是kafka的資料檔案,主要研究一下 .log檔案
kafka的日誌檔案經過多次公升級,已達到更大的壓縮率和實現更多的功能,記錄更多的資訊
日誌的命令是第一條資料的offset加檔案字尾 例如 00000000000000000098.log,第一條資料的偏移量是98,名稱一共20位數字,不足用0補起
一.v0版本的日誌檔案
kafka 0.10.0之前都採用v0格式
如圖所示,offset和message size是訊息的頭部(log_overhead),record是訊息實體,offset佔8b,message size佔4b,固定為12b
record的格式如下圖:
crc32校驗magic至value的值
magic此版本為0
二.v1版本訊息
kafka從0.10.0到0.11.0使用v1版本的record,比v0多乙個時間戳字段timestamp(8b),同時attributes欄位的第四位表示時間戳的型別,其他4位未使用
三.v2版本的訊息
kafka從0.11.0開始公升級訊息格式位v2
v2格式的訊息較之前有很大變化,參考protocol buffer引入了變長整型varints和zigzag編碼,具體設計較多演算法,不展開
v2的訊息比之前複雜很多,需要分3部分解釋,關係是乙個recordbatch包含多個record,其中record包含多個header,recordbatch對應了傳送訊息的producerbatch
1.header部分,我們知道kafka 傳送訊息可以帶header作為附屬資訊,header的結構如下:
varint表示變長型別,即varints
2.record部分如下圖,去掉了crc欄位,增加了length(訊息總長度),timestap delta(時間戳增量),offset delta(位移增量),headers(上面講的header結構)
其中attributes已經棄用,作為保留字段
timestamp delta 和offset delta都是相對於recordbatch起始位置的增量,使用增量資料可以節省很多空間
3.recordbatch部分,如下圖
針對特殊字段說明如下:
magic=2
producer id:pid,producer epoch,first sequence,用來支援冪等和事務
下面放一張完整的圖
四.訊息日誌dump
了解了訊息日誌的格式,介紹一下解析訊息日誌的方法:
kafka-dump-log.sh
例如:
進一步解析訊息實體
Kafka日誌清理
kafka日誌清理目前主要有兩種策略 日誌刪除 日誌壓縮 日誌壓縮就是根據key來保留最後一條訊息。kafka提供log.cleanup.policy引數進行相應配置,預設值 delete,還可以選擇compact。日誌刪除 配置預設值 說明log.retention.check.interval....
Kafka日誌索引
kafka中的索引檔案以稀疏索引 sparse index 的方式構造訊息的索引,並不保證每個訊息在索引中都有對應的索引項。每當寫入一定量 由broker端引數log.index.interval.bytes指定,預設值4k 偏移量索引檔案 時間戳索引檔案分別增加乙個偏移量索引項和時間戳索引項,lo...
Kafka訊息格式
從0.8.x版本開始到現在的2.x版本,kafka的訊息格式也經歷了 3 個版本 v0 版本 v1 版本和 v2 版本 kafka 從 0.8.x 版本開始到 0.10.x 版本之前的訊息格式通常稱為 v0 版本。下圖中左邊的 record 部分就是 v0 版本的訊息格式,每個 record v0 ...