1. 程式人生 > >kafka日誌索引儲存及Compact壓實機制深入剖析-kafka 商業環境實戰

kafka日誌索引儲存及Compact壓實機制深入剖析-kafka 商業環境實戰

版權宣告:本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何問題,可隨時聯絡。

1 kafka日誌特點

  • kafka日誌不是鬆散的結構化請求日誌,錯誤日誌或其他日誌。

  • 類似於關係型資料庫中的記錄,只能按照時間順序在日誌尾部追加寫入日誌,儲存的不可能是原生訊息,而是訊息集合或者訊息batch(10版V2)。

  • 每一條日誌都會被分配一個唯一的且順序增加的記錄號,作為定位該訊息的位移標識。

  • kafka的日誌設計都是以分割槽為單位進行的。

  • 對於每一個分割槽日誌都會進一步細分為日誌段(log segment file)以及日誌段索引檔案。每個目錄下面有三個日誌檔案,xxx.log是訊息集檔案, xxx.index 偏移量索引檔案 ,xxx.timeindex 時間戳索引檔案:

      00000000000000000000.index  00000000000000000000.log  00000000000000000000.timeindex
    複製程式碼
  • kafka日誌是按照topic來組織的,每個topic可以分成多個的partition。名字為 -<分割槽號>,即:page_visits-0。比如:有5個partition的名為page_visits的topic的目錄結構為:

  • kafka topic 對應的 partition是分段的,每個段叫LogSegment,包括了一個數據檔案和一個索引檔案,下圖是某個partition目錄下的檔案:

  • 注意第二條訊息368769.log表示該日誌段的第一條訊息位移是368769,同時也說明上一個日誌段包含了368768條訊息。

  • 日誌段檔案的大小是有上限的,預設大小是1GB,當日志段檔案填滿記錄後,kafka會建立一組新的日誌段檔案和索引檔案。

  • kafka 分割槽日誌還包含.index和.timeindex。注意這裡的.index索引是稀疏索引(Sparse index file),預設是日誌寫入大小達到4KB時,才會在.index中增加一個索引項。可以通過log.index.interval.bytes來設定這個間隔大小。

  • 索引檔案的開啟方式:只讀模式和讀寫模式。當前日誌段的索引檔案可以以讀寫模式開啟,非當前的日誌段檔案只能以只讀方式開啟。

  • 索引檔案的大小預設值是10MB,可以通過引數log.index.size.max.bytes來設定索引檔案的最大檔案大小。

  • 索引檔案項格式如下所示,要求每一個索引項必須佔用8個位元組,log.index.size.max.bytes且必須是8的整數倍,否則會回退到8的整數倍。

  • 舉例如下:若使用者需要查詢相對位移為4的訊息,那麼首先會通過二分查詢演算法找到小於4的最大索引項是4597。那麼kafka就會從.log檔案中從4597開始查詢,直到最後找到4597。如果想要增加索引項的密度。可以設定log.index.interval.bytes,預設是4KB。

2 日誌留存清理策略

2.1 日誌的留存

log.retention.bytes 刪除前日誌檔案允許儲存的最大值,預設是-1,表示kafka不會對log進行大小方面的限制。

log.retention.hours 日誌儲存的時間,可以選擇 hours,minutes和ms。預設是7天。

2.2 日誌的清理和壓實Compact

針對每個訊息的key進行整合,對於有相同key的的不同value值,只保留最後一個版本

  • log.cleanup.policty

    日誌清理儲存的策略只有delete和compact兩種,其中delete是預設值,就是日誌留存的機制決定的。另外一個是compact則解決的是壓實問題。從0.10.1.0版本開始,可以同時指定兩種策略:log.cleanup.policty =delete,compact 表示可以同時為Topic執行普通的留存策略,也對其執行log comaction策略。

  • log.cleaner.enable:

    表示開啟日誌清理機制,自0.9開始預設為true。若要使用compact,則必須設定log.cleaner.enable=true

  • log.cleaner.min.compaction.lag.ms:

    預設是0,表示除了當前日誌段,所有日誌段都是可以清理的。但是假如設定log.cleaner.min.compaction.lag.ms=10min,則下午2點為當前時間,13:50之後的日誌段不被清理。

2.3 日誌的合併

經過一次次清理後,各個segment大小會慢慢變小。為了避免日誌目錄下有過多的小檔案,kafka在每次日誌清理後會進行小檔案日誌合併。kafka會保證合併後的segment大小不超過segmentSize(通過log.segments.bytes設定,預設值是1G),且對應的索引檔案佔用大小之和不超過maxIndexSize(可以通過broker端引數log.index.interval.bytes設定,預設值為10MB)

3 結語

愉快的週末即將結束,掙扎完後,依然需要昂首前行,辛苦成文,各自珍惜!謝謝!

版權宣告:本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何問題,可隨時聯絡。

秦凱新 201811252328