☰
记一次Prometheus的WAL异常,导致服务器磁盘占用过高
2026/10/7 8:16:53 网站建设 项目流程

一、问题描述:

国庆假期期间,群里有开发联调环境服务器监控告警,具体信息如下

登录到服务器之后,发现prometheus目目录下面有很多WAL文件

总文件大小,占用了接近20G,所以触发了上图的空间占用告警

二、原因分析:

理论上prometheus应该配置了WAL日志的压缩和保留策略,可以看到Prometheus的pod里面配置文件,配置了15天的保留策略,理论上不会出现磁盘占用问题

--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus --storage.tsdb.retention.time=15d --web.listen-address=:9090

当时查看Prometheus日志,发现一些关键信息

compaction failed corruption in segment /prometheus/wal/00000066 unexpected full record

同时还能看到:

write block Head GC completed Creating checkpoint

这些关键日志表明

- Prometheus 仍在持续接收监控样本;

- Head 数据仍可能正常生成新的 block;

- 但在创建 checkpoint、读取 WAL 段 00000066 时遇到损坏或不完整记录;

- checkpoint 失败后,旧 WAL 无法正常截断;

- 新 WAL 持续生成,最终导致 /data/prometheus/dev-test/wal 占满磁盘。

三、解决方案:

1. 停止 Prometheus

kubectl -n monitoring scale deployment/prometheus --replicas=0 kubectl -n monitoring get pod -l app.kubernetes.io/name=prometheus

必须确认 Prometheus Pod 已终止,并确认节点上没有仍在运行的 Prometheus 进程:

pgrep -af '/bin/prometheus|prometheus --config.file' || true

2. 保留旧 TSDB 并创建新目录

STAMP=$(date +%Y%m%d%H%M%S) BACKUP=/data/prometheus/dev-test.corrupt.${STAMP} ​ mv /data/prometheus/dev-test "$BACKUP" mkdir -p /data/prometheus/dev-test chown --reference="$BACKUP" /data/prometheus/dev-test chmod --reference="$BACKUP" /data/prometheus/dev-test ​ ls -ld /data/prometheus/dev-test "$BACKUP" df -hT /

3. 恢复 Prometheus

kubectl -n monitoring scale deployment/prometheus --replicas=1 kubectl -n monitoring rollout status deployment/prometheus --timeout=180s

验证:

kubectl -n monitoring get pod -l app.kubernetes.io/name=prometheus -o wide kubectl -n monitoring logs -l app.kubernetes.io/name=prometheus --since=10m


四、后续优化

1. 存储优化

  • 不要把 Prometheus TSDB 放在节点根分区;

  • 使用独立数据盘或 Kubernetes PVC;

  • 为 Prometheus 配置明确的存储容量和扩容方案;

  • 这次开发联调环境,应该避免生产环境使用无容量边界的HostPath;

  • 对 TSDB 目录设置独立的磁盘使用率监控。

2. 数据保留和远端存储

  • 时间保留和容量保留同时配置;

  • 通过--storage.tsdb.retention.time与--storage.tsdb.retention.size双重约束;

  • 重要监控数据使用remote_write写入长期存储;

  • 明确本地数据丢失后的恢复目标和可接受时间。

示例:

--storage.tsdb.retention.time=15d --storage.tsdb.retention.size=80GB

实际容量应根据磁盘大小、样本量、压缩比例和增长趋势测算,不应机械套用示例值。

3. 版本和升级

  • 评估从2.22.1升级到当前组织批准的稳定版本;

  • 升级前备份配置、规则、告警和数据目录;

  • 先在测试环境验证 WAL replay、compaction、remote_write 和规则兼容性;

4. 告警建议

至少配置以下告警:

  • 文件系统使用率超过 80%、90%、95%;

  • Prometheus TSDB WAL 目录持续增长;

  • Prometheus compaction 失败;

  • Prometheus WAL 损坏或 checkpoint 失败;

  • Prometheus readiness 失败;

  • 抓取目标大量丢失;

  • Prometheus 重启次数异常;

  • 远端写入失败或积压。

5. 运维巡检

如果是生产环境,建议每日或每小时执行只读巡检:

df -hT / du -sxh /data/prometheus/dev-test du -sxh /data/prometheus/dev-test/wal find /data/prometheus/dev-test/wal -maxdepth 1 -type f | wc -l kubectl -n monitoring get pod -l app.kubernetes.io/name=prometheus kubectl -n monitoring logs -l app.kubernetes.io/name=prometheus --since=1h \ | grep -Ei 'corruption|compaction failed|checkpoint|out of space|error'

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询