单机 Prometheus 是监控世界的"步兵"——开箱即用、指标模型简洁、PromQL 强大。但它有三个天然短板:数据只能本地保留 15 天(本地磁盘有限)、单点无 HA(挂了监控就没了)、无法跨集群全局查询。当监控规模从几十台机器涨到几百个集群、几亿条序列时,就需要把 Prometheus"集群化"——用 Thanos 或 Mimir 把多套 Prometheus 的数据汇聚起来,落到对象存储实现长期保留,并提供统一的全局查询入口。本指南深度解析 Thanos 与 Mimir 两大架构,覆盖组件职责、对象存储、全局去重查询、压缩降采样、多租户、HA,并给出选型与生产部署建议。
一、单机 Prometheus 的局限与演进路径
1.1 三个核心瓶颈
瓶颈一:存储
· 本地磁盘(TSDB WAL+Block),默认保留 15 天
· 扩容 = 换盘,无法横向扩展
瓶颈二:高可用
· 单实例故障 → 监控中断(盲区)
· Prometheus 无内置主从复制
瓶颈三:全局视野
· 每个集群一个 Prometheus,数据彼此隔离
· 想跨集群算 SLO、跨服务查延迟,做不到
→ 演进:Prometheus 实例(数据源)+ 汇聚层(查询/存储)
1.2 两条主路
路线 A:Thanos
· 保留 Prometheus 本体,在其上"叠加"去重、全局查询、长期存储
· 组件多(Sidecar/Query/Store/Compactor/Receiver),自由度大
路线 B:Mimir(Grafana Labs)
· 用 Mimir 取代 Prometheus 存储,多租户 SaaS 化体验
· Prometheus 只做采集(remote-write 推给 Mimir),存储由 Mimir 管
二、Thanos 架构深度
2.1 组件全景
Prometheus ──► Sidecar ──► 对象存储(S3/MinIO)
│ ▲
│ │
┌─────┴─────┐ Compactor(压缩/降采样)
│ │
Query(去重/查询) Store(Gateway,读取历史数据)
│ │
└─────┬─────┘
│
全局 PromQL 查询
组件职责:
Sidecar :上传本地 Block 到对象存储,暴露本地 TSDB 供 Query
Query :无状态查询网关,合并 Prometheus + Store,跨源去重
Store :读对象存储历史 Block 的网关
Compactor :合并小 Block、降采样(5m/1h)、保留策略
Receiver :接收 remote-write,解耦采集与存储(可选)
2.2 Sidecar 配置
# thanos-sidecar.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: thanos-sidecar
namespace: monitoring
spec:
serviceName: prometheus-sidecar
selector:
matchLabels:
app: thanos-sidecar
template:
metadata:
labels:
app: thanos-sidecar
spec:
containers:
- name: thanos
image: quay.io/thanos/thanos:0.34.1
args:
- sidecar
- --tsdb.path=/prometheus
- --objstore.config-file=/etc/thanos/objstore.yaml
- --http-address=0.0.0.0:10902
- --grpc-address=0.0.0.0:10901
volumeMounts:
- name: data
mountPath: /prometheus
- name: objstore
mountPath: /etc/thanos
2.3 对象存储配置
# objstore.yaml — S3/MinIO
type: S3
config:
bucket: thanos-metrics
endpoint: minio.monitoring.svc:9000
access_key: ${MINIO_ACCESS}
secret_key: ${MINIO_SECRET}
insecure: true
# 可选:自动桶生命周期策略,按层级保留
三、Mimir 架构深度
3.1 组件全景
Prometheus(采集) ──remote-write──► Distributor(分发/校验)
│
▼
Ingester(内存 + 常驻块)
│ 上传
▼
Compactor(压缩/去重/多租户)
│
▼
对象存储(S3/GCS)
查询路径:
Query-frontend(分片/缓存) → Querier → Store-Gateway(读历史)
│
▼
对象存储
Mimir 内置多租户:每个租户隔离数据与配额
3.2 Mimir 关键优势
· 多租户(多团队/多环境隔离)
· 原生 remote-write 协议(无需 Sidecar 上传)
· 高可用:副本 + 分布式 Querier,无单点
· 查询性能:分片并行 + 结果缓存 + 索引加速
· 水平扩展:每个组件可独立扩缩容
· 内置告警规则评估(Alertmanager 集成)
3.3 采集端对接
# prometheus.yml — 采集侧只需加 remote_write
remote_write:
- url: http://mimir-distributor.monitoring:9009/api/v1/push
queue_config:
max_samples_per_send: 2000
capacity: 25000
min_shards: 1
max_shards: 30
metadata_config:
send_interval: 5m
# 本地 TSDB 可保留亦可关闭(纯转发模式)
四、Thanos vs Mimir 选型
| 维度 | Thanos | Mimir |
|---|---|---|
| 核心理念 | 叠加在 Prometheus 上 | 替代 Prometheus 存储 |
| 部署复杂度 | 组件多,运维重 | 组件多但职责清晰 |
| 多租户 | 弱(无原生隔离) | 强(租户 + 配额) |
| remote-write | Receiver 需自建 | 原生支持 |
| 查询去重 | 内置(Query) | 内置(分布式 Querier) |
| 降采样 | Compactor 支持 | 支持 |
| 告警 | 依赖原 Prometheus | 内置 Alertmanager |
| 适用 | 已有大量 Prometheus 想保留 | 从零建统一监控平台/多团队 |
ℹ️ 选型建议:已有 N 套 Prometheus 想统一 + 保留历史 → Thanos;要从零建"一个监控平台管所有团队/环境" → Mimir。中小规模(几十套以内)Thanos 更轻,大规模多租户 Mimir 更省心。
五、全局查询与跨源去重
5.1 Thanos Query 全局查询
# thanos-query.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: thanos-query
namespace: monitoring
spec:
template:
spec:
containers:
- name: thanos
image: quay.io/thanos/thanos:0.34.1
args:
- query
- --store=thanos-store.monitoring.svc:10901
- --store=prometheus-0.monitoring.svc:10901
- --store=prometheus-1.monitoring.svc:10901
- --query.replica-label=prometheus_replica
# 跨集群查询示例:全局 HTTP 错误率
sum by (service) (
rate(http_requests_total{code=~"5.."}[5m])
/ rate(http_requests_total[5m])
)
# 去重原理:同一时序多副本(label 不同),按 replica-label 取唯一
5.2 去重规则
Thanos Query 去重:
· 通过 --query.replica-label 指定区分副本的 label
· 查询时对同一 label-set 的多副本,选 min/max 策略取一份
· 默认 dedup 开启,保证 HA 双副本不重复计数
Mimir 去重:
· Ingester 写入时基于 (tenant, series) 去重
· 高可用:双写 + dedupe 策略(推同名系列取一个)
5.3 PromQL 全局聚合的注意点
跨源查询陷阱:
· 速率类指标(rate/irate)必须在"同一源"内计算后聚合
· 全局查询先算 rate 再 sum(先 rate 后聚合),
不要 sum 后再 rate(会因时间对齐失真)
· 使用 label 区分来源(cluster="prod-a")便于分区聚合
六、压缩与降采样:控制存储成本
6.1 Compactor 的作用
对象存储里时间越长 Block 越多越小:
· 2h 一个 Block,一年 ≈ 4000+ Block
· 查询要扫描大量小文件,性能差
· 对象存储按请求计费,小文件开销高
Compactor 解决:
· 合并小 Block 成大 Block(长期数据)
· 降采样(Downsample):数据越老分辨率越低
· 删除超过保留期的数据
6.2 降采样策略
# thanos-compactor.yaml — 关键参数
args:
- compact
- --objstore.config-file=/etc/thanos/objstore.yaml
- --retention.resolution-raw=90d # 原始分辨率保留 90 天
- --retention.resolution-5m=180d # 5m 降采样保留 180 天
- --retention.resolution-1h=1y # 1h 降采样保留 1 年
- --retention.downsample-resolution=5m,1h
降采样分辨率建议:
0d-90d 原始分辨率(1s-30s)
90d-180d 5m 分辨率
180d-1y 1h 分辨率
→ 存储量可缩减 70-90%,长期趋势分析几乎无感
6.3 保留策略
# Mimir 保留(按租户)
limits:
compactor:
retention_period: 30d # 全局 30 天
block_ranges: [2h, 6h, 24h, 5d, 30d]
七、多租户与配额
7.1 Mimir 多租户
# 租户通过 X-Scope-OrgID 头标识
# prometheus.yml remote_write 增加 header:
remote_write:
- url: http://mimir-distributor:9009/api/v1/push
headers:
X-Scope-OrgID: team-payment
# 租户配额(limits per tenant)
tenant_limits:
team-payment:
max_global_series: 2000000 # 最多 200 万序列
max_series_per_metric: 10000
max_queries_per_second: 100
max_query_length: 721h
compactor_retention_period: 90d
7.2 Thanos 的租户替代方案
Thanos 无原生租户,多团队隔离常用:
· 每个团队独立 Prometheus + 独立 Bucket
· Query 侧按 store 集合分组,配置多套 Query 实例
· 或用 label 隔离 + RBAC 控制查询入口
八、高可用设计
8.1 Thanos HA
· 每个 Prometheus 跑双副本(双写/拉取同源)
用 --query.replica-label 去重
· Query 无状态,可多副本 + 负载均衡
· Store/Compactor 各自多副本(Compactor 需单实例或锁)
· 对象存储本身高可用(S3/MinIO 多节点)
8.2 Mimir HA
· Ingester 有状态:副本 + 心跳恢复(Mimir 可无状态化启动)
· Distributor/Querier 无状态水平扩展
· 对象存储 + 元数据(可配 ETCD/Cassandra 做索引)
· 内置多副本 + 故障自愈,日常几乎无运维
九、生产部署与成本优化
9.1 部署拓扑参考
方案一(Thanos,保留现有 Prometheus):
各集群 Prometheus + Sidecar
→ 统一 MinIO/S3 Bucket
→ Thanos Query(全局查询)
→ Thanos Compactor(降采样)
→ Grafana 接 Thanos Query
方案二(Mimir,全新统一平台):
各集群 Prometheus 纯采集
→ remote-write → Mimir(Distributor→Ingester→Compactor)
→ Grafana 接 Mimir(多租户)
9.2 成本优化清单
· 降采样:90d 后 5m/1h,存储降 70-90%
· 采样 + 序列控制:砍高基数 label,控制 series 数
· 对象存储生命周期:冷数据转低频存储(S3 IA/Glacier)
· 压缩:Compactor 合并减少请求数
· 查询缓存:Query-frontend/Thanos 缓存减少后端压力
· 合理保留期:按合规需要而非"永远"保留
9.3 监控这套系统本身
# 关注的关键指标
thanos_querier_store_api_request_duration_seconds
thanos_compact_blocks_cleaned_total
mimir_ingester_active_series
mimir_compactor_blocks_cleaned_total
# 告警:对象存储写入失败、查询延迟飙升、保留期异常
总结:长期存储集群化决策表
| 决策点 | 建议 |
|---|---|
| 是否保留原 Prometheus | 是→Thanos;否→Mimir |
| 多团队隔离需求 | 强→Mimir;弱→Thanos+多 Bucket |
| 部署复杂度接受度 | 低→Mimir(托管式);可接受→Thanos |
| 查询性能要求 | 高→Mimir(内置分片/缓存) |
| 已有资产 | 大量旧数据/旧规则→Thanos 平滑过渡 |
Prometheus 集群化的本质是把"采集"与"存储/查询"解耦:采集仍由轻量 Prometheus 承担,存储落到可无限扩展的对象存储,查询交给统一的全局入口。Thanos 是"叠加者",让老 Prometheus 活出第二春;Mimir 是"革新者",用多租户和托管体验重新定义监控平台。无论选哪条路,降采样、去重、对象存储、全局查询这四件事是共同的核心——做好它们,监控就从"每个集群各自为政"升级为"整个组织一张网"。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。