kafka大讲座:https://www.cnblogs.com/zackstang/category/1520711.html
参考链接:https://www.cnblogs.com/zackstang/p/11638127.html
https://blog.csdn.net/m0_45097637/article/details/123674946
kafka将topic分成不同的partitions,每个partition的日志分成不同的segments,最后以segment为单位将陈旧的日志从文件系统删除。
root@master:/public/nfs# du -d 1 -m . -hl
du -d 1 -m . -hl
Kafka过期数据清理策略
log.retention.hours=24 //1d
log.retention.check.interval.ms=300000 //5min
log.segment.bytes=1073741824 //1G
log.cleaner.enable=true
log.cleaner.delete.retention.ms=86400000 // 1d
log.cleaner.backoff.ms=15000 //15s
log.cleanup.policy=delete
在Kafka中,过期数据的清理是通过两个参数控制的:log.retention.ms和log.retention.bytes。
log.retention.ms:指定一个日志分段(log segment)最长保留的时间。 默认情况下,这个值是7天。在这个时间之前创建的所有分段都不会被删除,而在这个时间之后创建的分段,如果不再被引用,就会被删除。可以通过修改这个参数的值来控制过期数据的清理。
log.retention.bytes:指定日志分段的最大大小。 当一个日志分段的大小超过了这个值,且它不再被引用,就会被删除。这个参数的默认值是-1,表示不启用大小限制。
在Kafka中,每个分区都有一个独立的日志文件(log file),日志文件中包含多个日志分段。每个日志分段包含了一段时间内的数据,或者说一定数量的消息。当一个日志分段被创建时,它会被添加到日志文件中,然后写入的消息会被追加到这个分段中。在日志分段中的消息被消费完毕之后,这个分段就不再被使用了,如果它已经过期或者超过了最大大小,就会被删除。
需要注意的是,如果使用Kafka的日志清理功能,那么数据的删除不是立即生效的,而是由一个后台线程定期执行清理操作。这个后台线程默认情况下每隔5分钟执行一次清理操作,可以通过log.cleaner.backoff.ms参数修改清理间隔的时间。另外,日志清理操作并不是实时的,它会在一个时间窗口内处理多个日志分段,因此在清理周期内,一些分段可能会被保留下来,即使它们已经过期或者超过了大小限制。
日志清理的策略只有delete和compact两种
log.cleanup.policy = delete启用删除策略
log.cleanup.policy = compact启用压缩策略
Log Cleanup 策略
在Kafka中,存在数据过期的机制,称为data expire。如何处理过期数据是根据指定的policy(策略)决定的,而处理过期数据的行为,即为log cleanup。
在Kafka中有以下几种处理过期数据的策略:
log.cleanup.policy=delete(Kafka中所有用户创建的topics,默认均为此策略)
根据数据已保存的时间,进行删除(默认为1周)
根据log的max size,进行删除(默认为-1,也就是无限制)
log.cleanup.policy=compact(topic __consumer_offsets 默认为此策略)
根据messages中的key,进行删除操作
在active segment 被commit 后,会删除掉old duplicate keys
无限制的时间与空间的日志保留
log.cleanup.policy=delete
log.cleanup.policy=delete 的策略,根据数据保留的时间、以及log的max size,对数据进行cleanup。控制数据保留时间以及log max size的参数分别为:
log.retention.hours:指定数据保留的时常(默认为一周,168)
o 将参数调整到更高的值,也就意味着会占据更多的磁盘空间
o 更小值意味着保存的数据量会更少(假如consumer 宕机超过一周,则数据便会再未处理前即丢失)
log.retention.bytes:每个partition中保存的最大数据量大小(默认为-1,也就是无限大)
o 再控制log的大小不超过一个阈值时,会比较有用
自动清理Kafka中的数据可以控制磁盘上数据的大小、删除不需要的数据,同时也减少了对Kafka集群的维护成本。
那Log cleanup 在什么时候发生呢?
· 首先值得注意的是:log cleanup 在partition segment 上发生
· 更小/更多的segment,也就意味着log cleanup 发生的频率会上升
· Log cleanup 不应该频繁发生=> 因为它会消耗CPU与内存资源
· Cleaner的检查会在每15秒进行一次,由log.cleaner.backoff.ms 控制
log.cleaner.backoff.ms 清理检查时间配置
网友评论