在撰写本文时,该组件仍处于试验阶段。然而,正如本章远程写入和读取部分所承诺的,这个组件是远程写入的一个很好的例子,所以我们决定向你展示它可以做什么。它充当 Prometheus 远程写入请求的目标,并将接收到的样本存储在本地。接收器还实现了一个 StoreAPI 端点,因此它能够充当存储节点。最后,它还可以像 sidecar 一样将块发送到对象存储。
为了更好地理解所有这些意味着什么,让我们探索两个场景。
默认情况下,Prometheus 服务器将每两个小时生成一个块。即使使用带有块传送的 Thanos sidecar,Thanos 查询器也无法获取仍在 WAL 中的数据,而 sidecar 必须通过 Prometheus 服务器的远程读取 API 请求它。当你达到 Grafana 或其他 API 客户端对 Prometheus 产生巨大请求率的规模时,它很可能会影响 Prometheus 的性能并最终影响警报,即使 Prometheus 有一些保护机制,正如我们所见之前。通过使用 Thanos 接收器,您可以简单地将客户端查询移至它,确保 Prometheus 服务器的主要工作是抓取和评估规则。简而言之,您将有效地将 Prometheus 服务器的读取与写入分开。您可以继续使用 Thanos sidecar 来发送块,使用 Thanos 接收器来回答所有 Thanos 查询器的查询,就像一个新的缓存一样,在此过程中保护 Prometheus 写入路径。
Thanos receiver generates blocks every two hours and, unlike Prometheus, this value is hardcoded by design.
想象另一种情况,其中有多个租户/团队使用您管理的基础架构。如果他们在技术上足够精通,他们最终会想要管理自己的 Prometheus 服务器。您可以尝试提供管理其服务器所需的所有自动化,但您很快就会遇到瓶颈。一种选择是给他们一个 Prometheus 服务器来管理、一个 Thanos 接收器端点和一个 Thanos 存储端点。 Thanos 接收器将负责将块运送到对象存储,而 Thanos 存储将提供一种访问它们的方法,从而完全从租户中抽象出远程存储的复杂性。这只是为您的基础架构提供长期存储即服务的第一步。
在我们的测试环境中,在 thanos 实例中,我们运行了一个 Thanos 接收器。在下面的代码片段中,我们可以看到它的配置:
由于我们已经在 Prometheus 服务器旁边运行了一个 Thanos sidecar,它将 TSDB 块发送到对象存储,我们通过不添加 --objstore.config-file 标志来禁用接收器的传送功能.注意 --labels 标志,它允许我们指定一个标签以添加到此接收器的 StoreAPI 公开的所有时间序列中;这实际上是一种配置外部标签的方法。另一个值得注意的标志是--remote-write.address,用于提供远程写入端点。如果我们查看 prometheus 实例,我们将看到以下配置,它利用了上述标志:
为了测试所有这些,我们可以简单地在 prometheus 实例中停止 Thanos sidecar,如下所示:
完成此操作后,Thanos 查询器将不再能够访问 Thanos sidecar,并且最近的块信息将不会刷新到磁盘。这样,我们可以验证接收方是否会提供这些数据。如果我们转到 http://192.168.42.12:10902/graph 的 Thanos 查询器 Web 界面,然后运行一个即时查询,例如 up{instance=~"prometheus.+"},我们会看到以下输出:
Figure 14.5: Thanos receiver showing metrics, even with the Thanos sidecar down
注意 store 标签,表明 Thanos 接收器正在提供数据,同时还通知我们 Thanos sidecar 当前已关闭。这证明我们可以通过 Prometheus 远程写入 API 查询最近的数据。
使用这个组件的决定不应该掉以轻心,因为它有一些缺点:除了它被明确标记为实验性之外,它实际上是一个基于推送的系统,如 Graphite。这意味着基于推送的方法的所有缺点都适用,即难以管理滥用/流氓客户端。