首頁常見問題正文

Kafka中怎樣刪除日志?日志定期清理方法

更新時間:2023-10-18 來源:黑馬程序員 瀏覽量:

Kafka的消息存儲在磁盤中,為了控制磁盤占用空間,Kafka需要不斷地對過去的一些消息進行清理工作。Kafka的每個分區(qū)都有很多的日志文件,這樣也是為了方便進行日志的清理。在Kafka中,提供日志刪除和日志壓縮兩種日志清理方式。

日志刪除是以段(segment日志)為單位來進行定期清理的。

1.定時日志刪除任務

Kafka日志管理器中會有一個專門的日志刪除任務來定期檢測和刪除不符合保留條件的日志分段文件,這個周期可以通過broker端參數(shù)log.retention.check.interval.ms來配置,默認值為300,000,即5分鐘。當前日志分段的保留策略有3種:

1. 基于時間的保留策略

2. 基于日志大小的保留策略

3. 基于日志起始偏移量的保留策略

(1)基于時間的保留策略

以下三種配置可以指定如果Kafka中的消息超過指定的閾值,就會將日志進行自動清理:

? log.retention.hours

? log.retention.minutes

? log.retention.ms

其中,優(yōu)先級為 log.retention.ms > log.retention.minutes > log.retention.hours。默認情況,在broker中,配置如下:

log.retention.hours=168

也就是,默認日志的保留時間為168小時,相當于保留7天。

刪除日志分段時:

1. 從日志文件對象中所維護日志分段的跳躍表中移除待刪除的日志分段,以保證沒有線程對這些日志分段進行讀取操作

2. 將日志分段文件添加上“.deleted”的后綴(也包括日志分段對應的索引文件)

3. Kafka的后臺定時任務會定期刪除這些“.deleted”為后綴的文件,這個任務的延遲執(zhí)行時間可以通過file.delete.delay.ms參數(shù)來設置,默認值為60000,即1分鐘。

(2)設置topic 5秒刪除一次

為了方便觀察,設置段文件的大小為1M。

1697621079320_14.png

key: segment.bytes

value: 1048576

1697621270854_15.png

嘗試往topic中添加一些數(shù)據(jù),等待一會,觀察日志的刪除情況。我們發(fā)現(xiàn),日志會定期被標記為刪除,然后被刪除。

(3)基于日志大小的保留策略

日志刪除任務會檢查當前日志的大小是否超過設定的閾值來尋找可刪除的日志分段的文件集合。可以通過broker端參數(shù) log.retention.bytes 來配置,默認值為-1,表示無窮大。如果超過該大小,會自動將超出部分刪除。

注意:

log.retention.bytes 配置的是日志文件的總大小,而不是單個的日志分段的大小,一個日志文件包含多個日志分段。

(4)基于日志起始偏移量保留策略

每個segment日志都有它的起始偏移量,如果起始偏移量小于 logStartOffset,那么這些日志文件將會標記為刪除。




分享到:
在線咨詢 我要報名
和我們在線交談!