thanos 是围绕 prometheus 构建的分布式监控增强层,由 sidecar、store gateway、query、compactor 等协同组件构成,依赖对象存储实现高可用、长期存储与全局查询;各组件分工明确,缺一不可。

Thanos 集群不是“安装一个软件”就能跑起来的,而是由多个协同组件构成的分布式监控增强层。它不替代 Prometheus,而是围绕它构建高可用、长期存储和全局查询能力。核心目标是:让多副本 Prometheus 的数据可查、可存、可聚合,尤其解决历史指标(比如 30 天前)的快速回溯问题。
关键组件各司其职,缺一不可
Thanos 架构不是单体,每个组件有明确分工:
- Sidecar:紧贴每个 Prometheus 实例部署(同 Pod 或同主机),实时暴露本地指标 API,并按固定周期(默认 2 小时块)把已落盘的 TSDB Block 上传到对象存储(如 MinIO、S3)
- Store Gateway:对接对象存储,把里面的历史 Block 当成“只读数据库”,对外提供 Prometheus 兼容的 StoreAPI,供 Query 组件远程读取
- Query:唯一对外提供查询入口(/api/v1/query 等),它同时向所有 Sidecar(查最新数据)和所有 Store Gateway(查历史数据)发起请求,自动合并结果,用户无感知数据来源
- Compactor:后台守护进程,定期扫描对象存储中的 Block,做三件事:合并碎片 Block、生成 5m/1h 降采样数据、按 retention 策略清理过期数据
对象存储是 Thanos 的基石,必须先配好
没有对象存储,Thanos 就失去长期保存和跨实例共享数据的能力。MinIO 是最常用的本地替代方案(兼容 S3 API):
- 启动 MinIO 服务,创建一个 bucket(例如 thanos-data)
- 准备一个 YAML 配置文件(如 objstore.yaml),内容为:
type: S3 config: bucket: "thanos-data" endpoint: "minio:9000" insecure: true signature_version2: false access_key: "minioadmin" secret_key: "minioadmin"
- 所有用到对象存储的组件(Sidecar、Store Gateway、Compactor)都需通过 --objstore.config-file 指向该文件
Sidecar 与 Prometheus 必须共生命周期部署
Sidecar 不是独立服务,它依赖 Prometheus 的本地数据路径和 HTTP 接口:
- Prometheus 启动时必须加参数:--web.enable-lifecycle --web.enable-admin-api(否则 Sidecar 无法触发 reload 或获取元信息)
- Sidecar 启动命令示例(Docker):
docker run -d \ --name thanos-sidecar-c1 \ -v /prometheus/data:/data \ -v $(pwd)/objstore.yaml:/thanos/objstore.yaml \ --network host \ quay.io/thanos/thanos:v0.34.0 \ sidecar \ --tsdb.path=/data \ --objstore.config-file=/thanos/objstore.yaml \ --prometheus.url=http://localhost:9090
- 确保 --tsdb.path 与 Prometheus 的 --storage.tsdb.path 完全一致,且挂载卷权限正确(Sidecar 需读取 Block 目录)
Query 统一入口 + Store Gateway 历史数据源
Query 是你最终访问的地址(比如 http://localhost:9090),但它本身不存数据,只做路由和聚合:
- 启动 Store Gateway(指向同一对象存储):
docker run -d \ --name thanos-store \ -v $(pwd)/objstore.yaml:/thanos/objstore.yaml \ --network host \ quay.io/thanos/thanos:v0.34.0 \ store \ --objstore.config-file=/thanos/objstore.yaml
- 启动 Query,并通过 --store 参数连接所有数据源:
docker run -d \ --name thanos-query \ --network host \ quay.io/thanos/thanos:v0.34.0 \ query \ --http-address=0.0.0.0:9090 \ --store=dnssrv+_grpc._tcp.thanos-sidecar-01.default.svc.cluster.local \ --store=dnssrv+_grpc._tcp.thanos-store.default.svc.cluster.local
(K8s 环境推荐用 DNS SRV;测试环境可直接用 IP+端口,如 --store=127.0.0.1:19090) - 验证:打开 Query UI,执行 count({job="prometheus"}),应能同时看到最近 2 小时(来自 Sidecar)和 7 天前(来自 Store Gateway)的数据点
别忘了 Compactor:让历史查询又快又省
刚上传的原始 Block 很零碎,直接查慢、占空间。Compactor 是优化历史数据的关键:
- 单独运行一个 Compactor 实例,同样配置对象存储:
docker run -d \ --name thanos-compact \ -v $(pwd)/objstore.yaml:/thanos/objstore.yaml \ --network host \ quay.io/thanos/thanos:v0.34.0 \ compact \ --objstore.config-file=/thanos/objstore.yaml \ --wait
- 它会每天自动运行一次(可配 --consistency-delay 控制延迟),生成降采样数据并合并 Block
- 开启后,查 30 天前的 rate(http_requests_total[1h]) 会明显变快,因为 Query 会优先使用 1h 降采样数据











