一、說明
Kafka將消息存儲在磁盤中,爲了控制磁盤佔用空間的不斷增加就需要對消息做一定的清理操作。Kafka中每一個分區partition都對應一個日誌文件,而日誌文件又可以分爲多個日誌分段文件,這樣也便於日誌的清理操作。Kafka提供了兩種日誌清理策略:
日誌刪除(Log Deletion):按照一定的保留策略來直接刪除不符合條件的日誌分段。
log.cleanup.policy=delete
日誌壓縮(Log Compaction):針對每個消息的key進行整合,對於有相同key的的不同value值,只保留最後一個版本。
log.cleanup.policy=compact
二、日誌刪除策略
1、相關配置
啓用刪除策略
log.cleanup.policy=delete
#專門的日誌刪除任務來週期性檢測和刪除不符合保留條件的日誌分段文件,默認300000ms,5分鐘
log.retention.check.interval.ms=300000
#可配置以下兩個策略:
#1、清理超過指定時間清理:
log.retention.hours=16
#2、超過指定大小後,刪除舊的消息;默認值爲-1,表示無窮大;
log.retention.bytes=1073741824
#注意:
#log.retention.bytes和log.retention.hours任意一個達到要求,都會執行刪除,會被topic創建時的指定參數覆蓋
2、刪除思想
Kafka把topic中一個parition大文件分成多個小文件段,通過多個小文件段,就容易定期清除或刪除已經消費完文件,減少磁盤佔用;
三、日誌壓縮策略
1、相關配置
#1、是否開啓日誌壓縮
log.cleaner.enable=true
#2、啓用日誌壓縮策略
log.cleanup.policy=compact
2、壓縮策略的細節
(1)壓縮後的offset可能是不連續的,比如上圖中沒有5和7,因爲這些offset的消息被merge了,當從這些offset消費消息時,將會拿到比這個offset大的offset對應的消息,比如,當試圖獲取offset爲5的消息時,實際上會拿到offset爲6的消息,並從這個位置開始消費。
(2)壓縮策略支持刪除,當某個Key的最新版本的消息沒有內容時,這個Key將被刪除,這也符合以上邏輯。