僅個人實踐中所遇到的問題,若有不對的,歡迎交流!
一、場景描述
kafka集群中有幾台突然掛了,后台日志顯示設備空間滿了,消息無法寫入__consumer_offsets topic的分區中了。查看kafka數據目錄下各個文件的大小,發現__consumer_offsets topic分區中有一個分區__consumer_offsets-5數據很多,多達1T,而其他分區只有4KB,相差巨大。且__consumer_offsets-5中保留了一年多的數據。什么情況?不應該自動清除嗎?
二、問題分析
1)__consumer_offsets分區中數據量相差這么大?
__consumer_offsets topic的分區中存放的是consumer的offset等信息,其存放機制是用消費組id的hash值對分區數取模得到的。而我們只有一個消費組,所以會導致__consumer_offsets topic中的數據都寫入一個分區。
2)__consumer_offsets-5保留的一年多數據,為什么沒有被清理?不是已經設置了log.retention.hours、log.retention.bytes這些參數了嗎?
首先說一點,__consumer_offsets的cleanup.policy策略是compact,而我們新建topic的清理策略默認是deleted,前者可以使用--describe 加上--topic __consumer_offsets 可以看到,而后者可以在server.properties上可以看到。參數log.cleaner.enable參數對清理策略為compact起作用,且不是通過壓縮(compact)文件達到減少數據的目的,通過測試,我們發現當文件屬性不滿足log.retention.hours、log.retention.bytes其中任何一項時,.log的數據文件文件就會被刪除。當然也不是直接刪除,是先將文件標記為-deleted,然后被清除。因為測試的時候被標記為-deleted后,再次執行ll命令時,文件已經被刪除了,不知道刪除時間間隔是否和參數log.retention.check.interval.ms有關,若有大佬知道歡迎留言分享。
知道文件清理規則后,檢查log.cleaner.enable設置,為false,故將其改為true即可。
三、測試過程
修改參數log.segment.bytes的大小為1M,使得__consumer_offsets topic的分區中.log文件大小保留為1M;為了盡快確定log.cleaner.enable改為true是否會減小__consumer_offsets topic的分區中數據量的大小,需要修改觸發刪除的閾值。為減小閾值,修改log.retention.bytes為2M。但是在實際測試中我們發現當__consumer_offsets topic的分區中的.log大小為50M的時候還是沒有觸發刪除。使用以下命令查看__consumer_offsets topic時發現,其默認的configure :segment.bytes大小為104857600,即為100M。
1 kafka-topics --decribe --zookeeper localhost:2181/kafka --topic __consumer_offsets
通過查看kafka官網上有關segment bytes配置說明,發現刪除時是以一個文件執行的,這個參數控制着文件大小。原文如下:
| This configuration controls the segment file size for the log. Retention and cleaning is always done a file at a time so a larger segment size means fewer files but less granular control over retention. |
使用命令將這個segment.bytes改為10M,發現__consumer_offsets-5分區的數據很快就變為400+KB了。修改命令如下:
1 kafka-topics --zookeeper localhost:2181/kafka --alter --topic __consumer_offsets --config segment.bytes=10485760
四、應急策略
當時因為是生產環境出現問題,來不及分析,要盡快將生產恢復正常,只能臨時將日志等信息保留下來,以待后續分析。上述的分析還是自己后來查找資料知道的。當時采取的策略如下:
停止程序;增加磁盤;刪除topic;新建topic;啟動程序;
耗時近一個半小時,消費正常。這個步驟肯定是不行的,但是當時不是很懂,所以采取了臨時的策略,歡迎大佬分享自己遇到這種問題時采取的措施!
五、參考文獻
1)https://support.huawei.com/enterprise/zh/knowledge/KB1000676043/
2)https://www.sohu.com/a/136881236_487514
