3.4.0 存储汇聚

在配置远端存储后,Prometheus 的本地存储仍然有效,那么既然有本地存储,也有远端存储,如何查找监控数据呢?如何判断将一次读请求发送到本地存储还是远端存储呢?下面将详细介绍在 Prometheus 配置远端存储后,如何写入和查询监控数据。
之前讲到,Prometheus 为了监控本地存储和远端存储,设计了一个存储的汇聚接口 fanout。下面是 fanout 的代码实现:

Prometheus 通过 fanout 写数据时,首先会执行 primary(本地存储)写入,然后遍历写入每个远端存储。具体实现如下:

那么在查询时是不是分别遍历查询一遍呢?这样的设计固然可行,但会造成数据的重复查询,浪费性能且增加响应时间。在远端存储 read 接口里有一个 read_recent 参数,该参数用于就近读取数据,如果将其设置为 false,则表示 Prometheus 在对远端存储查询之前先用本地存储中最老数据的时间戳与查询最老数据的时间戳进行比较,若发现需要查询的数据在本地存储中,则会跳过对远端存储的查询;如果不全在本地存储中,则将远端存储查询的最大时间修改成本地存储的最大时间,避免重复查询。如图 3-9 所示,如果查询 15d 内的监控数据,Prometheus 就会直接从本地读取,如果超过 15d,则会将远端存储中 15d 外的数据和本地存储中 15d 内的数据合并后返回。

图 3-9