首页/数据/数据工程与 ETL 速查/Broker 磁盘满应急处理
Kafka64 条

Broker 磁盘满应急处理

磁盘写满是 Kafka 高危故障:会导致副本离线甚至分区不可写。处理顺序是止血(限流与缩保留)、清空间(删过期段、迁分区)、再扩容与复盘。

磁盘满为什么是高危故障

Kafka 用日志段文件保存数据,磁盘写满后 broker 无法继续写入,副本可能被判为离线,严重时分区不可写、消费端也读不到新消息。处理顺序很关键:先止血(限流、临时缩短保留期),再释放空间(等过期段清理、把分区迁到空闲盘),最后才是扩容与复盘。中途反复重启 broker 只会让元数据抖动,问题更难定位。

基本信息

常见原因保留期过长、写入量激增、多盘分配不均、单分区倾斜
止血手段缩短 retention、限流、临时停写非核心主题
释放空间等待过期段清理,或把大分区迁移到空闲盘
关键事实正在写的活动段不会被删除

典型使用场景

  • 磁盘使用率告警:定位是哪块盘、哪个主题在增长
  • 突发写入:上游批量补数导致短时间写入激增
  • 保留策略评估:默认保留期过长,历史数据占用大量空间
  • 多盘不均:分区集中在单块盘,其他盘仍有大量余量
  • 扩容前评估:确认剩余余量与新盘规划

应急处理顺序

应急处理顺序
# 1) 先确认是哪块盘、哪个主题在涨
df -h /data/kafka
du -sh /data/kafka/* | sort -h | tail -5
kafka-log-dirs.sh --bootstrap-server localhost:9092 --describe | head

# 2) 对非核心主题临时缩短保留期(这里改为 1 天,单位毫秒)
kafka-configs.sh --bootstrap-server localhost:9092 \
  --entity-type topics --entity-name orders \
  --alter --add-config retention.ms=86400000

# 3) 迁移大分区到空闲盘:先准备迁移 JSON,再带限流执行
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
  --reassignment-json-file move-to-disk2.json \
  --throttle 50000000 --execute

# 4) 迁移中与完成后都要校验
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
  --reassignment-json-file move-to-disk2.json --verify

排查顺序与动作

步骤主要命令目的
确认范围df -h、du -sh定位具体盘与目录
定位主题kafka-log-dirs.sh --describe找出占空间的主题与分区
止血kafka-configs.sh 改 retention尽快减少新增占用
释放空间等待清理或迁移分区腾出可用空间
恢复复核reassign --verify确认容量回到安全区间
保留时间改短后,实际删除要等段滚动与检查周期(log.retention.check.interval.ms 默认 5 分钟),不要因为没立刻见效就反复重启 broker,那只会加重故障。
活动段(正在写入的日志段)不会随保留期到期而删除,估算可释放空间时要按总占用减去至少一个段大小来算,否则会高估释放量。

易错点

  • 活动段不会随保留期到期被删除,只按配置算能释放多少空间,实际会落空
  • 磁盘满期间反复重启 broker,元数据抖动叠加副本追赶,故障范围被放大
  • 迁移分区不加限流,抢占带宽影响正常读写,业务延迟明显上升
  • 只清理磁盘不做容量复盘,下一轮写入高峰会在同一块盘上重现

数据来源与参考

  • Apache Kafka 官方文档:Log Retention 与 Cluster Expansion
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌