第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