zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

kafka日志清理策略

2023-04-18 16:26:39 时间

简述

Kafka是一个基于日志的流处理平台,一个topic可以有多个分区(partition),分区是复制的基本单元,在单节点上,一个分区的数据文件可以存储在多个磁盘目录中,配置项是:

# A comma separated list of directories under which to store log files
log.dirs=/disk1/kafka,/disk2/kafka,/disk3/kafka,/disk4/kafka,/disk5/kafka,/disk6/kafka,/disk7/kafka,/disk8/kafka,/disk9/kafka,/disk10/kafka,/disk11/kafka,/disk12/kafka

每个分区的日志文件存储的时候又会分成一个个的segment,默认日志段(segment)的大小是1GB,segment是日志清理的基本单元,当前正在使用的segment是不会被清理的。

# The maximum size of a log segment file. When this size is reached a new log segment will be created.
log.segment.bytes=1073741824  #1GB

日志清理

Kafka提供了日志删除(delete)和日志压缩(compact)两种清理日志的策略,可以通过参数cleanup.policy为每个主题指定不同的清理策略,也可以在代理启动时通过配置项log.cleanup.policy指定日志清理策略,这样该代理上的所有分区日志清理默认使用该配置设置的策略,主题级别的策略设置会覆盖代理级别的配置。

基于时间的删除策略

在server.properity文件中设置如下:

log.retention.hours=48
log.retention.check.interval.ms=300000
log.segment.bytes=1073741824

每个segment的大小为1GB,每5分钟检查一次是否有segment已经查过了48h,如果有将其标记为deleted。

基于文件大小的删除策略

在server.properity文件中设置:
log.retention.bytes(原来写的是log.segment.bytes)参数默认没有指定。
你可以同时指定log.retention.bytes和log.retention.hours来混合指定保留规则。一旦日志的大小超过了log.retention.bytes就清除老的segment,一旦某个segment的保留时间超过了规定的值同样将其清除。

删除逻辑是:首先计算日志段总大小与retention.bytes之间的差值(diff),得到需要删除的日志总大小,然后从第一个日志段开始查找,若diff与该日志段字节之差不小于0,则将该日志段加入到待删除集合中,以此类推,直到diff与查找的日志段大小之差小于0,查找结束,迭代待删除的日志段文件,进行物理删除。

参考资料:
https://mp.weixin.qq.com/s/7f5iUVYtxxZEYRPFybHW5A
https://mp.weixin.qq.com/s/PoON2wPw3xyflhRH1NBd-g