Prometheus 存储学习
一、序言
本篇文章主要根据官网https://prometheus.io/docs/prometheus/latest/storage/文章对存储的描述进行理解。
prometheus 使用一个嵌入式的tsdb数据库存储数据,此数据库并非像平常数据库可登录查询数据,而是需要通过promql或者webui界面查询。
二、 运行时参数
--storage.tsdb.path:
Prometheus 写入其数据库的位置。默认为 data/。--storage.tsdb.retention.time:
保留时间默认为 15d。支持的单位:y, w, d, h, m, s, ms。--storage.tsdb.retention.size:
设置最多占用多少存储空间。默认为 0 或禁用。支持的单位:B, KB, MB, GB, TB, PB, EB。 WAL 和 m-mapped 也计入总大小。--storage.tsdb.wal-compression :
是否会对 WAL 日志进行压缩存储,默认否。
WAL介绍:
WAL 是 Prometheus TSDB 用于保证数据可靠性的临时日志,所有新采集的监控样本(时间序列数据)会先写入 WAL,再定期批量写入磁盘上的持久化存储(块文件)。这是为了防止 Prometheus 意外崩溃时丢失未持久化的数据。
三、Prometheus 的数据存储了解
存储目录结构如下:
root@localhost:~# ll /var/lib/prometheus/
drwxr-xr-x 9 root root 4096 Sep 6 21:00 ./
drwxr-xr-x 45 root root 4096 Sep 6 09:51 ../
drwxr-xr-x 3 root root 4096 Sep 6 13:00 01K4EPAVVDMQHK7HQZ9HKDT5AV/
drwxr-xr-x 3 root root 4096 Sep 6 17:00 01K4F42A6EHFC1NF0XNDEGYRE6/
drwxr-xr-x 3 root root 4096 Sep 6 19:00 01K4FAY1F2BXGZ6K1ZZZ8CBEHF/
drwxr-xr-x 3 root root 4096 Sep 6 19:00 01K4FAY1PGZN9XH8KKKPNNZJCW/
drwxr-xr-x 3 root root 4096 Sep 6 21:00 01K4FHSRQ6D5TPA953YG7V3765/
drwxr-xr-x 2 root root 4096 Sep 6 21:01 chunks_head/
-rw-r--r-- 1 root root 0 Sep 6 15:18 lock
-rw-r--r-- 1 root root 20001 Sep 6 22:36 queries.active
drwxr-xr-x 3 root root 4096 Sep 6 21:00 wal/
prometheus 正常来说,会将最近两小时采集的数据(一个块文件)保存到chunks_head
目录下,当满足2小时或者达到指定大小时,prometheus tsdb将会冻结chunks_head
并生成一个以 01K4EPAVV...
命名的持久化块目录,该目录结构如下:
chunks_head
目录下默认会保留两个块,4个小时的数据。
非正常的情况是:当你重启prometheus 时,他会自动将之前收集的数据,即使不满2小时或者存储阈值也会生成一个01K4EPAVV...
命名的文件。
--max-block-duration
修改满足多久生成新的文件,参考链接详细说明:https://prometheus.io/docs/prometheus/latest/storage/#longer-block-durations
root@localhost:/var/lib/prometheus# tree 01K4FHSRQ6D5TPA953YG7V3765/
01K4FHSRQ6D5TPA953YG7V3765/
├── chunks
│ └── 000001
├── index
├── meta.json
└── tombstones
chunks
:该目录保存着2 小时内所有时间序列的样本数据index
:存储着时间序列的标签索引,是 Prometheus 高效查询数据的关键meta.json
:存储着当前数据块的元信息和统计数据,例如采集开始和结束时间,块的uuid,块大小等tombstones
:记录被标记为删除的时间序列,例如:当http_requests_total{path=“/old-api”} 这个api被废弃时,删除之前的所有数据时,prometheus会在tombstones文件中记录删除范围,当执行查询http_requests_total{path=“/old-api”} 时,会被自动过滤掉,相当于逻辑删除,当进行块合并时,被标记的数据不会被合并,相当与物理删除。(prometheus会动态的将之前的旧数据聚合)
chunks_head
已经介绍过了新收集的指标数据会保存在此目录下,收集完两小时后就会生成01K4EPAVV...
命名的持久化块目录,并将数据迁移过去。
lock
: 进程锁文件,主要功能是防止多个prometheus实例同时访问数据,导致数据损坏
WAL
:在上面也有介绍,就是新采集的指标数据会先预写到WAL–> 内存 --> chunks_head,这样的好处是当promeheus意外重启,chunks_head的数据不完整时,将通过加载chunks_head --> wal 来恢复丢失的数据。
查看WAL
目录结构:
tree wal/
wal/
├── 00000022
├── 00000023
├── 00000024
└── checkpoint.00000021
└── 00000000
000000开头的文件
:存储最新采集的监控样本数据(以日志形式按顺序写入)
checkpoint.00000021
:检查点目录,存储 WAL 日志的 “检查点快照”,用于优化重启时的恢复速度。
- 工作原理:
当 WAL 日志文件累积到一定数量(默认每生成 16 个日志文件),TSDB 会对已写入 chunks_head/ 的数据做一次 “快照”,写入 checkpoint.XXX 目录,重启prometheus也会触发。就是合并之前16个日志文件,并将之前的日志文件删除。
四、远程存储学习
prometheus 提供了一套接口,允许与远程存储系统进行集成,官方文档链接:https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations
prometheus 支持的外部存储查看链接:https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage
如下演示如何使用InfluxDB
数据库作为外部存储:
InfluxDB 是一款专为 时间序列数据(Time-Series Data) 设计的开源时序数据库(Time-Series Database, TSDB)
使用docker快速部署InfluxDB
InfluxDB v1才支持prometheus 其他版本不支持docker run -d --name influxdb -p 8086:8086 influxdb:1.11.8
创建prometheus数据库
docker exec -it influxdb bash influxdb@1e2d4cc5ca15:/$ influx
Connected to http://localhost:8086 version v1.11.8 InfluxDB shell version: v1.11.8 > CREATE DATABASE "prometheus" > SHOW DATABASES name: databases name ---- _internal prometheus
修改prometheus配置
在prometheus.yml
配置文件后面加入两行remote_write: - url: "http://localhost:8086/api/v1/prom/write?db=prometheus" remote_read: - url: "http://localhost:8086/api/v1/prom/read?db=prometheus"
prometheus是否能正确查询到数据
查看InfluxDB中的数据
influxdb@1e2d4cc5ca15:/$ influx
Connected to http://localhost:8086 version v1.11.8 InfluxDB shell version: v1.11.8 > USE prometheus Using database prometheus > SELECT * FROM "up" limit 3 name: up time __name__ app instance job value ---- -------- --- -------- --- ----- 1757229925823000000 up 192.168.25.225:9100 consul_exporter 1 1757229927835000000 up 192.168.25.221:9100 consul_exporter 0 1757229929158000000 up prometheus localhost:9090 prometheus 1