prometheus和thanos原理

162人浏览 / 0人评论

thanos是prometheus的高可用解决方案之一,thanos与prometheus无缝集成,并提高了一些高级特性,满足了长期存储 + 无限拓展 + 全局视图 + 无侵入性的需求

 

一、prometheus本地存储

Prometheus 的本地存储被称为 Prometheus TSDB。TSDB 的设计有两个核心:block 和 WAL,而 block 又包含 chunk、index、meta.json、tombstones。

Prometheus保存块数据的目录结构如下所示:

./data 
   |- 01BKGV7JBM69T2G1BGBGM6KB12 # 块
      |- meta.json  # 元数据
      |- wal        # 写入日志
        |- 000002
        |- 000001
   |- 01BKGTZQ1SYQJTR4PB43C8PD98  # 块
      |- meta.json  #元数据
      |- index   # 索引文件
      |- chunks  # 样本数据
        |- 000001
      |- tombstones # 逻辑数据
   |- 01BKGTZQ1HHWHV8FBJXW1Y3W0K
      |- meta.json
      |- wal
        |-000001

prometheus关键参数

 

启动参数 默认值 含义
--storage.tsdb.path /data 数据存储路径
--storage.tsdb.retention.time 15d 样本数据在存储中保存的时间。超过该时间限制的数据就会被删除。
--storage.tsdb.retention.size 0 每个块的最大字节数(不包括 wal 文件)。如果超过限制,最早的样本数据会被优先删除。支持的单位有 KB, MB, GB, PB,例如:“512MB”。该参数只是试验性的,可能会在未来的版本中被移除。
--storage.tsdb.retention   该参数从 2.7 版本开始已经被弃用,使用 --storage.tsdb.retention.time 参数替代

主要关注 storage.tsdb.retention.time ,这个值决定了prometheus在本地的存储时间。

 

二、远端存储thanos

一般我们会采用prometheus本地存储存个1-2周,其他的都用thanos远程存储到oss上,这样可以减轻服务器的磁盘容量问题。

 

下面我们来讲下thanos的一些原理:

Thanos Sidecar:连接 Prometheus,将其数据提供给 Thanos Query 查询,并且/或者将其上传到对象存储,以供长期存储

Thanos Query:实现了 Prometheus API,提供全局查询视图,将来StoreAPI提供的数据进行聚合最终返回给查询数据的client(如grafana)

Thanos Store Gateway:将对象存储的数据暴露给 Thanos Query 去查询。

Thanos Ruler:对监控数据进行评估和告警,还可以计算出新的监控数据,将这些新数据提供给 Thanos Query 查询并且/或者上传到对象存储,以供长期存储。

Thanos Compact:将对象存储中的数据进行压缩和降低采样率,加速大时间区间监控数据查询的速度

Thanos Receiver:从 Prometheus 的远程写入 WAL 接收数据,将其公开和/或上传到云存储。

 

重点:

存储:thanos会监控proemtheus的数据目录,只有有数据落地,thanos就会按照参数store --sync-block-duration=5m,也就是每5分钟去检查下prometheus的磁盘信息,检查到有新增后,就会将数据传到oss上。 (proemtheus的磁盘落地 --storage.tsdb.min-block-duration=2h 好像是通过这个参数控制的,我懒的查了。反正肯定有。意思就是采集到的数据全放入到内存中,2个小时落地一次)。

查询:那问题来了,当用户向thanos查询数据时,是从oss读呢 还是从proemtheus本地读呢?

答:如果prometheus本地数据还在,thanos会从本地读,如果prometheus本地没有数据,则会从oss上读。

 

最近遇到了一个问题,就是prometheus本地有数据,但是thanos从oss上读。

错误:rpc error: code = Aborted desc = fetch series for block 01HN292XEAJW454C0EM1HX64DY: preload chunks: read range for 0: allocate chunk bytes: pool exhausted" msg="returning partial response"

https://github.com/thanos-io/thanos/issues/3720

全部评论