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

版權聲明:本套技術專欄是做者(秦凱新)平時工做的總結和昇華,經過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和集羣環境容量規劃等內容,請持續關注本套博客。版權聲明:禁止轉載,歡迎學習。QQ郵箱地址:1120746959@qq.com,若有任何問題,可隨時聯繫。算法

1 kafka日誌特色

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

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

  • 每一條日誌都會被分配一個惟一的且順序增長的記錄號,做爲定位該消息的位移標識。spa

  • kafka的日誌設計都是以分區爲單位進行的。設計

  • 對於每個分區日誌都會進一步細分爲日誌段(log segment file)以及日誌段索引文件。每一個目錄下面有三個日誌文件,xxx.log是消息集文件, xxx.index 偏移量索引文件 ,xxx.timeindex 時間戳索引文件:3d

    00000000000000000000.index  00000000000000000000.log  00000000000000000000.timeindex
    複製代碼
  • kafka日誌是按照topic來組織的,每一個topic能夠分紅多個的partition。名字爲topic-分區號,即:page_visits-0。好比:有5個partition的名爲page_visits的topic的目錄結構爲:日誌

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

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

  • 日誌段文件的大小是有上限的,默認大小是1GB,當日志段文件填滿記錄後,kafka會建立一組新的日誌段文件和索引文件。blog

  • 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郵箱地址:1120746959@qq.com,若有任何問題,可隨時聯繫。

秦凱新 201811252328

相關文章
相關標籤/搜索