Kafka日志清理目前主要有两种策略:

  1. 日志删除
  2. 日志压缩:日志压缩就是根据key来保留最后一条消息。

Kafka提供log.cleanup.policy参数进行相应配置,默认值:delete,还可以选择compact。

日志删除

配置 默认值 说明
log.retention.check.interval.ms 300000 (5分钟) 检测频率
log.retention.hours 168 (7天) 日志保留时间小时
log.retention.minutes 日志保留时间分钟
log.retention.ms 日志保留时间毫秒
file.delete.delay.ms 60000 (1分钟) 延迟执行删除时间
log.retention.bytes -1 无穷大 运行保留日志文件最大值
log.retention.bytes 1073741824 (1G) 日志文件最大值

Kafka会根据检测频率周期性的检测日志是否需要删除,日志删除策略主要有以下集中:

  • 基于时间的删除策略
  • 基于文件大小的删除策略
  • 基于日志文件起始偏移量
基于时间删除

Kafka会查找日志段的时间戳索引文件中的最后一条记录,如果最后一条timestamp小于0,则取最近修改时间。

当确认完需要删除的日志段以后,需要进行以下删除操作:

  1. 从日志对象中所维护日志分段的ConcurrentSkipListMap中移除待删除的日志分段,保证没有线程对这些日志分段进行读取操作。
  2. 为日志段中的所有文件加上.delete后缀
  3. Kafka中会有一个命名为"delete-file"的延迟任务来删除这些无效的日志数据

假如当前日志段中也有需要删除的数据,那么kafka会先进行分段,创建一个新的活跃日志段,然后执行删除操作。

基于大小删除
  1. 计算需要删除的日志大小的总和(当前日志大小-所允许的日志文件最大值)
  2. 然后从第一个日志分段开始查找,查找可以进行删除的日志段集合
  3. 最后执行删除操作
基于日志文件起始偏移量

日志文件起始偏移量默认等于第一个日志段的基准偏移量,但随着数据的删除操作,该值也在不断变化。

基于日志文件起始偏移量的判断规则是,如果一个日志段的下一个日志段的起始偏移量如果小于日志文件起始偏移量,那么该日志段就可以被加入到删除队列,最后执行删除。


shysh
82 声望17 粉丝