因硬盤太小,數據量太大 不得不將數據的保存時間從默認的7天變為一天
設置了參數log.retention.hours=24 但是發現3天前的數據還是存在
查詢官方文檔發現
活動的segment是不會壓縮的 ,做了幾個實驗看有沒有方法能夠刪除一直在發的topic數據
實驗一
添加一個testdelet的topic 每隔10s發送一次數據 ,看一個小時是否會清除一個小時前數據 ,區別:每條記錄發送結束后會關閉kafka連接
觀察時間 14:59分 發現未刪除 結論 不分片沒有用
實驗二
修改server.properties d文件 設置
log.retention.hours=1
log.retention.ms=3600000
log.cleanup.polict=delete
log.segment.delete.delay.ms=60000
log.cleanup.interval.mins=10
log.retention.check.interval.ms=600000
看是否有不同變化
結論 和之前沒有區別 數據沒有區別, 該實驗無效
實驗三:
查看kafka tool在讀取數據是否會對刪除產生影響
結論 無影響 該實驗無效
實驗四 :
在 15.10分左右給control發送200條數據 ,看多少時間之后會被刪除數據
實驗五
停止一組topic的發送,看是否有變化 ,寫修改
./kafka-configs.sh --entity-name simulator_250 --zookeeper localhost:2181 --entity-type topics --alter --add-config segment.bytes=10000000,retention.ms=3600000,retention.bytes=20000000
1. 關閉發送程序 10分鍾后查看是否會刪除歷史數據
結論 不會被刪除數據
2.將topic從消費者處刪除 ,查看是否有效
結論 沒有刪除
3.等待刪除時間
結論在 00000000.log的最后一條數據等待一個小時后 該數據被刪除了
其他的日志也在陸續過來1個小時后刪除
結論 kafka數據是否刪除和是否有數據消費讀取沒有關系 ,和最后一個片段的最后一條數據的時間間隔有關
實驗六
修改 segment.bytes=10000000,retention.ms=3600000
看1個小時后是否能夠刪除舊的文件片段
結果:
能夠刪除 刪除片段的開始時間11.20,最后時間 14.10分 真正刪除時間 14:50分
結論 切片后能夠刪除 其他topic沒有刪除
實驗全部結論:
kafka數據想要刪除需要設置 log.roll.hours(輪轉時間)或是segment.bytes(文件大小) 控制日志文件一個最大為多大或多久切片 ,當上個日志文件的最后一條時間到達了log.segment.hours的時間后,上一條日志就會刪除 ,或是該topic等待log.segment.hours時間沒有數據進入 該topic會被刪除
或是默認情況下 segment到達了1G自動分片 或是達到7天自動分片 導致舊的數據被刪除
默認刪除的輪訓時間是10分鍾,所以可能部分的的時間有一點區別
所有在配置中加入 log.roll.hours=12既可以解決問題