3.1.0 存储接口

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