kafka 数据定时删除实验
因硬盘太小,数据量太大 不得不将数据的保存时间从默认的7天变为一天
设置了参数log.retention.hours=24 但是发现3天前的数据还是存在
查询官方文档发现
活动的segment是不会压缩的 ,做了几个实验看有没有方法能够删除一直在发的topic数据
实验一
添加一个testdelet的topic 每隔10s发送一次数据 ,看一个小时是否会清除一个小时前数据 ,区别:每条记录发送结束后会关闭kafka连接
观察时间 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条数据 ,看多少时间之后会被删除数据
实验五
停止一组topic的发送,看是否有变化 ,写修改
./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.等待删除时间
结论在 00000000.log的最后一条数据等待一个小时后 该数据被删除了
其他的日志也在陆续过来1个小时后删除
结论 kafka数据是否删除和是否有数据消费读取没有关系 ,和最后一个片段的最后一条数据的时间间隔有关
实验六
修改 segment.bytes=10000000,retention.ms=3600000
看1个小时后是否能够删除旧的文件片段
结果:
能够删除 删除片段的开始时间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既可以解决问题