Kafka 作爲一個高吞吐的消息中間件和傳統的消息中間件一個很大的不同點就在於它的數據存儲是以日誌的方式默認保存在/kafka-logs文件夾中的。
默認有7天清楚的機制,在數據量大而磁盤容量不足的情況下,經常出現無法寫入的情況,需要調整Kafka的一些默認參數。
Kafka的持久化策略更像redis —— 數據都在內存中,定期flush到硬盤上持久化存儲,以保證重啓的時候數據不丟。flush策略由log.flush.*這些properties控制。
每個topic可以存儲於多個partition,每個partition在kafka的log目錄下表現爲topicname-id這樣的文件夾,如mytopic-0。kafka隊列中的內容會按照日誌的形式持久化到硬盤上。每個日誌文件稱爲“片段”(segment)。
Kafka清理隊列中過期message的方式實際上就是刪除過期的segment,這種表現形式十分類似於日誌滾動。因此控制kafka隊列中消息的保存時間的方式實際上就是日誌文件定期分段,然後定期清理掉過期的段文件。
分段策略屬性
log.roll.{hours,ms} 日誌滾動的週期時間,到達指定週期時間時(優先級依次升高),強制生成一個新的segment 默認(168(7day))
log.segment.bytes 每個segment的最大容量。到達指定容量時,將強制生成一個新的segment 默認(1G(-1爲不限制))
log.retention.check.interval.ms 日誌片段文件檢查的週期時間 默認(60000)
日誌刷新策略
Kafka的日誌實際上是開始是在緩存中的,然後根據策略定期一批一批寫入到日誌文件中去,以提高吞吐率。
og.flush.interval.messages 消息達到多少條時將數據寫入到日誌文件 默認(10000)
log.flush.interval.ms 當達到該時間時,強制執行一次flush 默認(null)
log.flush.scheduler.interval.ms 週期性檢查,是否需要將信息flush 默認很大的值
日誌保存清理策略
cleanup.policy={compact,delete} 日誌清理保存的策略只有delete和compact兩種 默認(delete)
log.retention.{hours,minutes,ms} 日誌保存的時間,可以選擇hours,minutes和ms,優先級依次升高 默認hours(168(7day))
log.retention.bytes 刪除前日誌文件允許保存的最大值 默認(-1)
log.segment.delete.delay.ms 日誌文件被真正刪除前的保留時間 默認(60000)
log.cleanup.interval.mins 每隔一段時間多久調用一次清理的步驟 默認(10)
log.retention.check.interval.ms 週期性檢查是否有日誌符合刪除的條件(新版本使用) 默認(300000)
當刪除的條件滿足以後日誌將被“刪除”,但是這裏的刪除其實只是將該日誌進行了“delete”標註,文件只是無法被索引到了而已。 但是文件本身仍然是存在的,只有當過了 log.segment.delete.delay.ms 這個時間以後文件纔會被真正的從文件系統中刪除。
舉個栗子:
log.roll.hours=1
log.retention.hours=2
log.segment.delete.delay.ms=0
這段配置的含義:每小時滾動一個日誌文件,日誌刪除(cleanup.policy默認爲delete)時間爲2小時