- 深入浅出Prometheus:原理、应用、源码与拓展详解
- 陈晓宇 杨川胡 陈啸编著
- 7字
- 2025-04-14 19:57:17
第3章 数据存储
3.1 存储接口
Prometheus提供了两种存储方式,分别为本地存储和远端存储。
本地存储通过Prometheus自带的时序数据库将数据保存在本地,从而实现高性能读写。但时序数据库毕竟是非集群的数据库,这样就限制了它的存储容量,无法保存大量的历史监控数据。为此,Prometheus引入了远端存储。
为了适配各种远端存储,Prometheus 抽象了一组数据读写接口,并通过适配器模式将Prometheus对远端存储的读写接口转化为第三方的数据存储接口,从而扩展了Prometheus存储大量历史数据的能力。
Prometheus存储总共定义了两组方法,分别用于数据写入和数据读取。
这里先介绍数据写入接口Appender,主要涉及Add、AddFast、Commit和Rollback这4种方法。

Add 方法和 AddFast 方法用于追加样本数据,请求参数主要是采样时间和样本值,如下所述。
◎ Add方法需要根据传入的标签通过 Hash算法找到(如果不存在则创建)序列ID,然后将样本值保存到序列中。
◎ AddFast方法则直接传入序列 ID,省去了前面进行序列查找或者序列 ID生成的步骤。
Commit 方法用于提交多个 Add 方法或将 AddFast 方法的结果持久化(例如保存到WAL中)。
Rollback方法用于回滚。
接下来讲解监控数据的查询接口Querier。Querier接口主要定义了Select方法,Select方法用于根据给定的标签查询对应的时序数据。具体代码如下:


为了兼容本地存储和远端存储,Prometheus提供了fanout接口,该接口同样实现了上面的Appender接口。当执行fanout中的方法(如Add)时,fanout接口会先执行本地存储(primary)的 Add 方法,然后遍历执行每个远端存储(secondaries)的Add方法。当需要获取Prometheus保存时间最长的监控数据时,也会分别调用本地存储和远端存储的startTime方法,获取各自的最长保存时间点,选择最大值作为整个存储的最长保存时间。
Prometheus连接存储的示意图如图3-1所示。

图3-1