Skip to content

1. Prometheus内部存储机制

Prometheus内置了一个本地的时间序列数据库,通过该数据库进行样本数据的存储,这种设计方式较大地简化了产品部署与管理的复杂性。 从2.x版本开始,Prometheus采用了更加高效的存储机制。

系统采集的样本数据会按照两个小时为一个时间窗口,将期间产生的数据存储在一个块(Block)中,每个块目录包含该时间窗口内所有的样本数据(chunks),一个元数据文件(meta.json)和一个索引文件(index)。 当通过API删除时间序列指标时,删除记录会存储在单独的墓碑(tombstone )文件中,而不会立即从文件中删除。

1.1 存储目录

bash
drwxr-xr-x 3 nobody nobody    68 1  13 16:09 01JHFBCBQH9004292MCHCCGFTH # 块目录
drwxr-xr-x 2 nobody nobody    20 1  13 16:32 chunks_head
-rw-r--r-- 1 nobody nobody 20001 1  15 16:43 queries.active
drwxr-xr-x 3 nobody nobody    81 1  15 16:43 wal
drwxr-xr-x 3 nobody nobody    68 1  13 16:09 01JHFBCBQH9004292MCHCCGFTH # 块目录
drwxr-xr-x 2 nobody nobody    20 1  13 16:32 chunks_head
-rw-r--r-- 1 nobody nobody 20001 1  15 16:43 queries.active
drwxr-xr-x 3 nobody nobody    81 1  15 16:43 wal
参数描述
01JHFBCBQH9004292MCHCCGFTH块目录,这个会随着量,而变多
queries.active
chunks_head
wal预写日志
  • 块目录-01JHFBCBQH9004292MCHCCGFTH
bash
drwxr-xr-x 2 nobody nobody     20 1  13 16:09 chunks
-rw-r--r-- 1 nobody nobody 251082 1  13 16:09 index
-rw-r--r-- 1 nobody nobody    277 1  13 16:09 meta.json
-rw-r--r-- 1 nobody nobody      9 1  13 16:09 tombstones
drwxr-xr-x 2 nobody nobody     20 1  13 16:09 chunks
-rw-r--r-- 1 nobody nobody 251082 1  13 16:09 index
-rw-r--r-- 1 nobody nobody    277 1  13 16:09 meta.json
-rw-r--r-- 1 nobody nobody      9 1  13 16:09 tombstones
参数描述
chunks样本数据
index索引文件
meta.json元数据文件
tombstones墓碑文件

在当前时间窗口内正在收集的样本数据,则会被Prometheus保存到内存中。同时 ,为了确保系统在出现意外崩溃后数据依然能够恢复,Prometheus会通过预写日志(WAL)的方式进行临时保存,在重新启动后会从WAL目录进行加载,从而恢复数据。预写日志以128MB 的段存储在WAL目录中,这些文件包含尚未压缩的原始数据,因此你会看到它们将明显大于块文件。

  • wal目录
bash
-rw-r--r-- 1 nobody nobody 360448 1  13 18:16 00000090
-rw-r--r-- 1 nobody nobody      0 1  15 16:43 00000091
-rw-r--r-- 1 nobody nobody  32768 1  15 16:43 00000092
-rw-r--r-- 1 nobody nobody 226044 1  15 16:47 00000093
drwxr-xr-x 2 nobody nobody     22 1  15 16:43 checkpoint.00000089
-rw-r--r-- 1 nobody nobody 360448 1  13 18:16 00000090
-rw-r--r-- 1 nobody nobody      0 1  15 16:43 00000091
-rw-r--r-- 1 nobody nobody  32768 1  15 16:43 00000092
-rw-r--r-- 1 nobody nobody 226044 1  15 16:47 00000093
drwxr-xr-x 2 nobody nobody     22 1  15 16:43 checkpoint.00000089

通过时间窗口的方式保存样本数据,可以较好地提升Prometheus的查询效率,当系统查询一段时间范围内所有的样本数据时,只需要简单的从落在该范围内的块中查询数据即可。同时,这种方式也可以简化历史数据的删除逻辑,当一个块的时间范围超过需要保留的范围后,直接清理该块即可。

2. Prometheus容量管理

对Prometheus的容量来进行评估

按照官方数据,每个样本指标平均占用存储空间为1-2 字节,我们通过下面的公式可对总容量进行粗略的计算:

needed_disk_space = retention_time_seconds * ingested_samples_per_second * bytes_per_sample

参数说明
retention_time_seconds为数据保留时间范围内的总时间数
ingested_samples_per_second为平均每秒获取的指标数量
bytes_per_sample每条样本数据占用的空间大小,此处取2 字节

ingested_samples_per_second的数量可以采用下面的PromQL表达式获取,该表达式会计算出最近5分钟平均每秒获取的样本数量

rate(prometheus_tsdb_head_samples_appended_total[5m])

假设系统平均每秒获取的指标数量为10万个,按照默认样本保留 15天计算,那么需要的空间至少为259G。

(3600*24*15)* 100000 * 2 ≈ 259G