1. 从云原生开始,Prometheus已经被证明是kubernetes 系统中监控和报警的首选方案。尽管Prometheus 官方有高可用的方案(联邦),但是联邦模式在数据保留、历史数据检索和多租户方面有其自身的局限性。所以催生了ThanoscortexVictoriaMetrics等多种高可用方式。<br />这里我们将探索Thanos prometheus 的两种集成方案。

Thanos

Thanos 支持两种方式与prometheus集成:

  1. - sidecar
  2. - receiver

除此之外,还包含以下几种组件:

  1. - querier 查询
  2. - store 从对象存储数据读取
  3. - compactor 压缩对象存储中的数据
  4. - ruler 报警规则

sidecar 和 receiver 都是Thanos 系统中的不同组件,并且有自己的运作方式。但最终,他们的目的都是一样的(将数据上传到对象存储中)。
接下来让我们简要了解下sidecar 和 receiver 的工作原理。

Thanos Sidecar 如何工作的

在Sidecar 方式中,他将运行在每一个Prometheus 的服务器中。它负责将Prometheus 的数据上传到对象存储中(从Prometheus TSDB)。
image.png
如上图所示,为了实现高可用性,部署了两组Prometheus ,同时每个Prometheus 服务器上部署了sidecar组件。
数据查询路径为上图红色箭头路径。主要是查询对象存储和Sidecar,而store 的作用主要是读取对象存储的数据,并提供缓存能力。
问题:数据都存储到对象存储了,为什么还需要从sidecar 查询数据呢?

  1. - Sidecar 是没隔两个小时将Prometheus TSDB数据块上传一次到对象存储中。所以,查询两个小时内的数据将会从sidecar 处查询。同时如果Prometheus 服务器故障,丢失数据最多也是两个小时的数据。

Thanos receiver 如何工作的

与sidecar 不同,Receiver 被配置为一个单独的组件。在这种方法中,thanos 系统中的其它组件的运行模式都和Sidecar 的相同,仅仅是Receiver 替换了 Sidecar 组件,从而导致了数据的查询和存储发生了变化。
image.png
同样实现了高可用。但是此处的高可用使用的是Prometheus 的Remote write API,它将Prometheus 的数据远程发送到 Receiver,Receiver 负责将数据上传到对象存储。
数据查询同样为红色箭头。Receiver 的作用是接收Prometheus 的远程写请求,并将数据存储在本地的TSDB中, 也可以选择定期将这些TSDB 块上传到对象存储。所以数据查询除了从对象存储中查询,还需要从Receiver 本地的TSDB 块中查询。

比较Sidecar 和 Receiver

高可用性

  • Sidecar

通过sidecar 与Prometheus 实例的每个副本集成来获的高可用性。每个Prometheus-sidecar 单独抓取、存储指标。由于Prometheus 每两个小时写一个TSDB 块,故其中一个副本故障,通常此Prometheus 的监控图表会显示两小时空白,但是由于是两个副本,所以这个空白会被另一个Prometheus 的数据填充。 Thanos Querier 会负责将重复的数据删除。

  • Receiver

与Sidecar 类似,部署多个Prometheus 实例来抓取相同的指标,并配置远程写为Receiver 。在这个架构中,不仅Prometheus 的稳定性,Receiver 的稳定性也起着至关重要的作用。单个Prometheus 故障,由另一个Prometheus 的数据填充。

与Prometheus 集成

  • Sidecar

只需要在Prometheus 服务器上部署一个sidecar 即可。禁用Prometheus 的压缩数据,近乎无影响。

  • Receiver

需要更改Prometheus 的配置,配置远程写,将数据远程写入Receiver。Receiver 同时要高可用,比较负责。

存储

  • Sidecar

Sidecar 从本地存储读取,因此TSDB 不需要额外的本地存储。此外,它大大减少了TSDB 在Prometheus 本地存储中保留的时间,因为它每两小时上传一次数据。
默认Prometheus 会存储15 天的数据。而Sidecar 每两小时上传一次,使得Prometheus 近乎于无状态。Thanos 官方建议,Prometheus 数据保留时间不少6小时。

  • Receiver

Receiver 会将数据存储在本地磁盘,但是Prometheus 通过远程写时刻将数据发送给Receiver, 所以Prometheus 本地不需本地数据盘。而Receiver 需要根据TSDB 保留率来配置本地磁盘大小。

数据采集

  • SIdecar

这里TSDB 块是从Prometheus 实例的本地存储中读取,要么用于数据查询,要么转存到对象存储中。Sidecar 是拉取模型(即querier 从sidecar 拉取数据)

  • Receiver

receiver 是基于推送模型工作, TSDB 由Prometheus 实例本身远程写入,从而使Prometheus 接近无状态,不会保留任何数据在本地。

结论

选择一种方法要基于现有环境去判断。
如果是在整个内网中部署监控,即使用Sidecar即可。 如果Prometheus 机器无法访问,则使用Receiver 即可。
如果querier 可以直接访问呢 Prometheus, 建议优先使用sidecar。