描述
在一次迁移 Prometheus 数据后(虚拟机的备份与恢复过程),重新启动无法获取探针数据,Grafana Panel面板显示“no data”,无法正常显示。
查看日志出现如下错误信息:
msg="Error on ingesting samples with different value but same timestamp" num_dropped=24
msg="Appending scrape report failed" err="out of bounds"
数据存储目录结构
./data
├── 01J5VBTK92VT62TDTPPMS0V90K
│ ├── chunks
│ │ └── 000001
│ ├── tombstones
│ ├── index
│ └── meta.json
├── chunks_head
│ └── 000001
├── lock
├── queries.active
└── wal
├── 000000399
├── 000000400
├── 000000401
└── checkpoint.00000001
└── 00000000
这是因为 Prometheus 采用了 TSDB 时间序列数据库,每个 Samples 样本数据都带有时间戳。最新采集的数据会先存放到内存中,通过预写日志 (wal) 方便重启 Prometheus 后能够将数据重新放回内存中,Prometheus 保留至少三个预写日志文件。采集的样本会按2小时为单位进行分组,每2小时的块由单个目录构成,里面有索引文件和元数据,chunks 目录下由多个样本组成的单个或多个分片文件,作为持久化存储。
由此可见,当数据迁移完成并启动新的虚拟机后,Prometheus 会通过 wal 将样本重新放回内存,然后重新开始采集样本。如果此时新采集的样本时间戳小于或等于内存中样本时间戳,则会出现上述日志错误。
解决办法
停止运行 Prometheus
容器的话直接命令停止,也可以通过发送 SIGHUP 信号停止:
kill -TERM $(pgrep -f prometheus)
如果开启了--web.enable-lifecycle
的话,可以通过 API 方式停止。
curl -XPOST http://localhost:9090/-/quit
删除整个存储目录数据
通过--storage.tsdb.path
可以定义 Prometheus 写入数据库的位置,默认为data/。
Prometheus 的本地存储不支持非 POSIX 兼容文件系统,因为可能会发生不可恢复的损坏,例如绝大多数 NFS 都不符合 POSIX 标准。
我这里定义了--storage.tsdb.path=/prometheus
。需要注意的是,删除后,无法查看之前的历史数据,相当于重新部署 Prometheus。
cd /prometheus
rm -rf 0* wal/0* wal/checkpoint.0*
删除之后重新启动服务应该就恢复正常了。
评论区