1. 程式人生 > 實用技巧 >kafka 系列 -- 7.1、日誌儲存

kafka 系列 -- 7.1、日誌儲存

文章目錄

1、日誌檔案佈局

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

__consumer_offset 儲存著消費者提交的消費位移

2、日誌儲存格式

V0

在這裡插入圖片描述

訊息格式
  • offset:
    每一條訊息都有一個 offset 用來標誌它在分割槽中的偏移量,offset 是邏輯值,而非實際物理偏移量

  • message_size:
    表示訊息的大小

  • crc32(4B):
    crc32 校驗值。校驗範圍為 magic 至 value 之間

  • magic(1B):
    訊息格式版本號,V0 固定為 0

  • attributes(1B):
    訊息的屬性。總共佔1個位元組,低 3 位表示壓縮型別。

    0:NONE、1:GZIP、2:SNAPPY;3:LZ4. 其餘位保留

  • key length(4B):
    -1,表示沒有設定 key

  • key:
    可選

  • value lengtj(4B):
    訊息體的長度,-1,表示為空

  • value:
    訊息體

V1

kafka0.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 中最後一個 Recordoffsetfirst offset 的差值。最要被 broker 用於確保RecordBatchRecord 組裝的正確性
  • first timestamp
    RecordBatch 第一條Record 時間戳
  • max timestamp
    RecordBatch 中最大時間戳
  • producer id
    PID,用於支援冪等和事務
  • producer epoch
    用於支援冪等和事務
  • first sequence
    用於支援冪等和事務
  • record count
    RecordBatchRecord 個數

3、訊息壓縮

broker 可通過 compression.type 配置壓縮方式,預設 producer,即保留生產者的壓縮方式

何時壓縮

kafka 可能在 producer 端或者 broker 端中進行壓縮。

當訊息在 broker 端重新壓縮時,會造成效能下降,因此需要儘量避免。

以下會在 broker 端發生重新壓縮

  1. broker 端和producer 端不同的壓縮演算法。
  2. broker 端發生訊息格式轉換,即新版本訊息向老版本訊息轉化。

何時解壓縮

kafka 將多條訊息放一起壓縮,生產者傳送的是壓縮的資料,broker 儲存的也是壓縮的資料。消費者在拉取訊息時,也是壓縮的資料,在處理前才會解壓訊息。