kafka过期日志不删除,topic命令删除后,topic删了但是日志文件不删除

0 发表于: 2022-06-14   最后更新时间: 2022-06-14 14:13:29   2,445 游览

kafka集群中的节点3,topic通过命令删除时,日志文件标记了delete,但是文件没有自动删除

部分topic的过期日志文件没有删除。

server.properties 配置

server.properties配置

删除topic

删除topic

查看日志文件

查看kafka日志文件

log-cleaner.log 日志输出

The cleaning for partition rk0000-eoddc3d-eoddc3d-eoddc3d-swasdf is aborted and paused
The cleaning for partition rk0000-eoddc3d-eoddc3d-eoddc3d-swasdf is aborted

排查问题的原因及过程

  1. 起初这台kafka节点发生过两次因为kafka日志文件导致磁盘被撑爆的情况,按照日志文件过期删除策略,日志过期时间是168小时,理论上磁盘是完全足够的。并且在重启服务器和kafka节点后,经过大概半天左右的时间过期的日志文件自动被清理掉了。

  2. kafka集群其它节点是正常。kafka版本是2.3.1。

  3. 这次重启以后因为业务关系旧的topic全部停用了,新建了其它的topic来传输数据。本来以为日志会自动清理,但是检查以后发现旧的topic过期日志还是没有自动清理掉 。并且新的topic有部分能正常清理日志,有部分还是不能正常清理。

发表于 2022-06-14
0
  • 补充一下那个有问题的topic的describe,还有那个topic的数据到达过期时间了吗?無名 2年前 回复
    @無名 已经看不到describe了,topic里面存在了2个月之前的日志文件0 回复
    @0 之前因为故障而导致这个topic有问题?什么样的故障?导致的泄露,脱管。無名 回复
    @無名 从kafka日志里面找不到原因。 故障现象是kafka集群中的节点3部分topic的日志超过了log.retention.hours =168 的时间都不会自动清理。导致磁盘空间一直增长,最后撑爆磁盘。但是重启此节点,过期的日志会自动清理。 在手动删除topic时,zk里的topic列表会被删掉,并且kafka的日志文件会标记为delete。但是这个文件会一直存在不删除。重启此节点,标记delete的日志被删除了。0 回复
    @0 这意思是这台机器还是只有重启才会清理日志,现在问题还在。無名 回复
    @無名 是的0 回复
添加评论

问题解决了。但是原因具体原因不能确定。如果有相同情况,可以按照这个思路排查看看。
我们服务器是arm架构,但是jdk没有使用arm架构的,替换了jdk版本后文件正常删除了。

topic标记为删除,日志不删除

topic标记为删除,并不会立即删除日志,基于以下策略:

  • log.retention.bytes 删除日志之前的最大大小
  • log.retention.hours 删除日志文件保留的小时数(以小时为单位)
  • log.retention.minutes 删除日志文件之前保留的分钟数(以分钟为单位)
  • log.retention.ms 删除日志文件之前保留的毫秒数(以毫秒为单位),如果未设置,则使用log.retention.minutes的值。

详细参考Kafka Broker配置

过期日志不删除

可能是某些topic指定了压缩类型,或者删除前的延迟,通过以下命令进行查看:

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name my-topic --describe

0 -> 半兽人 2年前

log.retention.bytes,log.retention.hours,log.retention.minutes,log.retention.ms

这些参数是kafka的日志文件过期的时间。它是指在topic正常的情况下会删除过期的日志文件。

如果我通过命令 :

./kafka-topics.sh --zookeeper localhost:2181  --delete --topic  my-topic

删除了topic,正常情况下会在下次轮询时log.retention.check.interval.ms删除的时候将topic的日志文件删掉。

半兽人 -> 0 2年前

还有一些情况下,kafka是不会清理过期日志,你可以参考一下:

Kafka从不删除active segment(活跃段),也就是它将追加发送到分区的新消息的段。Kafka只删除旧段。当一个新的消息被发送到分区时,Kafka会将活跃段卷进一个旧的段,并且要么

  • 包含新消息的活动段的大小将超过log.segment.bytes,或者

  • 活跃段中第一条消息的时间戳超过log.roll.ms(默认是7天)。

你可以去消费一下那些不删除的topic,获取它的时间戳,如果时间戳大于7天,但是它依然在活跃的段,问题就是上面2个参数引起的,没有创新新的段。

0 -> 半兽人 2年前

每个segment的默认是1G,能看到日志文件已经有很多个了。这个topic的日志文件总的大小有两百多个G。而且文件数据有3个多月前的数据。理论上log.roll.ms+log.retention.hours=14天以后也会正常删除。

并且kafka节点在重启以后这些过期数据和删除的topic就会被正常删掉,这是我不能理解的地方。

我找到您之前回答的一个帖子,现象和这个帖子类似
类似帖

半兽人 -> 0 2年前

他还有种可能是broker.id可能写重,导致一些脏数据(即使改回来,也已经污染了数据),使得kafka在决策的时候无法分辨。

接下来的排查,你可能需要打开清理日志,查看具体终止清理的原因了。看看是什么堵住了,导致一直不清理。kafka报cleaning is aborted and paused

如:

  • 系统瓶颈,例如磁盘io满了
  • kafka清理线程满了,没有多余的线程进行清理
你的答案

查看kafka相关的其他问题或提一个您自己的问题