磁盘满为什么是高危故障
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,那只会加重故障。
活动段(正在写入的日志段)不会随保留期到期而删除,估算可释放空间时要按总占用减去至少一个段大小来算,否则会高估释放量。