2017-04-14 108 views
1

我有一個雙節點Kafka集羣,每個集羣分配48 GB磁盤。 server.properties設置爲將日誌保留至48小時或將日誌段保留至1 GB。這是它:爲什麼Kafka不會刪除數據?

log.retention.hours=48 
log.retention.bytes=1073741824 
log.segment.bytes=1073741824 

我有30個話題的部分。下面是這些分區中的一個磁盤使用情況統計:

-rw-r--r-- 1 root root 1.9M Apr 14 00:06 00000000000000000000.index 
-rw-r--r-- 1 root root 1.0G Apr 14 00:06 00000000000000000000.log 
-rw-r--r-- 1 root root 0 Apr 14 00:06 00000000000000000000.timeindex 
-rw-r--r-- 1 root root 10M Apr 14 12:43 00000000000001486744.index 
-rw-r--r-- 1 root root 73M Apr 14 12:43 00000000000001486744.log 
-rw-r--r-- 1 root root 10M Apr 14 00:06 00000000000001486744.timeindex 

正如你可以清楚地看到,我們有1 GB的日誌段。但根據我的理解,它應該已經被刪除。此外,卡夫卡推出這些日誌已超過48小時。思考?

回答

3

對於您的情況,您將log.retention.byteslog.segment.bytes設置爲相同的值,這意味着始終沒有可刪除段的候選項,因此不會發生刪除。

的算法爲:

  1. 首先計算差值。在你的情況下,差異是73MB(73MB + 1GB - 1GB)
  2. 迭代器所有非活動日誌段,比較其大小與差異
  3. 如果差異>日誌段大小,標記此段可刪除,並減少差異由size
  4. 否則,將此段標記爲不可修復,並嘗試使用下一個日誌段。
+0

那麼,手動刪除舊的日誌段然後重新啓動服務器可以嗎?我們的磁盤幾乎達到了80%。不想陷入任何災難性的錯誤。 – Ankush92

+0

個人而言,我認爲這是可行的,因爲Kafka所做的是刪除包括段文件和索引在內的日誌文件,並重新啓動服務器有助於更新服務器元數據,但我強烈建議您進行全面的測試。 – amethystic

+0

確實。我認爲卡夫卡和我建議手動完成的事情是一樣的。但在生產中做這樣的事情是相當大膽的。 – Ankush92

0

回答我的問題:

假設具有值24小時,log.retention.byteslog.segment.bytes都設置爲1 GB。當日志的值達到1 GB(稱爲此舊日誌)時,會創建一個新的日誌段(稱爲新日誌)。舊日誌然後在創建新日誌24小時後被刪除。

就我而言,新日誌是在我發佈此問題前約25個小時創建的。我動態地將主題(由Zookeeper維護,而不是Kafka集羣維護,因此不需要Kafka重啓)的retention.ms值更改爲24小時,我的舊日誌立即被刪除。

相關問題