2017-04-14 86 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小时,我的旧日志立即被删除。

相关问题