Thanos 大规模 Prometheus 高可用与长期存储实战
单套 Prometheus 适合本地自治监控,但保留周期、磁盘、跨集群查询和高可用会随规模增长变得复杂。Thanos 通过统一 Store API、对象存储、查询去重、Compaction 和 Downsampling 扩展 Prometheus。生产建设必须理解 Sidecar/Receive 两种写入路径、对象存储一致性、Compactor 单例、查询扇出与多租户边界。
Thanos 不会自动修复错误指标设计。高基数、无界 Label、低质量告警和错误保留策略会被放大到更大系统中。先治理指标,再扩展存储。
一、组件架构
Prometheus + Sidecar ─┐
Receive ├─ Object Storage
↓
Store Gateway ── Query / Query Frontend ── Grafana
Compactor ──────┘
Ruler ───────── Query/Store API
- Sidecar:暴露 Prometheus 数据并上传完成块;
- Receive:接收 Remote Write 并写入 TSDB/对象存储;
- Store Gateway:查询对象存储历史块;
- Query:聚合 Store API 并去重;
- Query Frontend:缓存、拆分和队列;
- Compactor:压缩、降采样和保留;
- Ruler:基于全局数据计算规则。
二、Sidecar 与 Receive 选择
Sidecar 保留每集群 Prometheus 的自治和本地告警,架构直观;Receive 便于中心化 Remote Write、多租户和写入扩展。
选择依据:
- 边缘集群网络稳定性;
- 是否需要本地查询和告警;
- 租户隔离;
- 写入带宽和队列;
- 故障时本地保留;
- 运维复杂度。
两种模式可组合,但需防止同一序列重复采集。
三、外部标签与去重
高可用 Prometheus 副本采集同一目标,需要唯一副本标签和一致集群标签。
global:
external_labels:
cluster: prod-a
replica: prometheus-0
Query 使用 Replica Label 去重。若外部标签缺失或冲突,会重复显示或错误合并。Cluster/Tenant 标签必须全局治理。
四、对象存储
Thanos 使用对象存储保存指标块和元数据。生产要求:
- 写后读一致性满足组件要求;
- 版本控制与删除保护;
- TLS、最小权限和 KMS;
- 容量、请求费和生命周期;
- 跨地域延迟与带宽;
- 独立 Bucket/Prefix 规划;
- 备份配置与访问密钥。
不要让多个不相关环境共享无隔离的同一 Bucket。
五、Sidecar 上传
Prometheus 必须启用本地 TSDB 块,Sidecar 上传完成块。WAL 中的最新数据由 Sidecar Store API 提供,历史块由对象存储查询。
监控上传失败、最后成功时间、本地磁盘和对象存储错误。网络中断时本地保留必须覆盖最长中断,否则尚未上传的块可能丢失。
六、Receive 与 Hashring
Receive 可按租户和序列 Hash 分发,并以副本方式写入多个 Receiver。
需要规划:
- Hashring 更新;
- 写副本数和 Quorum;
- 端点变化时的序列重分布;
- Remote Write 队列;
- 租户 Header 信任;
- WAL/磁盘;
- 过载与限流。
Hashring 配置错误可能导致写入环路、重复或无可用节点。
七、Store Gateway
Store Gateway 读取对象存储块,缓存索引和元数据。规模增大后需按时间或 Label 分片,避免每个实例加载全部 Bucket 元数据。
监控 Bucket 同步、块加载、缓存命中、对象存储请求、内存和查询延迟。重启风暴会造成大量重新加载和对象存储请求。
八、Compactor
Compactor 合并小块、降采样并执行保留。一个 Bucket 通常只能有一个活跃 Compactor;多个实例并发可能破坏数据。
生产要提供:
- 持久工作目录;
- 足够磁盘;
- Leader/单例保证;
- 对象存储完整权限;
- Compaction Halt 告警;
- 删除延迟与保留配置。
Compactor 停止不会立即影响最新查询,却会导致块、成本和查询负担持续增长。
九、Downsampling
降采样降低长期大时间范围查询成本,但会牺牲分辨率。Query 可按 Max Source Resolution 选择原始或降采样数据。
告警通常应使用原始数据;容量趋势和年度报表可使用降采样。明确仪表盘使用的分辨率,避免误读尖峰。
十、Query 与去重
Query 连接多个 Store API,执行 PromQL 并去重。需要监控 Store 发现、重复 Label、Partial Response、查询扇出、超时和内存。
高可用 Query 本身无状态,但后端 Store 不可用时是否允许 Partial Response,应按告警和可视化场景区分。
十一、Query Frontend
Query Frontend 可将长时间查询拆分、缓存并排队,降低重复计算。配置:
- 时间分片;
- 结果缓存;
- 每租户并发;
- 最大查询长度;
- 重试与超时;
- 慢查询日志。
缓存必须包含租户和查询关键维度,避免数据串租户。
十二、Ruler
Ruler 通过 Query/Store API 计算 Recording/Alerting Rules,适合全局规则。故障时需考虑规则重复、评估延迟和通知。
核心告警尽量保留在本地 Prometheus,减少中心链路故障造成的盲区;全局聚合规则由 Ruler 处理。
十三、多租户
Receive 可按租户隔离写入,但查询、缓存、对象存储和权限也必须一致隔离。
租户 ID 不能无条件信任外部 Header,应由认证网关注入;限制每租户序列、写入、查询并发、时间范围和保留。
十四、高基数治理
常见危险 Label:用户 ID、订单号、URL 全路径、容器 ID、随机错误文本。
治理:
- 指标规范与评审;
- Scrape 前 Relabel;
- 每 Job/Namespace 序列预算;
- Top Cardinality 报表;
- 拒绝无界 Label;
- 定期清理无用指标与规则。
对象存储便宜并不能抵消查询和索引的高基数成本。
十五、保留与容量
估算:样本速率、压缩率、索引、对象版本、Compaction 临时、降采样和请求成本。原始、5 分钟、1 小时分辨率设不同保留。
删除采用延迟标记,给 Store 同步与误操作恢复留窗口。生命周期规则不能与 Compactor 保留互相冲突。
十六、缓存
可使用 Memcached/Redis 等缓存索引、Bucket 和查询结果。缓存故障应退化为较慢查询而不是数据错误。
监控命中率、驱逐、延迟、错误、容量和热点 Key。缓存扩容前先判断未命中来自冷启动还是查询模式。
十七、网络与安全
Store API 使用 gRPC。组件间启用 mTLS 或可信网络,管理端点与指标端点限制访问。对象存储密钥最小权限并轮换。
远程集群通过公网接入时使用加密、认证和限流,不直接暴露未认证 Remote Write 或 Store API。
十八、故障排查
历史数据缺失
检查 Sidecar 上传、对象块、Store 同步、时间范围、外部标签和 Compactor 标记。
数据重复
检查 Replica Label、外部标签、重复 Scrape、Sidecar 与 Receive 双写和 Query Dedup 参数。
查询很慢
查看时间范围、Series 数、Store 扇出、对象存储、缓存、Compaction 和 PromQL;先限制高成本查询。
Compactor Halt
保护现场,检查重叠块、对象损坏、磁盘、权限和版本。不要手工删除未知块;使用官方工具与流程修复。
Remote Write 积压
检查 Receiver、网络、WAL、队列、限流和下游磁盘。调整容量前确认高基数是否突然增长。
十九、灾难恢复
对象存储是主要数据源,但还需备份:配置、规则、外部标签规范、Hashring、租户、TLS/KMS 和访问策略。
演练重建 Query、Store、Compactor、Ruler 和 Receive,确认能从对象存储查询历史,且最新 WAL/本地数据的 RPO 可接受。
二十、升级
逐组件升级,先阅读数据格式、Flag 与弃用项。保持对象存储兼容,避免同时升级全部 Query/Store。升级 Compactor 尤其谨慎,先备份配置并观察一个完整 Compaction 周期。
二十一、监控告警
监控 Sidecar 上传、Receive 写入与副本、Store Bucket Sync、Query Store 状态与延迟、Frontend 队列、缓存、Compactor Halt、Ruler 评估、对象存储错误、WAL/磁盘和高基数。
二十二、上线清单
- Sidecar/Receive 选择有明确依据;
- External Label 全局唯一且去重正确;
- 对象存储具备一致性、权限和删除保护;
- Compactor 保持单例并有 Halt 告警;
- Query Frontend 有租户隔离和成本限制;
- 本地告警不依赖单一中心链路;
- 高基数预算和治理生效;
- 历史数据、最新数据和控制配置完成恢复演练。
参考资料
- Thanos Components:
https://thanos.io/tip/components/ - Thanos Object Storage:
https://thanos.io/tip/thanos/storage.md/ - Thanos Design:
https://thanos.io/tip/thanos/design.md/