Prometheus是目前最流行的监控软件,它配置灵活,性能强悍,查询功能强大且简单,尤其在容器监控领域,可以说是最佳选择。但它也有几个缺点:没有高可用,不支持横向扩缩容,历史数据归档保留等。
为了解决上述问题,目前主要有两个方案Thanos和Cortex. 两个软件功能都很强大,但Cortex是基于remote write来实现的,需要修改现在的prometheus存储方式,而且相对于Thanos,Cortex的架构更复杂,依赖的组件也比较多。所以对于中小公司来说,首选的方案是Thanos。


Cortex的架构图
Thanos,让你的Prometheus变成完美的监控利器。_第1张图片


Thanos完整的架构图如下
Thanos,让你的Prometheus变成完美的监控利器。_第2张图片

下面来介绍一些Thanos。
Thanos分为7个部分,每个部分都是由运行其子命令来实现的。
1、Compactor
对对象存储里的数据进行压缩,降准采样,设置保留策略等。
为了数据安全,一个bucket只能有一个进程处理。运行命令后,默认会为bucket里的数据创建5分钟间隔的采样和1小时间隔的采样。这对于长时间跨度的范围查询来说,非常有利,建议开启。另外采样并不会减少磁盘空间的占有,相反采样会增加大约3倍的磁盘空间消耗。因为采样是保留原始数据基础上增加了block来存储采样数据。如果你数据保留时间比较短,或者历史数据查询比较少,可以通过参数 --downsampling.disable 来禁用采样功能。另外block里的数据超过设置的保留时间后并不会直接删除,而是通过上传deletion-mark.json来标记为删除状态,默认48小时后才会真正删除。

设置bucket里的数据保留90天
thanos compact  --objstore.config-file=/data/thanos-bucket.yaml --retention.resolution-raw=90d  --data-dir="/tmp/data"  --http-address="0.0.0.0:10912"  

2、Sidecar
和prometheus上部署在同一主机上或者同一个pod中。为prometheus提供StoreAPI查询接口,供Query使用。另外将prometheus的metrics数据上传到对象存储中(可选)。
prometheus需要开启--web.enable-admin-api--web.enable-lifecycle.
thanos是通过external_labels来识别不同的prometheus实例的数据的,并依此来对数据去重。所以每个prometheus应至少包含两个label,一个用来标识是否为同一组,一个用来识别不同的实例。如:

  external_labels:
    cluster: idc-bj
    replica: instance1

如果想上传prometheus本地的metrics数据,prometheus必须添加两个参数

--storage.tsdb.min-block-duration=2h 
--storage.tsdb.max-block-duration=2h

保证每个block里有相同时间跨度的数据。除此之外还需要禁用prometheus的压缩功能(默认未开启)。
对于本地的历史数据,可通过--shipper.upload-compacted 参数来一次性的上传到对象存储中。

thanos sidecar --prometheus.url=http://localhost:9090  --reloader.config-file=/usr/local/prometheus/prometheus.yml --objstore.config-file=/data/thanos-bucket.yaml --tsdb.path=/data/prometheus/data  

如果你是用helm里的stable/prometheus-operator部署的,prometheus-operator是集成过thanos的,只需要在prometheusSpec里增加相关配置,例如:

prometheus:
  prometheusSpec:
    enableAdminAPI: true
    externalLabels:
      cluster: prod-k8s
      replica: "instance1"
    thanos:
      image: thanosio/thanos:v0.14.0
      version: v0.14.0
      objectStorageConfig:
        key: thanos.yaml
        name: thanos-objstore-config

这里的对象存储后端支持s3,阿里云的oss,OpenStack的Swift等等。具体列表可以参考官方文档。 如果你没有使用公有云,服务都在自己机房,最简单的是利用minio 来实现s3存储。thanos就是利用minio的client来与s3交互的。
3、Receiver
实现prometheus远程写的api,接收prometheus传来的数据。同时也提供StoreAPI供query实时查询数据。
4、Rule
评估metrics数据。一般建议直接使用prometheus自己的rule,因为数据都在本地,基本不会有异常。而rule会远程读取,出错概率会高一些。如果有一些数据分布在多台prometheus上,需要汇总评估,那么就需要使用rule了。
5、Store
store的网关。为对象存储(如s3)里的数据提供StoreAPI的访问方式。供query查询历史数据。query会先从sidecar里查询入库,如果sidecar里查不到,才会从store里查询。可以设置将索引数据和数据缓存到内粗或者memcached里来提高查询性能。
6、Query
聚合StoreAPI,提供统一查询接口。用于查询或者grafana使用。store地址可以使用参数指定,也可以使用文件自动发现
7、Tools
主要是一些针对bucket的检查维护的工具集。