Kafka数据清理机制

Apache Kafka中数据清理机制涉及的主要概念有两个:基于时间或大小的日志保留策略,以及日志压缩。这些特性允许Kafka管理其存储空间,保留有用的数据,同时清除过时或重复的数据。

基于时间或大小的日志保留策略

日志保留策略配置参数:

  • log.retention.hours:日志保留的小时数。
  • log.retention.bytes:日志保留的最大字节数。

Kafka的日志保留策略是通过删除旧的日志段来实现的。日志段(Log Segment)是Kafka日志的分割单位。

源码解析

在Kafka的源码中,日志保留策略主要是通过LogManager类管理的,具体实现在Log类的deleteOldSegments方法中。

scala 复制代码
// kafka/log/Log.scala

private def deleteOldSegments(predicate: (LogSegment) => Boolean): Int = {
  // ...中间代码省略...
  val lastClean = activeSegment.baseOffset // the active segment is always kept
  val deletable = logSegments.view.takeWhile(_.baseOffset < lastClean)
  val numToDelete = deletable.count(predicate)
  // ...中间代码省略...
  if(numToDelete > 0) {
    // Actually delete the segments marked for deletion
    logSegments.view.take(numToDelete).foreach(deleteSegment)
  }
  numToDelete
}

private def deleteSegment(segment: LogSegment) {
  // ...中间代码省略...
  segment.delete()
  // ...中间代码省略...
}
代码示例
shell 复制代码
# 设置主题的日志保留时间为2天
kafka-configs --zookeeper localhost:2181 --entity-type topics --entity-name your_topic --alter --add-config retention.ms=172800000

# 设置主题的日志保畛大小为1GB
kafka-configs --zookeeper localhost:2181 --entity-type topics --entity-name your_topic --alter --add-config retention.bytes=1073741824

日志压缩

日志压缩允许Kafka保留至少一条每个键的最新消息,同时删除任何旧的、重复的键值记录。

配置参数
  • cleanup.policy=compact:启用日志压缩。
  • min.cleanable.dirty.ratio:控制启动压缩任务前允许的最大脏数据比例。
源码解析

日志压缩在LogCleaner类中实现,它由一个或多个CleanerThread组成,不断循环遍历所有日志。

scala 复制代码
// kafka/log/LogCleaner.scala

class LogCleaner(config: CleanerConfig, 
                 logDirs: Array[File], 
                 logs: Pool[TopicAndPartition, Log], 
                 time: Time) extends Logging {
  // ...中间代码省略...

  private val cleaners = 
    (0 until config.numThreads).map(i => 
      new CleanerThread(i, logs, cleanerConfig, time)
    )
  
  // ...中间代码省略...
}

class CleanerThread(threadId: Int, 
                    logs: Pool[TopicAndPartition, Log], 
                    cleanerConfig: CleanerConfig, 
                    time: Time) extends ShutdownableThread {
  // ...中间代码省略...
  
  override def doWork() {
    // ...中间代码省略...
    cleanOrSleep()
    // ...中间代码省略...
  }
  
  // ...中间代码省略...
}
代码示例
shell 复制代码
# 创建带有日志压缩策略的主题
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic compacted_topic --config cleanup.policy=compact

# 更改现有主题的配置以启用日志压缩
kafka-configs --zookeeper localhost:2181 --entity-type topics --entity-name your_existing_topic --alter --add-config cleanup.policy=compact

注意事项

  • Kafka的日志清理操作是异步的,不会立即反映更改。
  • 对于压缩,键值是必须的,没有键的消息将不会被压缩。
  • 在压缩过程中,CPU和IO可能会有显著使用,这可能影响到Kafka的性能。
  • Kafka的日志清理与日志追加操作是并发进行的,设计上保证了数据的一致性。

Kafka源码提供了对数据清理机制的更深入理解。如果想要更详细地探索,可以直接查阅Kafka源码

相关推荐
坤昱11 小时前
cfs调度类深入解刨——最新内核细节分析5
linux·分布式·cfs调度·eevdf调度·linux调度·linux技术·kernel最新版本内容
AI人工智能+电脑小能手11 小时前
【大白话说Java面试题 第91题】【Mysql篇】第21题:分布式锁的使用场景和原理?
java·数据库·分布式·mysql·面试
JAVA社区11 小时前
Java高级全套教程(十三)—— 分布式锁超详细实战详解(原理+三种方案企业级落地)
java·开发语言·分布式·spring cloud·面试·java-zookeeper
Leo18712 小时前
分布式事务
java·分布式·分布式事务
潮起鲸落入海15 小时前
ceph分布式存储认证和授权,块存储管理
分布式·ceph
张小凡vip15 小时前
Spring Boot集成Kafka完整版
spring boot·kafka·linq
ZPC821016 小时前
前馈补偿原理 + 分类 + 公式 + 工程实现(配合 PID 使用,从根源减轻闭环收敛压力)
人工智能·分布式·机器人
Devin~Y16 小时前
智慧物流+AIGC客服Java大厂面试:Spring Boot、Kafka、Redis、JVM与RAG Agent实战
java·jvm·spring boot·redis·spring cloud·kafka·rag
闪电悠米16 小时前
黑马点评-分布式锁-02_simple_redis_lock_setnx
java·数据库·spring boot·redis·分布式·缓存·wpf
大迪deblog17 小时前
从分布式到中央计算:深度拆解下一代 Zonal 车载 EEA 架构变革
分布式·架构