about blog github

17 Feb 2020
thanos学习(一)

thanos是什么

提到thanos,一般会介绍prometheus监控系统,它能够实时查询数百万个指标数据,并提供一套强大的查询语言,用户可以通过该语言从这些指标数据中提取有用的信息,但是大规模prometheus集群会存在一些问题,thanos就是为了解决这些问题而存在:

  • 由于采用prometheus联邦集群会存在单点故障问题,比如硬件错误、操作错误等
  • 多集群环境复杂,不移维护和配置
  • 大量的指标数据不易备份和查询,且数据存储受本地磁盘限制
  • 多prometheus集群下没有一个统一的入口查询数据和对数据去重

thanos是由一系列组件构成,通过thanos可以实现一个高可用的指标系统,并且拥有无限的数据存储能力,可以和现有的prometheus集群无缝集成,单实例prometheus依然高效,只有在对现有prometheus实例进行扩展时,才建议使用thanos,thanos让prometheus更易用,使用thanos能完成以下功能:

  • 提供全局视图查询所有指标数据:在prometheus多集群环境下,没有统一入口查询多集群下的所有指标数据,thanos可以一次查询多个prometheus集群的指标数据,并且自动将重复数据删除,因为这些指标数据都是可以从一个统一的入口(query)获取
  • 不受限制的历史数据存储能力:本地磁盘空间有限,不能存储大量的指标数据,通过thanos将数据存储在云段对象存储系统如aws/gcp,节约成本
  • prometheus的高可用:thanos确保了prometheus集群的高可用,和prometheus无缝集成、易部署且依赖少,避免prometheus联邦集群存在的单点故障问题

thanos架构和组件

  • thanos sidecar:prometheus代理服务器,与prometheus部署在一起,读取prometheus的指标数据供查询使用,可以通过标签和时间段来选择指标数据,监听prometheus数据目录变化,将新产生的数据上传到云端对象存储系统,提供grpc api供其他组件访问指标数据
  • store gateway:仅缓存必要的数据,将复杂的查询降级,实现查询的实时性,达到和查询本地ssd数据的效果
  • compactor:在对象存储中应用prometheus的数据压缩机制,应用压缩和降准采样来提升历史数据查询的响应能力
  • querier:无状态的组件,当querier收到请求时,会向sidecar和store发送请求,从prometheus获取指标数据,然后将这些数据整合在一起,执行现promQL查询,并提供数据浏览功能,对数据进行去重
  • store:实现了对象存储中的数据检索代理,类似thanos sidecar的指标数据源,querier可以通过store api直接从store获取存储在云端的指标数据
  • ruler:基于querier的执行规则作出告警,通过store api查询节点访问新计算出的指标数据,并将新的指标数据备份到云存储

一个二进制文件提供所有组件功能:

$ thanos sidecar
$ thanos query
$ thanos store
$ thanos compact

核心功能实现

1 高可用 (sidecar + query)

通过thanos sidecar与每个prometheus实例一起运行,可以运行多个prometheus实例,共同形成一个集群,借助query组件提供统一的指标数据查询入口,且确保服务的高可用。

2 全局视图(query)

query组件提供统一的指标数据查询入口,通过聚合所有集群的query,可以同时查询多个prometheus实例的指标数据,并且可以将重复的指标数据去重。

3 数据存储(sidecar + store)

thanos sidecar不断将指标数据备份到云存储,然后通过store组件查询存储的数据,store类似在集群中存在一个prometheus实例,但是该prometheus实例的指标数据都是来自sidecar上传的云存储。

thanos部署模式

1 将thanos sidecar添加到prometheus服务端

2 部署多个querier副本获取数据查询和浏览功能

3 创建云存储,配置sidecar将数据备份到云端对象存储系统

4 部署store gateway以便访问备份的指标数据

5 部署compacter,实现数据的压缩和降准采样以提升长期数据查询的响应能力

thanos安装

这里介绍以docker方式安装thanos,先安装2个prometheus集群,分别是eu1和us1,在us1中运行2个prometheus实例,prometheus配置如下:

  • eu1

prometheus实例0配置prometheus0_eu1.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: eu1
    replica: 0

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['127.0.0.1:9090']
  - job_name: 'sidecar'
    static_configs:
      - targets: ['127.0.0.1:19090']
  • us1

prometheus实例0配置prometheus0_us1.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: us1
    replica: 0

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['127.0.0.1:9091','127.0.0.1:9092']
  - job_name: 'sidecar'
    static_configs:
      - targets: ['127.0.0.1:19091','127.0.0.1:19092']

prometheus实例1配置prometheus1_us1.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: us1
    replica: 1

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['127.0.0.1:9091','127.0.0.1:9092']
  - job_name: 'sidecar'
    static_configs:
      - targets: ['127.0.0.1:19091','127.0.0.1:19092']

创建prometheus集群和thanos:

mkdir -p prometheus0_eu1_data prometheus0_us1_data prometheus1_us1_data

docker run -d --net=host --rm \
    -v $(pwd)/prometheus0_eu1.yml:/etc/prometheus/prometheus.yml \
    -v $(pwd)/prometheus0_eu1_data:/prometheus \
    -u root \
    --name prometheus-0-eu1 \
    quay.io/thanos/prometheus:v2.12.0-rc.0-rr-streaming \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path=/prometheus \
    --web.listen-address=:9090 \
    --web.enable-lifecycle \
    --web.enable-admin-api && echo "Prometheus EU1 started!"

docker run -d --net=host --rm \
    -v $(pwd)/prometheus0_us1.yml:/etc/prometheus/prometheus.yml \
    -v $(pwd)/prometheus0_us1_data:/prometheus \
    -u root \
    --name prometheus-0-us1 \
    quay.io/thanos/prometheus:v2.12.0-rc.0-rr-streaming \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path=/prometheus \
    --web.listen-address=:9091 \
    --web.enable-lifecycle \
    --web.enable-admin-api && echo "Prometheus 0 US1 started!"

docker run -d --net=host --rm \
    -v $(pwd)/prometheus1_us1.yml:/etc/prometheus/prometheus.yml \
    -v $(pwd)/prometheus1_us1_data:/prometheus \
    -u root \
    --name prometheus-1-us1 \
    quay.io/thanos/prometheus:v2.12.0-rc.0-rr-streaming \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path=/prometheus \
    --web.listen-address=:9092 \
    --web.enable-lifecycle \
    --web.enable-admin-api && echo "Prometheus 1 US1 started!"

docker run -d --net=host --rm \
    -v $(pwd)/prometheus0_eu1.yml:/etc/prometheus/prometheus.yml \
    --name prometheus-0-sidecar-eu1 \
    -u root \
    quay.io/thanos/thanos:v0.7.0 \
    sidecar \
    --http-address 0.0.0.0:19090 \
    --grpc-address 0.0.0.0:19190 \
    --reloader.config-file /etc/prometheus/prometheus.yml \
    --prometheus.url http://127.0.0.1:9090 && echo "Started sidecar for Prometheus 0 EU1"

docker run -d --net=host --rm \
    -v $(pwd)/prometheus0_us1.yml:/etc/prometheus/prometheus.yml \
    --name prometheus-0-sidecar-us1 \
    -u root \
    quay.io/thanos/thanos:v0.7.0 \
    sidecar \
    --http-address 0.0.0.0:19091 \
    --grpc-address 0.0.0.0:19191 \
    --reloader.config-file /etc/prometheus/prometheus.yml \
    --prometheus.url http://127.0.0.1:9091 && echo "Started sidecar for Prometheus 0 US1"

docker run -d --net=host --rm \
    -v $(pwd)/prometheus1_us1.yml:/etc/prometheus/prometheus.yml \
    --name prometheus-1-sidecar-us1 \
    -u root \
    quay.io/thanos/thanos:v0.7.0 \
    sidecar \
    --http-address 0.0.0.0:19092 \
    --grpc-address 0.0.0.0:19192 \
    --reloader.config-file /etc/prometheus/prometheus.yml \
    --prometheus.url http://127.0.0.1:9092 && echo "Started sidecar for Prometheus 1 US1"


docker run -d --net=host --rm \
    --name querier \
    quay.io/thanos/thanos:v0.7.0 \
    query \
    --http-address 0.0.0.0:29090 \
    --query.replica-label replica \
    --store 127.0.0.1:19190 \
    --store 127.0.0.1:19191 \
    --store 127.0.0.1:19192 && echo "Started Thanos Querier"

prometheus访问入口如下:

  • eu1: http://your-local-ip:9090/graph
  • us1-0: http://your-local-ip:9091/graph
  • us1-1: http://your-local-ip:9092/graph

thanos访问入口如下:

  • http://your-local-ip:29090/stores

ref:

  • http://dockone.io/article/6019
  • https://www.infoq.cn/article/y_3gWyQQuoeeEEWrf7K5
  • https://mp.weixin.qq.com/s/hOpjtz2A4hwJBww2TELdWA
  • https://mp.weixin.qq.com/s/RxIa1VN6Am0bI-Ca1OFs0Q


LEo at 00:12

about blog github