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查询节点访问新计算出的指标数据,并将新的指标数据备份到云存储
一个二进制文件提供所有组件功能:
代码语言:javascript复制$ 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
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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:
代码语言:javascript复制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