1. 程式人生 > 實用技巧 >kafka 系列 -- 7.2、日誌索引

kafka 系列 -- 7.2、日誌索引

文章目錄


kafka 的索引檔案以稀疏索引的方式構造訊息的索引,每個 segmentfault 檔案,對應 2 個索引檔案。偏移量索引檔案(xx.index)用於建立訊息偏移量到實體地址之間的對映關係;時間戳索引檔案(xx.timeindex)根據指定的時間戳查詢對應的偏移量資訊。

.index、.timeindex 均保持嚴格單調遞增,在查詢時,都使用二分查詢法,如果查不到,均返回比查詢值要小的最大值。

日誌切分

當日志分段檔案滿足以下幾個條件任意之一,便會切分索引檔案

  1. 分段檔案大小超過 broker

    引數 log.segment.bytes 配置的值,預設為 1073741824,即 1G

  2. 當前分段日誌中訊息的最大時間戳與當前系統的時間戳差值大於 log.roll.mslog.roll.hours 引數配置的值。其中前者優先順序大於後者,預設配置了 log.roll.hours = 168,即 7

  3. .index.timeindex 的大小達到 broker 端引數 log.index.size.max.bytes 配置的值,該值預設為 10485760 即10MB

  4. 追加的訊息的偏移量與當前日誌分段的偏移量之間差值大於 Integer.MAX_VALUE

偏移量索引(.index)

.index 每個索引項,佔 8 個位元組。結構如下圖所示:
在這裡插入圖片描述

  1. relativeOffset:相對偏移量,表示訊息相對於 baseOffset 偏移量,佔用 4 個位元組

  2. position:實體地址,訊息在日誌分段檔案中對應的物理位置

訊息的偏移量(offset)佔用 8 個位元組,稱為絕對偏移量。為了節省空間, relativeoffset 採用 4 個位元組,relativeOffset = offset - baseOffset
因為 relativeOffset4 個位元組,因此當 offset - baseOffset 值大於 Integer.MAX_VALUE,則會導致無法繼續儲存在當前 .index 檔案

時間戳索引(.timeindex)

每個索引項佔用 12 個位元組,結構如下圖:
在這裡插入圖片描述

  1. timestamp:
    當前日誌分段最大的時間戳。佔 8 個位元組
  2. relativeOffset:
    時間戳所對應的訊息的相對偏移量。佔 4 個位元組

與 RocketMQ 異同

不同點

  1. rocketMQ 的索引檔案,存放在 index 目錄下。
  2. rocketMQ index 檔案的儲存結構為 index header + 500W個 hash槽 + 2000W 個 index條目
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-6LEBwAcp-1602337551933)(evernotecid://B58292A4-43F3-4C3E-ACA3-E9C7D829CC18/appyinxiangcom/15559189/ENResource/p3019)]
  3. rocketMQ 使用的是 hash 進行查詢,使用的是連結串列法解決衝突hash 衝突。