背景:
Prometheus 本身无法做集群方案,存在单点故障;但是Prometheus 官方给出以下几种方案
1、HA:部署两套Prometheus 同时采集相同的数据,前端通过LB进行负载均衡
2、HA+远程存储,通过Prometheus 存储插件把收集的数据通过Remote write 写入到远端存储中如influxdb,解决存储持久化
3、联邦集群: Federation,按照功能进行分区,不同的shared采集不同的数据,由Global节点统一存放
Thanos 架构
Thanos 有两种工作模式分别为Sidecar 模式与 Receiver 模式,当然最常用的是 sidecar,Thanos 组件如下:
query
1、封装prometheus Query Api,支持PromQL
2、暴露query服务,实现Store Api,可查询来自四类endpoint的数据:
包括:rule节点record数据,sidecar节点prometheus原生数据,store gateway代理的object storage数据,receiver收集到的数据。
3、无状态,可水平扩展(高可用)
sidecar
1、prometheus sidecar,实现Store API,提供grpc给query组件进行指标查询;
2、使用时与prometheus放在一个pod里,共享生命周期;
3、prometheus每两个小时把数据存到硬盘一次,此时sidecar shipper同时把数据上传到对象存储;
4、此方案,如果prometheus节点down,会丢失最近两个小时的数据;
receiver
1、在prometheus remote-write基础上实现;
2、prometheus服务会把数据实时写到receiver;
3、receiver可分布式部署,实现一致性hash,(疑问:多个prometheus同时pull数据并上传到receiver,配置了external_labels,receiver是否能够实现一致性hash进行去重;)
4、此方案,一个prometheus down掉以后,仍然保证数据完整,目前thanos还没有推出比较稳定的版本。
5、receiver也会把数据写入object storage。(疑问:什么时候,什么频率)
6、远程写的同时,prometheus本地磁盘依然会写入数据。
store gateway
1、query查询object storage数据的唯一入口;
2、实现Query Api;
3、缓存对象存储索引,优化查询。
Compactor
1、单例
2、object storage数据压缩
3、object storage数据降采样,个人理解就是把数据重新整理,生成采样间隔更长的数据block,并上传至对象存储,可优化查询。
4、官方推荐100G磁盘空间用作临时数据处理空间
5、上传deletion-mark.json来标记删除对象存储里的block,三个重要参数–retention.resolution-raw,–retention.resolution-5m,–retention.resolution-1h
rule
1、类似于prometheus的rule,可根据配置文件提前生成用户配置的metric,已经对altermanagement发去告警信息;
2、rule聚合生成的数据也会上传至object storage;
3、rule的数据源是通过thanos query至prometheus查询到的,可见于thanos query互相查询。
组件与配置
Prometheus
thanos 是无侵入的,只是上层套件,因此你还是需要部署你的 Prometheus,这里不再赘述,默认你已经有一个单机的 Prometheus 在运行,可以是 pod 也可以是主机部署,取决于你的运行环境,我们是在 k8s 集群外,因此是主机部署。Prometheus 采集的是地域A的监控数据
1、启动参数:
exec ./prometheus --config.file=/apps/conf/prometheus/prometheus.yml --storage.tsdb.path=/apps/dbdat/prometheus --storage.tsdb.max-block-duration=2h --storage.tsdb.min-block-duration=2h --storage.tsdb.wal-compression --storage.tsdb.retention.time=12h --web.enable-lifecycle &
--web.enable-lifecycle一定要开,用于热加载时 reload 你的配置,retention 保留 2 小时,Prometheus 默认 2 小时会生成一个 block,Thanos 会把这个 block 上传到对象存储
2、prometheus配置文件
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
external_labels:
region: 'IDC01'
replica: 0
必须要声明external_labels,标注地域,如果你是多副本运行,需要声明你的副本标识,如 0号,1,2 三个副本采集一模一样的数据,另外2个 Prometheus 就可以同时运行,只是 replica 值不同而已
部署sidecar 组件
1、Sidecar 组件与 Prometheus server 部署于同一个 pod 中。他有两个作用:
它使用 Prometheus 的 Remote Read API,实现了 Thanos 的 Store API。这使后面要介绍的Query 组件可以将 Prometheus 服务器视为时间序列数据的另一个来源,而无需直接与 Prometheus API交互(这就是 Sidecar 的拦截作用)
可选配置:在 Prometheus 每2小时生成一次 TSDB 块时,Sidecar 将 TSDB 块上载到对象存储桶中。这使得 Prometheus 服务器可以以较低的保留时间运行,同时使历史数据持久且可通过对象存储查询。
当然,这不意味着 Prometheus 可以是完全无状态的,因为如果它崩溃并重新启动,您将丢失2个小时的指标,不过如果你的 Prometheus 也是多副本,可以减少这 2h 数据的风险
2、启动参数:
exec bin/thanos sidecar --tsdb.path "/apps/dbdat/prometheus" --prometheus.url "http://localhost:9090" --http-address 0.0.0.0:19191 --grpc-address 0.0.0.0:19091 --objstore.config-file etc/config.yaml --shipper.upload-compacted &
3、配置对象存储
cat etc/conf.yaml
type: S3
config:
bucket: thanos
endpoint: 10.65.6.1:19000
access_key: thanos
insecure: true
signature_version2: false
secret_key: thanos2021
put_user_metadata: {}
http_config:
idle_conn_timeout: 1m30s
response_header_timeout: 2m
insecure_skip_verify: false
tls_handshake_timeout: 10s
expect_continue_timeout: 1s
max_idle_conns: 100
max_idle_conns_per_host: 100
max_conns_per_host: 0
压缩:官方文档有提到,使用sidecar时,需要将 prometheus 的–storage.tsdb.min-block-duration 和 --storage.tsdb.max-block-duration,这两个值设置为2h,两个参数相等才能保证prometheus关闭了本地压缩,其实这两个参数在 prometheus -help 中并没有体现,prometheus 作者也说明这只是为了开发测试才用的参数,不建议用户修改。而 thanos 要求关闭压缩是因为 prometheus 默认会以2,25,25*5的周期进行压缩,如果不关闭,可能会导致 thanos 刚要上传一个 block,这个 block 却被压缩中,导致上传失败。
不过你也不必担心,因为在 sidecar 启动时,会坚持这两个参数,如果不合适,sidecar会启动失败
部署store gateway 组件
在sidecar 配置中,如果你配置了对象存储 objstore.config-file,你的数据就会定时上传到 bucket 中,本地只留 2 小时,那么要想查询 2 小时前的数据怎么办呢?数据不被 Prometheus 控制了,应该如何从 bucket 中拿回来,并提供一模一样的查询呢?
1、Store gateway 组件:store gateway 主要与对象存储交互,从对象存储获取已经持久化的数据。与sidecar一样,store gateway也实现了 store api,query 组可以从 store gateway 查询历史数据
2、启动命令
exec bin/thanos store --data-dir /apps/dbdat/thanos/store --objstore.config-file etc/config.yaml --http-address 0.0.0.0:39191 --grpc-address 0.0.0.0:39090 --index-cache-size=250MB --sync-block-duration=5m --min-time=-2w --max-time=-1h &
Store gateway需要从网络上拉取大量历史数据加载到内存,因此会大量消耗 cpu 和内存
部署query组件
1、Query 组件(也称为“查询”)实现了 Prometheus 的 HTTP v1 API,可以像 Prometheus 的 graph一样,通过 PromQL 查询 Thanos 集群中的数据。
简而言之,sidecar 暴露了 StoreAPI,Query 从多个 StoreAPI 中收集数据,查询并返回结果。Query 是完全无状态的,可以水平扩展
2、启动命令
exec bin/thanos query --http-address "0.0.0.0:29090" --grpc-address "0.0.0.0:29091" --query.replica-label "IDC01" --store "10.65.4.2:19091" --store "10.65.6.9:19091" --store "10.65.6.9:39090" --store "127.0.0.1:39090" &
部署Compact
启动命令
exec bin/thanos compact --data-dir /apps/dbdat/thanos/compact --http-address 0.0.0.0:19192 --objstore.config-file etc/config.yaml &
Thanos UI
访问THanosUI 验证查询数据 http://10.65.4.2:29090