0

    【问题排查】kafka0.10.x过期数据不会自动删除问题

    2023.09.25 | admin | 124次围观

    摘要

    线上环境kafka集群空间一共是8TB*12(disk)*4(node)=384TB,容量算是非常充裕了,而且每个topic设置的数据过期时间都是15天,但是发现磁盘容量已经80%。预估了下每天的数据增量,存满80%至少得5个月的数据。是过期数据没有删除吗?还是配置不起效?还是其他原因。

    问题情况

    检查了多个topic 节点上kafka-logs目录文件夹中的数据情况,发现如下情况。

    1.绝大多数topic最早的数据确实是只保留15天。说明配置确实是起效的。

    2.有个别topic数据保留了半年以上的。

    运行命令行查看最早的数据

    ./kafka-console-consumer.sh --bootstrap-server brokers:port --topic mytopic --from-beginning --property print.timestamp=true
    

    通过数据发现最早数据的时间戳是2020年,有的时间戳还有-1。

    问题原因

    查看kafka的文档

    The log retention time is no longer based on last modified time of the log segments. Instead it will be based on the largest timestamp of the messages in a log segment.

    日志保留的时间0.10.1之前是根据文件的最后修改时间kafka 提示没有空间,即linux系统时间。0.10.1修改为kafka消息中的timestamp时间。而且删除日志文件时是根据最早文件中时间戳最大的。

    其中我的一个topic最早的日志文件显示是7个月前,而且这个日志文件中最大的时间戳是2020年,最早的日志文件无法删除,所以后面的文件kafka一直也不会删除。

    时间戳错乱乱问题应该是开发早期不注意,或者写错导致。

    解决问题

    知道了上面的原因,需要从来修改两个方面。

    1.让开发确认写进kafka的时间戳都是正确的。

    2.写个shell脚本将几台机器上1个月前的数据全部删除,然后重启kafka。

    必须要重启,因为kafka进程中缓存了一些日志数据,也加载了kafka数据的时间索引,重启kafka让其重新加载数据。

    重启kafka后查看kafka日志kafka 提示没有空间,发现kafka已经开始自动删除15天前到1个月之间的数据,说明早期的数据时间戳有问题阻挡了kafka自动删除数据,早期错误的时间戳数据删除后,kafka就会自动删除后面过期的数据。

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论