侧边栏壁纸
博主头像
liveJQ博主等级

沒有乐趣,何来开始

  • 累计撰写 162 篇文章
  • 累计创建 66 个标签
  • 累计收到 2 条评论

Prometheus 重启后出现”out of bounds“错误

liveJQ
2024-07-28 / 0 评论 / 0 点赞 / 17 阅读 / 1,264 字 / 正在检测是否收录...
广告 广告

描述

在一次迁移 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*

删除之后重新启动服务应该就恢复正常了。

相关资料

  1. Storage | Prometheus
  2. Management API
  3. TSDB Admin APIs
  4. Prometheus TSDB
0

评论区