Kafka过期数据未老化原因及解决方案
一、 针对单个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基于时间删除时,查找过期的日志分段文件不是根据最近修改时间(因为它可以被有意或者无意修改),而是根据日志分段中的最大时间戳largestTimestamp来计算的。要获取日志分段中的最大时间戳,首先查询该日志分段对应的时间戳索引文件,查找时间戳索引文件中最后一条索引项,若最后一条索引项的时间戳值大于0,则取其值,否则设置为最近修改时间。删除时先从跳表中移除待删除的日志分段,然后加上delete后缀,最后交由delete-file延时任务来删除这些文件,延时任务通过file.delete.delay.ms配置,默认60000(1分钟)。日志删除任务周测检配置是Log.retention.check.interval.ms,默认300000(5分钟)。
- 点赞
- 收藏
- 关注作者
评论(0)