Prometheus Thanos Design 介绍

Thanos Logo

本文主要内容翻译自 Thanos Design文档

Thanos 以 Prometheus sidecar 的方式运行, 为 Prometheus 提供了全局查询,备份,以及历史数据访问的功能。Thanos 的集群组件有以下3个功能:

一 指标源

Thanos提供了两个组件作为数据来源: Prometheus sidecar 和 rule nodes. 其中 sidecar 部分实现了一个gRPC 服务,是基于 Prometheus 的 HTTP 和 remote-read APIs 的; 而 rule node 部分 直接运行在 Prometheus 存储引擎上。

说说 Prometheus 2.0存储引擎的备份部分: prometheus 拉回来的 metrics 数据以 block 形式存储在本地磁盘, 而一个 block 其实就是一个目录,目录中有3个组成:

  • chunks , 这部分比较大,就是真正的时序 Metrics 存储
  • index, 可以通过 labels 来查询时序 series 数据,靠的就是这个 index文件
  • meta.json , 这个文件存储了本block的 stats, time range, 和 compaction level 这样的信息. 下面有示例

那么 Thanos 是如何进行备份的呢?上面的 meta.json 就是关键, thanos 扩展了这个 json 文件,加入了 Thanos所特有的 metadata 信息。而后上传到块存储上。

二 存储

对于那些存储在远端对象存储的 block 数据, Store Node 充当了网关的功能。实现了跟指标源相同的 gRPC API 接口,来访问对象存储中的指标数据。它会持续不断的更新 bucket 中的 block , 并将对 metrics 的请求翻译为对象存储的请求。为了降低对远端对象存储的访问数量,它采取了一些手段:例如, 通过 metadata (时间区间,lables 之类的) 过滤 block;又或者对于频繁查询的 index,直接cache起来。

Prometheus 2.0 存储层已经对读放大进行了优化。例如,按照时间和指标名字,连续的尽量放在一起。而 store node是感知到存储文件的结构的,因此可以很好的将指标存储的请求翻译为最少的 object storage 请求。对于那种大查询,一次可以拿成百上千个 chunks 数据。

只有 index 数据是放入 cache的,chunk 数据虽然也可以,但是就要大几个数量级了。目前,从对象存储获取 chunk 数据只有很小的延时,因此也没什么动力去将 chunk 数据给 cache起来,毕竟这个对资源的需求很大。

Stores & Data Sources 其实是一回事

因为 data node 和 data source 提供了相同的 gRPC Store API 接口,因此对于 Client 而言可以把他们当成一个东西来对待。 加之,每一种 Store API的实现都对外声明了自己所能提供数据的 meta data,因此 Client 对特定的数据请求,就可以最小化到仅请求必要的 node。

本质上来说, Store API就是通过一组标签匹配器(从PromQL中获得的)和时间范围来查找数据。 它返回在块数据中找到的压缩样本块。 它纯粹是一种数据检索API,不提供复杂的查询执行。

三 查询层 (Query Layer)

查询器是无状态且可以水平可伸缩的实例,它们在Store API 暴露出的接口之上实现了PromQL 这种查询语言。

Compactor 压缩器
压缩器是一个单例进程, 它会将对象存储 Bucket 中的多个小 Block 合并成 大 Block ,它会大大降低对象存储的空间占用,从 Bucket 中获取数据的请求
也会变少。

将来, Compactor 还会承担指标降精度, Retention 等批量任务。

扩展性
Thanos 的所有组件都不包含 Sharding 功能, 真正具有扩展性的组件其实是 Query Node,它是无状态的,可以随意扩展;扩展存储能力依赖外部的对象存储系统。

Store, rule 和 Compactor预期中是运行在一个实例中,或者是HA。就跟 Prometheus 一样, 功能性的 Sharding 其实并不常见。

例如, 规则集( rule sets)可以被分割到多个 规则节点(rule node)上, Store 则可以通过让不同数据中心使用不同 Bucket 。

另外

Prometheus 新版 tsdb 的作者 Fabian Reinartz 设计了 2.0 格式存储 的 tsdb,相较于老版,极大的提升了存储的性能。相信各位从 Prometheus 1.X 版本升级过来的同学一定会对这次升级印象极深(如果你看过磁盘io的数据的话)。这里有篇 slide 介绍: 。同时 Fabian Reinartz 也是 Thanos 的最主要贡献者