前言
Kafka將消息存儲在磁盤中,為了控制磁盤占用空間。kafka中每個分區副本都對應一個Log,而Log對應多個日志分段,這樣有利日志清理操作。Kafka提供兩種日志清理策略:
- 日志刪除(Log retention):按一定的保留的策略直接刪除不符條件的日志分段;
- 日志壓縮(Log compation):針對每個消息的Key對行整合,對於相同Key的不同value值,只保留最后一個版本;
Broker端參數log.cleanup.policy來設置日志清理策略,此參數默認為delete,也可以設置成compact,還可以設置成delete,compact;
日志刪除
Kafka日志管理器中會有一個專門的日志刪除任務來周期性檢測和刪除不符合保留條件的日志分段文件,在Broker端參數:log.retention.check.interval.ms默認值:3000,當前日志分段有三種保留策略:基於時間、日志大小和起始偏移量。
基於時間策略
日志刪除任務會檢查當前日志文件中是否有保留時間超過設定的閾值來刪除日志分段文件集合。
Broker端log.retention.hours(168小時) < log.retention.minutes < log.retention.ms來配置;
查找過期的日志分段文件,並不是簡單地根據日志分段的最近修改時間lastModifiedTime來計算的,而是根據日志中分段中的最大的時間戳largestTimeStamp來計算的。
刪除日志分段時,首先會從Log對象中所維護日志分段的跳躍表中移除待刪除的日志分段,以保證沒有純種對這些日志分段進行讀取操作;然后將日志分段所對應的文件添上".deleted"的后綴,最后交由一個以"delete-file"命名的延遲任務來刪除這些以".deleted"為后綴的文件,這個延遲任務通過file.delete.delay.ms參數來調配,默認值60000(一分鍾)。
基於日志大小策略
日志刪除任務會檢查當前日志大小是否超過閾值來尋找可刪除的日志分段文件集合,可以通過Broker端參數log.retention.bytes來配置,默認值為1G 。
首先計算日志文件的總大小size和retention的差值diff,然后從日志文件中的第一個日志分段開始進行查找可刪除的日志分段的文件集合deletableSegments,查出之前就執行刪除操作,這個刪除操作跟基於時間的一樣。
基於起始偏量策略
一般情況下,日志文件的起始偏移量logStartOffset等於第一個日志分段的baseOffset;
日志壓縮
log Compaction對於有相同Key的不同value值,只保留最后一個版本。
每個日志目錄下有個"cleaner-offset-checkpoint" 的文件,這個文件就是清理檢查點文件,用來記錄每個分區中已清理的偏移量。
待完成
