【HBZ分享】Kafka中日志清理策略

Kafka检测是否存在删除日志

Kafka日志存储流程和LOG日志解析 + LEO + HW 讲解【点击这里】.
Consumer消费者机制 与 分区策略讲解【点击这里】.
Kafka数据文件存储-可靠性保证ACK-ISR核心【点击这里】.

  • Kafka如何检测要删除的日志
    (1). kafka内部会定时检测是否又日志要删除,默认是5分钟,即log.retention,check.interval.ms
    (2). 支持配置策略对数据清理
    (3). 根据segment单位进行定期清理,注意每次都会删除完整的segment,不会删除某个.log的一部分

启动Kafka删除策略 及 原理

  • 启动cleaner
    (1). log.cleaner.enable = true
    (2). log.cleaner.threads = 2(清理线程数配置)

  • 日志删除
    (1). log.cleanup.polic = delete

    # 清理超过指定时间的消息,默认168小时,7天
    # 还有 log.retention.ms, log.retention.minutes, log.retention.hours, 优先级高到低
    log.retention.hours=168
    
    # 超过指定大小后,删除就得消息,下面是1G的字节数,-1表示不限制
    log.retention.bytes=1073741824
    
  • 分别解析【基于时间】与【基于大小阈值】两种删除策略
    (1). 基于【时间删除】日志说明:
    设定删除7天前的数据:每个segment都会维护一个【最新更新时间】的时间戳,即每次向segment写入数据都会记录写入时的时间戳,当一个segment被写满时,会创建一个新的segment继续写。那么被写满的segment就不会再被写入,那么最大时间戳这个字段就不会更新,kafka每5分钟会检查一次是否存在要删除的segment,当这个写满的segment最大时间戳 和 当前时间戳差值达到7天,则该segment会被整个删除掉

    (2). 基于【大小阈值删除】日志说明
    设定partition只保留1500M的日志,每个segment最多存500M: 当日志量达到1510M时,即有4个segment,分别是500M, 500M ,500M,10M。 此时1510M > 1500M, 按理说应该从最旧的segment删除10M,但上面提及过,Kafka每次只会删除完整的segment,而一个segment是500M,所以当日志总量1510M时kafka并不会删除日志。当总日志量到达2010M时,2010-1500 = 510M, 即 要删除510M的数据,所以kafka会把最旧的segment给删除掉,由于第二旧segment也是500M > 10M,所以不会被删除,结果就是真实删除日志大小就500M,那10M不会被删除

如果【基于时间】和【基于阈值】同时存在, 只要二者有一个满足,就会触发日志清理机制

  • 日志压缩法
    该方法也是清理日志节省空间的一个方法。即 只会保留最新数据。意思就是当日志中存在3个相同key的消息,Kafka只会保留最新的那个key,剩余两个会被删除掉,以此来节省空间。一般不用,正常只会用【基于时间】或者【基于阈值大小】来进行删除
上一篇:HashMap理解


下一篇:人人能看懂的区块链底层技术简介