prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte的空间.
默认情况下,prometheus将采集到的数据存储在本地的TSDB数据库中,路径默认为prometheus安装目录的data目录下,数据写入过程先把数据写入内存,并存放在wal日志,然后2小时后将内存的数据保存至一个新的block块,同时再把新采集的数据写入内存并在2小时后保存至一个新的block块,以此类推。
1. Prometheus内部存储机制
Prometheus内置了一个本地的时间序列数据库,通过该数据库进行样本数据的存储,这种设计方式较大地简化了产品部署与管理的复杂性。 从2.x版本开始,Prometheus采用了更加高效的存储机制。
系统采集的样本数据会按照两个小时为一个时间窗口,将期间产生的数据存储在一个块(Block)中,每个块目录包含该时间窗口内所有的样本数据(chunks),一个元数据文件(meta.json)和一个索引文件(index)。 当通过API删除时间序列指标时,删除记录会存储在单独的墓碑(tombstone )文件中,而不会立即从文件中删除。
1.1 存储目录
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
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 | 样本数据,每个大小为512M,超过会被切分为多个 |
index | 索引文件,记录存储数据的索引信息,通过文件内的几个表来查找时序数据 |
meta.json | 元数据文件,包含了样本数、采集数据数据的起始时间、压缩历史 |
tombstones | 逻辑数据,主要记载删除记录和标记要删除的数据,删除标记,可在查询时排除样本数据 |
在当前时间窗口内正在收集的样本数据,则会被Prometheus保存到内存中。同时 ,为了确保系统在出现意外崩溃后数据依然能够恢复,Prometheus会通过预写日志(WAL)的方式进行临时保存,在重新启动后会从WAL目录进行加载,从而恢复数据。预写日志以128MB 的段存储在WAL目录中,这些文件包含尚未压缩的原始数据,因此你会看到它们将明显大于块文件。
- wal目录
-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的查询效率,当系统查询一段时间范围内所有的样本数据时,只需要简单的从落在该范围内的块中查询数据即可。同时,这种方式也可以简化历史数据的删除逻辑,当一个块的时间范围超过需要保留的范围后,直接清理该块即可。
1.2 block介绍
每个block为一个data目录中以01开头的存储目录,如下:
[root@Rocky data]# tree -L 2
.
├── 01JKYMG69KP2AG3R905FZT65FN
│ ├── chunks
│ ├── index
│ ├── meta.json
│ └── tombstones
[root@Rocky data]# tree -L 2
.
├── 01JKYMG69KP2AG3R905FZT65FN
│ ├── chunks
│ ├── index
│ ├── meta.json
│ └── tombstones
1. block特点
block块会压缩、合并历史数据块,以及删除过期的数据块,随着压缩、合并,block块数量会减少,在压缩过程中会发生三件事:定时执行压缩、合并小的block到大的block、清理过期的块
每个块有4部分组成:
[root@Rocky data]# tree -L 2
.
├── 01JKYMG69KP2AG3R905FZT65FN
│ ├── chunks
│ ├── index
│ ├── meta.json
│ └── tombstones
[root@Rocky data]# tree -L 2
.
├── 01JKYMG69KP2AG3R905FZT65FN
│ ├── chunks
│ ├── index
│ ├── meta.json
│ └── tombstones
2. 本地存储配置参数
--config.file="/path/prometheus.yml" # 指定配置文件
--web.listen-address="0.0.0.0:9090" # 指定监听地址
--storage.tsdb.path="/path/data" # 指定数据存储目录
--storage.tsdb.retention.size=B,KB,MB,GB,TB,PB,EB # 指定chunk大小,默认512M
--storage.tsdb.retention.time= # 数据保存时长,默认15天
--query.timeout=2m # 最大查询超时时间
--query.max-connections=512 # 最大查询并发数
--web.read-timeout=5m # 最大空闲超时时间
--web.max-connections=512 # 最大并发连接数
--web.enable-lifecycle # 启用api动态加载功能
--config.file="/path/prometheus.yml" # 指定配置文件
--web.listen-address="0.0.0.0:9090" # 指定监听地址
--storage.tsdb.path="/path/data" # 指定数据存储目录
--storage.tsdb.retention.size=B,KB,MB,GB,TB,PB,EB # 指定chunk大小,默认512M
--storage.tsdb.retention.time= # 数据保存时长,默认15天
--query.timeout=2m # 最大查询超时时间
--query.max-connections=512 # 最大查询并发数
--web.read-timeout=5m # 最大空闲超时时间
--web.max-connections=512 # 最大并发连接数
--web.enable-lifecycle # 启用api动态加载功能