kafka 系列 -- 7.二、日誌索引

kafka 的索引文件以稀疏索引的方式構造消息的索引,每一個 segmentfault 文件,對應 2 個索引文件。偏移量索引文件(xx.index)用於創建消息偏移量到物理地址之間的映射關係;時間戳索引文件(xx.timeindex)根據指定的時間戳查找對應的偏移量信息。segmentfault

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

日誌切分

當日志分段文件知足如下幾個條件任意之一,便會切分索引文件日誌

  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 個字節。結構以下圖所示:
image.pngcode

  1. relativeOffset:相對偏移量,表示消息相對於 baseOffset 偏移量,佔用 4 個字節
  2. position:物理地址,消息在日誌分段文件中對應的物理位置

消息的偏移量(offset)佔用 8 個字節,稱爲絕對偏移量。爲了節省空間, relativeoffset 採用 4 個字節,relativeOffset = offset - baseOffset
由於 relativeOffset4 個字節,所以當 offset - baseOffset 值大於 Integer.MAX_VALUE,則會致使沒法繼續存儲在當前 .index 文件blog

時間戳索引(.timeindex)

每一個索引項佔用 12 個字節,結構以下圖:
image.png索引

  1. timestamp:

當前日誌分段最大的時間戳。佔 8 個字節kafka

  1. relativeOffset:

時間戳所對應的消息的相對偏移量。佔 4 個字節hash

與 RocketMQ 異同

不一樣點

  1. rocketMQ 的索引文件,存放在 index 目錄下。
  2. rocketMQ index 文件的存儲結構爲 index header + 500W個 hash槽 + 2000W 個 index條目

image.png

  1. rocketMQ 使用的是 hash 進行查找,使用的是鏈表法解決衝突hash 衝突。
相關文章
相關標籤/搜索