Prometheus是目前被广泛使用的容器云监控系统,其底层实现了一个时序数据库(tsdb),它拥有强大的数据压缩和检索能力,可轻松应对每秒百万级的数据采集。本文基于最新的prometheus 2.12,为读者介绍prometheus tsdb存储模型。
1 时序数据
时序数据,就是按时间顺序采集而来的数据,一般表示为:
identifier -> (t0, v0), (t1, v1), (t2, v2), (t3, v3), ....
identifier是一个时间序列的标示,在prometheus中是以指标名称+label的形式来表示的,例如:
requests_total{path="/status", method="GET", instance=”10.0.0.1:80”}
requests_total{path="/status", method="POST", instance=”10.0.0.3:80”}
requests_total{path="/", method="GET", instance=”10.0.0.2:80”}
这是我们使用prometheus时能看到的内容,在prometheus内部,它是:
{__name__="requests_total", path="/status", method="GET", instance=”10.0.0.1:80”}
{__name__="requests_total", path="/status", method="POST", instance=”10.0.0.3:80”}
{__name__="requests_total", path="/", method="GET", instance=”10.0.0.2:80”}
那么prometheus tsdb保存的数据就是标示及其时序数据。
在prometheus中,series代表标示,samples代表采集的时序数据(time,value)
。
2 WAL
Prometheus采集到的当前数据,存于内存中,如果程序异常关闭,会导致当前的监控数据丢失。为此Prometheus实现了 wal功能(write ahead log),wal负责将当前内存中的监控数据同步到磁盘。prometheus重启后,可以读取wal数据,达到恢复数据,减少损失的目的。
2.1 概念
wal segments:存储段,在磁盘中的形式是一个带编号的文件,例如000000