行家必读:Kafka 日志存储策略配置实战指南

一、核心概念与生效层级
- 先区分两类“日志”:
- 消息日志(Log):即 Topic 分区对应的数据文件,存储路径由 log.dirs 指定;
- 服务日志(Kafka Server/GC 等):即 Kafka 运行过程中的服务日志,由 log4j.properties 负责控制。
- 配置生效优先级为:Topic 级动态配置 > Broker 级默认配置。常见做法是在 server.properties 中设置全局默认值,再通过 kafka-configs.sh 对指定 Topic 进行覆盖配置。
- 日志清理策略主要分为:
- delete:根据保留时间或存储大小删除旧日志分段;
- compact:按消息键保留同一 key 的最新值,适用于变更日志和状态流场景;
- 也可以设置为 delete,compact,同时启用删除与压缩策略,具体应按 Topic 的业务用途选择。
二 关键参数与默认值
- 存储与分段
- log.dirs:Kafka 消息日志存储目录(多个路径用逗号分隔,建议分布在不同磁盘上);
- log.segment.bytes:单个日志分段的大小上限,默认 1GB;
- log.roll.{hours,ms}:按时间强制滚动日志分段的周期,默认 168 小时(7 天)。
- 保留与检查
- log.retention.{ms,minutes,hours}:日志保留时间,优先级为 ms > minutes > hours,默认 168 小时;
- log.retention.bytes:按分区维度保留的总大小阈值,默认 -1(不限制);
- log.retention.check.interval.ms:检查日志是否满足删除条件的时间间隔,常用值为 300000 ms(5 分钟);
- log.segment.delete.delay.ms:日志分段被标记删除后到真正物理删除的延迟时间,默认 60000 ms(1 分钟)。
- 清理与压缩
- log.cleanup.policy:日志清理策略,可选值为 delete/compact,默认 delete;
- log.cleaner.enable:是否启用日志压缩器,默认 true;
- compression.type:消息压缩算法,可选 producer/snappy/lz4/gzip,默认 producer(继承生产者端压缩方式)。
三 配置步骤与示例
- 全局默认(server.properties)
- 设置数据目录与日志分段
- log.dirs=/data/kafka/data
- log.segment.bytes=1073741824
- log.roll.hours=168
- 设置日志保留与检查周期
- log.retention.ms=604800000
- log.retention.bytes=-1
- log.retention.check.interval.ms=300000
- 设置清理策略与压缩方式
- log.cleanup.policy=delete
- log.cleaner.enable=true
- compression.type=snappy
- 设置数据目录与日志分段
- 按 Topic 覆盖(动态生效)
- 创建时指定
- bin/kafka-topics.sh --create --topic orders --bootstrap-server localhost:9092
–partitions 3 --replication-factor 3
–config retention.ms=172800000 --config cleanup.policy=compact
- bin/kafka-topics.sh --create --topic orders --bootstrap-server localhost:9092
- 运行中修改
- bin/kafka-configs.sh --bootstrap-server localhost:9092
–alter --entity-type topics --entity-name orders
–add-config retention.ms=259200000,segment.bytes=536870912
- bin/kafka-configs.sh --bootstrap-server localhost:9092
- 创建时指定
- 立即删除某 Topic 的过期数据(需谨慎操作)
- bin/kafka-topics.sh --alter --topic orders --config cleanup.policy=delete
- 服务日志轮转(避免持续占用系统盘空间)
- 在 config/log4j.properties 中配置 RollingFileAppender 的 MaxFileSize/MaxBackupIndex;
- 如果仅修改 log4j.properties 路径仍未生效,还需要在 bin/kafka-run-class.sh 中导出 LOG_DIR,指向新的日志目录。
四 运维要点与常见坑
- 删除粒度是“分段”而不是逐条消息:只有当日志分段关闭并转为非活动状态后,满足 retention.ms/retention.bytes 条件才会被清理;因此实际保留时间往往会比配置值多出一个活跃分段对应的时间窗口。
- 压缩与保留策略要结合业务场景取舍:对于变更日志或状态类 Topic,适合使用 compact;对于审计日志或事件流,则更适合使用 delete,并合理设置 retention.ms/retention.bytes。
- 刷盘策略方面:通常不建议在 Broker 端通过 log.flush.interval.messages/ms 强制刷盘。Kafka 一般依赖 副本机制 来保障可靠性,强制刷盘会明显影响系统吞吐能力。
- 监控与容量规划:应重点关注 磁盘使用率、日志分段数量、清理延迟 等关键指标,并在必要时结合告警机制与容量规划方案,如多磁盘部署、分层存储等。
