因硬盘太小,数据量太大 不得不将数据的保存时间从默认的7天变为一天 

设置了参数log.retention.hours=24  但是发现3天前的数据还是存在 

查询官方文档发现

kafka 删除某个分区的消息 kafka delete.retention.ms_日志文件

活动的segment是不会压缩的 ,做了几个实验看有没有方法能够删除一直在发的topic数据

 

实验一

添加一个testdelet的topic  每隔10s发送一次数据 ,看一个小时是否会清除一个小时前数据 ,区别:每条记录发送结束后会关闭kafka连接

kafka 删除某个分区的消息 kafka delete.retention.ms_数据_02

观察时间 14:59分  发现未删除   结论 不分片没有用

 

 

实验二

修改server.properties d文件 设置

log.retention.hours=1

log.retention.ms=3600000

log.cleanup.polict=delete

log.segment.delete.delay.ms=60000

log.cleanup.interval.mins=10

log.retention.check.interval.ms=600000

看是否有不同变化

结论 和之前没有区别 数据没有区别, 该实验无效

 

实验三:

查看kafka tool在读取数据是否会对删除产生影响

结论 无影响  该实验无效

 

实验四 :

在  15.10分左右给control发送200条数据 ,看多少时间之后会被删除数据

kafka 删除某个分区的消息 kafka delete.retention.ms_kafka 删除某个分区的消息_03

 

 

实验五

停止一组topic的发送,看是否有变化  ,写修改

kafka 删除某个分区的消息 kafka delete.retention.ms_日志文件_04

./kafka-configs.sh   --entity-name simulator_250 --zookeeper localhost:2181 --entity-type topics  --alter --add-config  segment.bytes=10000000,retention.ms=3600000,retention.bytes=20000000

1. 关闭发送程序 10分钟后查看是否会删除历史数据

结论 不会被删除数据

2.将topic从消费者处删除  ,查看是否有效

结论 没有删除

3.等待删除时间

kafka 删除某个分区的消息 kafka delete.retention.ms_日志文件_05

kafka 删除某个分区的消息 kafka delete.retention.ms_数据_06

 

结论在 00000000.log的最后一条数据等待一个小时后 该数据被删除了 

kafka 删除某个分区的消息 kafka delete.retention.ms_数据_07

其他的日志也在陆续过来1个小时后删除

 

结论 kafka数据是否删除和是否有数据消费读取没有关系 ,和最后一个片段的最后一条数据的时间间隔有关

 

实验六

修改 segment.bytes=10000000,retention.ms=3600000

kafka 删除某个分区的消息 kafka delete.retention.ms_kafka_08

看1个小时后是否能够删除旧的文件片段

结果:

kafka 删除某个分区的消息 kafka delete.retention.ms_日志文件_09

能够删除  删除片段的开始时间11.20,最后时间 14.10分 真正删除时间 14:50分  

 

 

结论   切片后能够删除  其他topic没有删除

 

实验全部结论:

kafka数据想要删除需要设置 log.roll.hours(轮转时间)或是segment.bytes(文件大小)  控制日志文件一个最大为多大或多久切片 ,当上个日志文件的最后一条时间到达了log.segment.hours的时间后,上一条日志就会删除  ,或是该topic等待log.segment.hours时间没有数据进入  该topic会被删除

或是默认情况下 segment到达了1G自动分片  或是达到7天自动分片 导致旧的数据被删除

 

 默认删除的轮训时间是10分钟,所以可能部分的的时间有一点区别 

所有在配置中加入 log.roll.hours=12既可以解决问题