kafka 系列 -- 7.1、日誌儲存
阿新 • • 發佈:2020-10-11
文章目錄
1、日誌檔案佈局
__consumer_offset 儲存著消費者提交的消費位移
2、日誌儲存格式
V0
訊息格式
-
offset:
每一條訊息都有一個 offset 用來標誌它在分割槽中的偏移量,offset 是邏輯值,而非實際物理偏移量 -
message_size:
表示訊息的大小 -
crc32(4B):
crc32 校驗值。校驗範圍為 magic 至 value 之間 -
magic(1B):
訊息格式版本號,V0 固定為 0 -
attributes(1B):
訊息的屬性。總共佔1個位元組,低 3 位表示壓縮型別。 -
key length(4B):
-1,表示沒有設定 key -
key:
可選 -
value lengtj(4B):
訊息體的長度,-1,表示為空 -
value:
訊息體
V1
kafka
從 0.10.0
版本至 0.11.0
版本之前所使用的訊息格式版本為 v1
, 比 v0
多了一個 timestamp
欄位
訊息格式
- magic(1B):
訊息格式版本號,V0 固定為 1 - attributes(1B):
前三位同樣表示壓縮型別。
第4位:0-timestamp 型別為CreateTime
, 1-timestap 型別為LogAppendTime
timestamp
型別由broker
端引數log.message.timestamp.type
配置,預設值為CreateTime
V2
kafka
版本從 0.11.0
之後都稱為 v2.
- length
訊息總長度 - attributes
棄用 - timestamp delta
時間戳增量,儲存與RecordBatch
起始時間戳的差值 - offset delta
位移增量,儲存與RecordBatch
起始位移的差值 - headers
支援應用級別的擴充套件 - first offset
當前RecordBatch
的起始位移 - length
計算從partitionleader epoch
欄位開始到末尾的長度 - partitionleader epoch
分割槽 leader 的版本號或更新次數 - magic
V2 固定為 2 - attributes
佔用 2 個位元組;低三位表示壓縮格式,第4位表示時間戳型別,第5位表示RecordBatch
是否處於事務中,0-非事務,1-事務。第6位表示是否是控制訊息,0-非控制,1-控制,控制訊息用來支援事務功能 - last offset delta
RecordBatch
中最後一個Record
的offset
與first offset
的差值。最要被broker
用於確保RecordBatch
中Record
組裝的正確性 - first timestamp
RecordBatch
第一條Record
時間戳 - max timestamp
RecordBatch
中最大時間戳 - producer id
PID,用於支援冪等和事務 - producer epoch
用於支援冪等和事務 - first sequence
用於支援冪等和事務 - record count
RecordBatch
中Record
個數
3、訊息壓縮
broker
可通過 compression.type
配置壓縮方式,預設 producer
,即保留生產者的壓縮方式
何時壓縮
kafka
可能在 producer
端或者 broker
端中進行壓縮。
當訊息在 broker
端重新壓縮時,會造成效能下降,因此需要儘量避免。
以下會在 broker
端發生重新壓縮
broker
端和producer
端不同的壓縮演算法。broker
端發生訊息格式轉換,即新版本訊息向老版本訊息轉化。
何時解壓縮
kafka
將多條訊息放一起壓縮,生產者傳送的是壓縮的資料,broker 儲存的也是壓縮的資料。消費者在拉取訊息時,也是壓縮的資料,在處理前才會解壓訊息。