Prometheus的监控数据存储和持久化策略是什么

Prometheus 2.x 默认将时间序列数据库保存在本地磁盘中,同时也可以将数据保存到任意第三方的存储服务中。
本地存储
Prometheus 采用自定义的存储格式将样本数据保存在本地磁盘当中。
1. 存储格式
Prometheus 按照两个小时为一个时间窗口,将两小时内产生的数据存储在一个块(Block)中。每个块都是一个单独的目录,里面包含该时间窗口内的所有样本数据(chunks)、元数据文件(meta.json)以及索引文件(index)。其中索引文件会将指标名称和标签索引到样板数据的时间序列中。此期间如果通过 API 删除时间序列,删除记录会保存在单独的逻辑文件 tombstone 当中。
当前样本数据所在的块会被直接保存在内存中,不会持久化到磁盘中。为了确保 Prometheus 发生崩溃或重启时能够恢复数据,Prometheus 启动时会通过预写日志(write
ahead – log(WAL))重新记录,从而恢复数据。预写日志文件保存在 wal 目录中,每个文件大小为 128MB。wal 文件包括还没有被压缩的原始数据,所以比常规的块文件大得多。一般情况下,Prometheus 会保留三个 wal 文件,但如果有些高负载服务器需要保存两个小时以上的原始数据,wal 文件的数量就会大于 3 个。
Prometheus 保存块数据的目录结构如下所示:
/data
01BKGV7JBM69T2G1BGBGM6KB12 块
meta.json 元数据
wal 写入日志
000002
000001
01BKGTZQ1SYQJTR4PB43C8PD98 块
meta.json 元数据
index 索引文件
chunks 样本数据
000001
tombstones 逻辑数据
01BKGTZQ1HHWHV8FBJXW1Y3W0K
meta.json
wal
|-000001
最初两个小时的块最终会在后台被压缩成更长的块。
2. 本地存储配置
Prometheus 提供了几个参数来修改本地存储的配置,最主要的有:
`–storage.tsdb.path`:数据存储路径,默认为`/data`。
`–storage.tsdb.retention.time`:样本数据在存储中保存的时间,超过该时间限制的数据就会被删除,默认为15天。
`–storage.tsdb.retention.size`:每个块的最大字节数(不包括 wal 文件)。如果超过限制,最早的样本数据会被优先删除。支持的单位有 KB, MB, GB, PB,例如:“512MB”。该参数只是试验性的,可能会在未来的版本中被移除。
监控数据持久化策略
Prometheus 的数据持久化策略主要包括以下几个方面:
1. 本地存储
数据以时间序列的形式存储在本地磁盘中,每个时间序列由一个指标名称和一组标签组成。数据的存储格式是高效的,并且支持快速查询和检索。
本地存储不可复制,无法构建集群,如果本地磁盘或节点出现故障,存储将无法扩展和迁移。因此本地存储可视为近期数据的短暂滑动窗口。如果对数据持久化要求不是很严格,可以使用本地磁盘存储多达数年的数据。
2. 远程存储
Prometheus 开放了远程写入协议接口,可以将报告的指标数据推送到远程服务器以进行长期保存。远程服务器负责存储 Prometheus 的所有长期数据,当下游的消费者需要查询数据来生成报表时,下游存储服务将提供长期数据。
例如,可以使用 VictoriaMetrics 作为远程存储。VictoriaMetrics 可通过集群部署实现高可用,并且支持与 Prometheus 的集成。在配置 Prometheus 时,可以通过`remote_write`配置项将数据写入 VictoriaMetrics,同时在 Grafana 中配置 VictoriaMetrics 作为数据源来查询监控数据。
3. 数据压缩和过期处理
Prometheus 的存储优化主要集中在减少磁盘占用和过期数据处理。数据会被定时从缓存持久化到磁盘上的块文件中,过期的数据会被定期清理。
最初的两个小时的块最终在后台压缩成更长的块,压缩将创建更大的块,其中包含跨度最多为保留时间的 10% 或 31 天的数据,以较小者为准。
Lei
April 24, 2025
技术探讨