Prometheus 长期存储与集群化:Thanos 与 Mimir 架构对比与实战

单机 Prometheus 是监控世界的"步兵"——开箱即用、指标模型简洁、PromQL 强大。但它有三个天然短板:数据只能本地保留 15 天(本地磁盘有限)、单点无 HA(挂了监控就没了)、无法跨集群全局查询。当监控规模从几十台机器涨到几百个集群、几亿条序列时,就需要把 …

单机 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 选型

维度ThanosMimir
核心理念叠加在 Prometheus 上替代 Prometheus 存储
部署复杂度组件多,运维重组件多但职责清晰
多租户弱(无原生隔离)强(租户 + 配额)
remote-writeReceiver 需自建原生支持
查询去重内置(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 是"革新者",用多租户和托管体验重新定义监控平台。无论选哪条路,降采样、去重、对象存储、全局查询这四件事是共同的核心——做好它们,监控就从"每个集群各自为政"升级为"整个组织一张网"。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「Observability」更多文章

  1. 可观测性成本治理:采样降噪、数据生命周期与存储成本优化实战
  2. 生成式 AI 可观测性:LLM 调用追踪、Token 成本监控、质量与安全评估
  3. 服务网格可观测性:Istio 遥测、Kiali 拓扑与全链路追踪实战