Prometheus 存储学习

发布于:2025-09-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

一、序言

本篇文章主要根据官网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)

  1. 使用docker快速部署InfluxDB
    InfluxDB v1才支持prometheus 其他版本不支持

     docker run -d --name influxdb -p 8086:8086 influxdb:1.11.8
    
  2. 创建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
    
  3. 修改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"
    
  4. prometheus是否能正确查询到数据
    在这里插入图片描述

  5. 查看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
    

网站公告

今日签到

点亮在社区的每一天
去签到