1、分析设计参数配置:
分段策略属性
og.roll.{hours,ms} 日志滚动的周期时间,到达指定周期时间时,强制生成一个新的segment 168(7day)
log.segment.bytes 每个segment的最大容量。到达指定容量时,将强制生成一个新的segment 1G(-1为不限制)
log.retention.check.interval.ms 日志片段文件检查的周期时间 60000
日志清理策略
log.cleanup.policy:日志清理策略选择有:delete和compact主要针对过期数据的处理,或是日志文件达到限制的额度,会被topic创建时的指定参数覆盖 建议delete
log.retention.ms:数据存储的最大时间超过这个时间会根据log.cleanup.policy设置的策略处理数据,也就是消费端能够多久去消费数据。默认7day,建议2day
log.retention.bytes:日志数据存储的最大字节数。超过这个时间会根据policy处理数据。作用在每一个分区上,也就是说如果一个包含8个分区的主题,并且log.retention.bytes被设置为1GB,那么这个主题最多可以保留8GB的数据。目前集群配置512G,可以通过调小该值强制清理数据!!!
log.segment.delete.delay.ms 日志文件被真正删除前的保留时间60000,当删除的条件满足以后,日志将被“删除”,但是这里的删除其实只是将该日志进行了“delete”标注,log.segment.delete.delay.ms 这个时间以后,文件才会被真正的从文件系统中删除。
log.cleanup.interval.mins 每隔一段时间多久调用一次清理的步骤10
log.retention.check.interval.ms 周期性检查是否有日志符合删除的条件(新版本使用)300000
log.cleaner.delete.retention.ms: 对于压缩的日志保留的最长时间,也是客户端消费消息的最长时间,同log.retention.minutes的区别在于一个控制未压缩数据,一个控制压缩后的数据。会被topic创建时的指定参数覆盖。默认7day,建议2day
log.index.size.max.bytes: 这个参数会在日志segment没有达到log.segment.bytes设置的大小,也会强制新建一个segment会被topic创建时的指定参数覆盖。默认1G
执行策略:
log.retention.bytes和log.retention.ms达到要求,都会执行删除,会被topic创建时的指定参数覆盖。
2、kafka回收原理分析:
1-数据清理时分片未切分
kafka只会回收上个分片的数据!
配置没有生效的原因就是,数据并没有分片,所以没有回收。
kafka什么时候分片?两个参数控制:
log.roll.hours 设置多久滚动一次,滚动也就是之前的数据就会分片分出去
log.segment.bytes 设置日志文件到了多大就会自动分片
建议:
log.roll.ms
log.retention.ms
设置的时间相同!
2-程序导致maxTimestamp属于未来时间
客户producer写到Kafka的数据携带了timestamp且timestamp的值属于未来时间(其实还可能是未携带timestamp,但是producer的主机时间为未来时间,后续会说明)。
一个segment中的数据一旦携带了未来时间的timestamp,就会出现该segment过期未触发删除的现象。 可以通过设置log.message.timestamp.type=LogAppendTime固定使用过期时间。
参考:https://www.modb.pro/db/1770264213578158080
由于不让重启集群,通过在线调整topic 的log.retention.bytes大小清理数据。
在线修改配置:
./kafka-configs.sh --zookeeper ***:2181/kafka --alter --entity-name v-test-upload --entity-type topics --add-config retention.ms=259200000
./kafka-configs.sh --zookeeper ***:2181/kafka --alter --entity-name v-test-upload --entity-type topics --add-config cleanup.policy=delete
./kafka-configs.sh --zookeeper ***:2181/kafka --alter --entity-name v-test-upload --entity-type topics --add-config delete.retention.ms=259200000
./kafka-configs.sh --zookeeper ***:2181/kafka --alter --entity-name v-test-upload --entity-type topics --add-config retention.bytes=132433413888
./kafka-configs.sh --zookeeper ***:2181/kafka --alter --entity-name v-test-upload --entity-type topics --add-config message.timestamp.type=LogAppendTime
查看配置:
./kafka-configs.sh --describe --zookeeper ****:2181/kafka --entity-type topics --entity-name v-test-upload
./kafka-topics.sh --describe --bootstrap-server ****:9092 --topic v-test-upload
如何最近7天数据总量:
cd /data01/kafka/data/v-test-upload-1/
files=find ./ -type f -newermt '2024-06-18 00:00:00' ! -newermt '2024-06-25 00:00:00'|sort
sum=0
for i in $files
do
a= du $i|awk {'print $1'}
sum=$[a+sum]
done
echo $sum
第一行:切换到相关目录
第二行:查找修改时间在2019-01-22 14:30:00到2019-01-22 14:40:00中的文件
第三行至最后:统计每个文件的大小,默认为KB,再sum所有文件的大小