为什么Kafka不删除数据?

时间:2017-04-14 07:19:25

标签: apache-kafka

我有一个双节点Kafka群集,每个群集分配48 gb磁盘。 server.properties设置为将日志保留最多48小时或将日志段保留为1 GB。这是:

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的日志段。但根据我的理解,它应该已被删除。此外,自从这些原木由Kafka推出以来已经超过48小时了。想法?

2 个答案:

答案 0 :(得分:3)

在您的情况下,您将log.retention.byteslog.segment.bytes设置为相同的值,这意味着始终没有可删除段的候选项,因此不会发生删除操作。

算法是:

  1. 首先计算差异。在您的情况下,差异是73MB(73MB + 1GB - 1GB)
  2. 迭代所有非活动日志段,将其大小与diff
  3. 进行比较
  4. 如果差异>记录段大小,标记此段可删除,并按size
  5. 减少差异
  6. 否则,请将此段标记为不可删除,并尝试使用下一个日志段。

答案 1 :(得分:0)

回答我自己的问题:

让我们说BusinessDetail detail = new BusinessDetail(); detail.setArguments(bundle); 有24小时的值,而log.retention.hourslog.retention.bytes都设置为1 GB。当日志的值达到1 GB(调用此旧日志)时,将创建一个新的日志段(调用此新日志)。然后在创建新日志后24小时删除旧日志。

就我而言,我在发布此问题前约25个小时创建了新日志。我动态地更改了一个主题的retain.ms值(由Zookeeper维护,而不是Kafka集群,因此不需要Kafka重启)到24小时,我的旧日志立即被删除。