「Prometheus」- 存储,Storage(=> PROMETHEUS/Storage)

  CREATED BY JENKINSBOT

数据既能存储在本地,也能存储在远端系统中。

本地存储

样本数据两小时为一个组(块)。

./data
├── 01BKGV7JBM69T2G1BGBGM6KB12                 # 两小时
│   └── meta.json
├── 01BKGTZQ1SYQJTR4PB43C8PD98                 # 两小时
│   ├── chunks
│   │   └── 000001                                # 每 512M 一个
│   ├── tombstones                              # 通过 API 被删除的记录保存在这里
│   ├── index                                    # 指标名的索引、标签的索引
│   └── meta.json
├── 01BKGTZQ1HHWHV8FBJXW1Y3W0K                 # 两小时
│   └── meta.json
├── 01BKGV7JC0RY8A6MACW02A2PJD                 # 两小时
│   ├── chunks
│   │   └── 000001
│   ├── tombstones
│   ├── index
│   └── meta.json
├── chunks_head
│   └── 000001
└── wal
    ├── 000000002
    └── checkpoint.00000001
        └── 00000000

新传入指标的当前块在内存中,并未持久化,其实通过 WAL 进行保护。当服务重启时,其将被重放。
WAL 保存在 wal/ 目录,每个段 128M。
WAL 包含原始数据,所以会比较大。最少保留三个 WAL 文件,高负载服务器会更多。

本地存储,并非为大规模扩展场景设计。存储可靠性,需要依赖 RAID 等技术,SNAPSHOT 用于备份。
除了本地存储,使用 Remote R/W API 也是一种选择,但要仔细评估这些远程存储。

数据压缩

最初的两小时块最终在后台被压缩成更长的块。

压缩将创建更大的块,其中包含的数据:最多为保留时间的 10%,或 31 天,以较小者为准;

运维方面

Prom 提供多个选项来控制本地存储相关的内容,如字面意思:
1)–storage.tsdb.path
2)–storage.tsdb.retention.time
3)–storage.tsdb.retention.size

如果 time 和 size 同时存在,则先触发的将被使用。

过期块清理发生在后台。删除过期块最多可能需要两个小时,原因是块在被删除之前必须完全过期。

为了减小样本摄入频率,可以减少抓取频率,或者减少抓取数量(效果更好)。

如果数据损坏,则需要关闭服务,删除某些块目录(导致两小时内的数据丢失),或删除 WAL 目录。这也意味着,数据的丢失。

Non-POSIX FS

某些文件系统,Non-POSIX,不建议使用。NFS 也存在文件,所以建议使用本地文件系统。

远程存储

为了解决本地存储的问题,Prom 的 Remote R/W API 能够键数据写入远程存储。

有三种集成方式:
1)Prom 向 Remote 写入;
2)Prom 向 Remote 读取;
3)Prom 能够从其他 Prom 接收样本(以标准格式);内置 Remote W Receiver 通过 –web.enable-remote-write-receiver 开启;

R/W 协议使用快速压缩的 Protocol Buffer,在 HTTP 上。以后,或许会被替换为 gRPC over HTTP/2;

PromQL 的分布式执行暂时是不可能的。PromQL 的解析发生在 Prom 中,而非远程系统,所以 Prom 必须先读取数据在进行处理。

远程存储集成,参考 Integrations 文档。

数据回填(Backfilling)

mtulio/prometheus-backfill: Backfill historical data to Prometheus
thanos – Back-filling prometheus (and related system) metrics?
Prometheus backfilling. Backfill Prometheus metrics in… | by Tom Vincent
prometheus/storage.md at v2.24.0 · prometheus/prometheus
从Prometheus居然不能填充mock数据说起

简单说就是数据填充,向 Prom 中 Mock 数据(如果我们没有理解错)。

针对回填相关的内容,这里不再深入展开。在后面的具体场景中,我们将进一步探究相关内容。

补充说明:
1)Prometheus是一个建立在时序数据库(tsdb)上的指标监控系统,而不是个通用的时序数据库,跟InfluxDB从根本上来说,根本不是一回事。
2)Prometheus是个指标(metric)系统,它定时去抓取目标系统的实时状态(指标),而不关心这些数据的实际发生时间。
3)Prometheus不适合用来记录在特定时间发生的事件数据,处理这些数据是Elasticsearch或者InfluxDB更擅长的事。
4)Prometheus虽然不支持为指标设置时间戳,但是,通过promtool这个命令行工具,可以将历史数据以Prometheus的数据格式直接写入,或者说回填。

回填规则

通过 Rule 来生成数据,需要借助 promtool 命令。

针对回填相关的内容,这里不再深入展开。在后面的具体场景中,我们将进一步探究相关内容。