而後不廢話,直接貼最終的關鍵配置:html
# 想實現消息隊列中保存2小時的消息,那麼配置應該像這樣: log.roll.hours=1 log.retention.hours=2 log.segment.delete.delay.ms=0
首先先貼一下對我幫助很大的一篇文檔: https://www.zybuluo.com/jewes/note/64450 。這篇文章詳細闡述了kafka的日誌存儲機制,建議深刻閱讀。redis
而後我簡述一下。咱們將對照kafka的broker配置簡單說明一下: http://kafka.apache.org/documentation.html#brokerconfigs算法
Kafka的持久化策略更像redis
—— 數據都在內存中,按期flush到硬盤上持久化存儲,以保證重啓的時候數據不丟。flush策略由log.flush.*
這些properties控制。apache
每一個topic能夠存儲於多個partition
,每一個partition
在kafka的log目錄下表現爲topicname-id
這樣的文件夾,如mytopic-0
。kafka隊列中的內容會按照日誌
的形式持久化到硬盤上。每一個日誌文件稱爲「段」(segment
)。日誌
Kafka清理隊列中過時message
的方式實際上就是刪除過時的segment
,這種表現形式十分相似於日誌滾動
。所以,控制kafka隊列中消息的保存時間的方式實際上就是日誌文件按期分段,而後按期清理掉過時的段文件。code
與控制分段策略相關的幾個properties:htm
log.roll.{hours,ms} —— 日誌滾動的週期時間(小時,毫秒,log.roll.ms優先級更高),到達指定週期時強制生成一個新的segment。 log.segment.bytes —— 每一個segment的最大容量上限(默認1GB)。到達指定容量時會強制生成一個新的segment。
與過時segment處理策略相關的幾個properties:隊列
cleanup.policy={compact,delete} —— 過時segment處理算法,默認delete。 log.retention.{hours,minutes,ms} —— 日誌保留時間(小時,分鐘,毫秒。優先級依次升高),超出保留時間的日誌執行cleanup.policy定義的操做 log.segment.delete.delay.ms —— 刪除日誌文件前的保留一段時間。默認60000。 log.retention.check.interval.ms —— log checker的檢測是否須要刪除文件的週期。默認300000。
如今解釋一下開頭的配置段的含義——每小時滾動一個日誌文件,日誌刪除(cleanup.policy默認爲delete)時間爲2小時,內存