TSDB 存储异常排查指南:解决 'loading on-disk chunks failed' 错误
·
技术背景:TSDB 存储架构解析
Prometheus 的 TSDB(Time Series Database)采用多层存储设计,核心包含以下组件:
- 内存区(Head Block):最新数据首先写入内存中的 active chunk
- 预写日志(WAL):防止内存数据丢失的持久化日志
- 内存映射文件(mmap):将未压缩的 chunk 数据通过 mmap 机制映射到磁盘
- 持久化块(Block):每 2 小时将内存数据压缩为不可变的磁盘块

mmap 机制通过将磁盘文件映射到进程地址空间,实现高效的文件 I/O。但当发生异常关闭时,可能导致映射关系错乱。
错误分析:'out of sequence' 根源
错误日志 iterate on on-disk chunks: out of sequence m-mapped chunk 表明:
- 直接原因:chunk 的时间戳顺序异常(后一个 chunk 的起始时间早于前一个)
- 触发场景:
- Prometheus 进程被强制终止
- 磁盘空间不足导致写入中断
- 文件系统损坏
- 底层机制:mmap 的写入是非事务性的,崩溃时可能破坏 chunk 元数据
解决方案:五步恢复流程
1. 检查数据完整性
# 使用 promtool 检查块完整性
promtool tsdb analyze /path/to/storage --block=01HZ...
# 输出示例
[✗] Block 01HZ...: out of order chunk at 12345
2. 尝试自动修复
# 带修复模式的检查(自动跳过损坏块)
promtool tsdb analyze --repair /path/to/storage
3. 手动隔离损坏块
mv /path/to/storage/01HZ... /tmp/bad_block_backup
4. 重建索引(关键步骤)
promtool tsdb create-blocks-from openmetrics /tmp/healthy_data.txt /path/to/new_storage
5. 验证恢复结果
curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot

生产环境最佳实践
配置调优
# prometheus.yml 关键参数
tsdb:
retention: 15d
wal_compression: true
out_of_order_time_window: 30m # 2.40+版本支持乱序写入
监控指标
# 重要监控指标
rate(prometheus_tsdb_head_chunks_created_total[5m])
prometheus_tsdb_wal_corruptions_total
避坑指南
- 硬件层:
- 避免使用网络存储(NFS/AFS)
- 确保磁盘剩余空间 > 20%
- 配置层:
- 禁用
--storage.tsdb.no-lockfile生产环境 - 设置合理的
--storage.tsdb.retention.time - 运维层:
- 定期执行
snapshot备份 - 监控
tsdb_head_min_time和tsdb_head_max_time
深度思考
当遇到 out of sequence 错误时,本质上反映了 TSDB 的可靠性设计取舍:
- 性能优先:mmap 提供高速读写,但牺牲了崩溃一致性
- 恢复成本:校验和(checksum)会增加写入开销
- 工程平衡:Prometheus 选择通过 WAL+定期落块来折中
建议结合业务场景评估:
- 是否可以接受少量数据丢失?
- 是否需要实现类 InfluxDB 的 TSM 事务机制?
- 是否应该在前端增加缓存层?
最终解决方案往往不是技术选择,而是业务需求与技术成本的平衡。
更多推荐


所有评论(0)