Kafka过期数据老化原因及解决方案

网友投稿 1602 2022-05-28

一、 针对单个Topic过期时间的配置未设置成功

查看Kafka中某个Topic过期时间配置是否成功的方式如下:

1) Kafka客户端执行kafka-topics.sh --describe --zookeeper ZK业务IP:24002/kafka --topic TopicName

如果topic的describe信息中有“retention.ms”信息,则设置成功。

2)651X版本还可以通过FusionInsight Manager页面“集群->Kafka->KafkaTopic监控”中Topic配置查看

二、客户端版本低导致设置未生效

确认执行配置命令的客户端是否与Kafka服务端版本一致,如果不一致,下载最新的客户端重新执行修改配置命令。

三、节点异常或节点磁盘下线或数据目录异常

1.     节点异常

FusionInsight Manager页面“集群->Kafka->实例”查看各个实例状态是否是良好。

2.     磁盘下线

FusionInsight Manager有没有“数据目录状态异常”的告警。Topic副本所在节点server.log日志中搜“offline”关键字和“checkpoint file”关键字查看磁盘是否下线或因checkpoint文件问题没有上线。

3.     数据目录权限异常

节点上Kafka数据目录(一般是“/srv/BigData/kafka/dataX/kafka-logs”)目录权限是否正常。

四、 BufferOverflowException

Kafka server.log日志中删除时出现“Uncaught exception in scheduled task kafka-log-retention”和“java.nio.BufferOverflowException”关键字。

解决办法是升级到6518及之后版本。

五、Kafka数据Timestamp异常

1) 把未过期删除的分区中最早的segment的.log、.timeindex和.index文件拷贝到Kafka客户端所在节点,例如“/opt/client/test”路径

2) 执行kafka-run-class.sh kafka.tools.DumpLogSegments --files .timeindex文件路径 --print-data-log

如果最后一条timestamp时间戳值与当前值的差值小于设置的retention.ms的值,Kafka不会删除此segment及之后所有segment的数据。

例如,执行结果如下所示:

最后一条timestamp时间远超过当前时间,此分区此segment及之后的数据Kafka不会基于时间自动删除。如果想要删除可以手动停节点删除,也可以通过修改基于日志大小来删除。

Kafka过期数据未老化原因及解决方案

Kafka基于时间删除时,查找过期的日志分段文件不是根据最近修改时间(因为它可以被有意或者无意修改),而是根据日志分段中的最大时间戳largestTimestamp来计算的。要获取日志分段中的最大时间戳,首先查询该日志分段对应的时间戳索引文件,查找时间戳索引文件中最后一条索引项,若最后一条索引项的时间戳值大于0,则取其值,否则设置为最近修改时间。删除时先从跳表中移除待删除的日志分段,然后加上delete后缀,最后交由delete-file延时任务来删除这些文件,延时任务通过file.delete.delay.ms配置,默认60000(1分钟)。日志删除任务周测检配置是Log.retention.check.interval.ms,默认300000(5分钟)。

Kafka

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:五分钟带你玩转rabbitmq(七)怎么保证消息不丢失
下一篇:手把手教你搭建 RabbitMQ 集群
相关文章