多集群可观测性联邦与聚合:联邦查询、数据分片与全局视图

系统讲解多集群可观测性联邦与聚合:Prometheus 联邦的适用与局限、Thanos 与 Mimir 的全局视图、数据分片去重与降采样、日志与链路的跨集群聚合、全局 SLO 与跨集群告警,以及常见避坑与最佳实践清单。

单集群的可观测性已经够复杂了,当业务扩张到多集群、多地域、多云之后,问题会指数级放大:每个集群一套 Prometheus,告警各响各的,没人能回答「全局的 P99 是多少」。多集群可观测性联邦要解决的,就是把散落在各处的数据汇聚成一个逻辑上的「全局视图」,同时不牺牲单集群的自治与故障隔离。本文从 Prometheus 联邦的局限讲到 Thanos/Mimir 的全局查询与降采样。

关键概念:多集群可观测性联邦=在保留每个集群本地采集与自治的前提下,通过统一的查询层把多个数据源聚合成全局视图。核心矛盾是**「全局可见」与「故障隔离、成本可控」之间的平衡**。



1. 多集群可观测性的挑战

1.1 典型困境

困境一:N 个集群 N 套 Prometheus → 查询要切 N 次界面
困境二:告警规则复制 N 份 → 改一次要改 N 处,必然漂移
困境三:跨集群调用链断裂 → trace 在集群边界处"断头"
困境四:没有全局视图 → 无法回答"全球用户此刻体验如何"
困境五:成本失控 → 每集群长期存储,重复冗余

1.2 三个设计目标

1. 全局可见:一条查询覆盖所有集群,统一 Dashboard 与 SLO
2. 故障隔离:单集群采集故障不影响其他集群与全局查询
3. 成本可控:长期存储集中化,冷热分层,降采样

1.3 两种拓扑

拓扑说明适用
层级联邦全局层从各集群拉取聚合数据只需少量聚合指标
远程写入 + 全局查询各集群写入统一存储,查询层聚合需要完整明细与全局查询
混合本地保留热数据,长期上收大型多集群生产环境
选型原则:需要"下钻到单实例"就必须用远程写入方案,联邦只给聚合值

2. Prometheus 联邦的适用与局限

2.1 联邦的工作方式

# 全局 Prometheus 的抓取配置
scrape_configs:
- job_name: federate
  honor_labels: true
  metrics_path: /federate
  params:
    match[]:
    - '{__name__=~"job:.*"}'                 # 预聚合的 recording rules
    - 'up{job="kubernetes-service-endpoints"}'
  static_configs:
  - targets:
    - prometheus-cluster-a:9090
    - prometheus-cluster-b:9090
原理:全局 Prometheus 通过 /federate 接口,从各集群拉取指定指标的"当前值"
要点:
  - match[] 决定拉什么,通常只拉 recording rules 的聚合结果
  - honor_labels: true 保留原始 label(否则冲突时会被覆盖)
  - 抓取间隔通常较长(1m),因为联邦是"二次采样"

2.2 联邦的四大局限

局限一:只拉当前值,丢失历史精度(二次采样 → 精度下降)
局限二:不解决长期存储(全局 Prometheus 依然是本地磁盘)
局限三:拉取是集中式 → 全局实例成为瓶颈与单点
局限四:不适合明细指标 → 拉全量指标会打爆全局实例

2.3 什么时候够用

适合:
  - 只需要全局聚合视图(如全局 RPS、全局错误率)
  - 集群数量少(< 10),指标量不大
  - 已有完善的 recording rules 预聚合
不适合:
  - 需要下钻到单 Pod 的历史数据
  - 需要长期存储与跨集群 trace 关联
结论:联邦是"轻量方案",规模化生产应转向 Thanos/Mimir

⚠️ 注意:不要用联邦拉取原始指标(如 {__name__=~".+"}),那会让全局实例瞬间 OOM。联邦只拉预聚合后的少量序列。


3. Thanos 与 Mimir 的全局视图

3.1 Thanos 架构

Sidecar 模式:
  每个集群的 Prometheus 挂一个 thanos-sidecar
  → 上传 TSDB 块到对象存储(S3/MinIO)
  → 暴露 StoreAPI 供查询

核心组件:
  Sidecar     旁挂 Prometheus,上传块 + 提供 StoreAPI
  Store Gateway  读取对象存储中的历史块
  Querier     聚合查询多个 StoreAPI(含 Sidecar 与 Store Gateway)
  Compactor   降采样 + 压缩 + 保留策略
  Receiver    可选,支持远程写入(替代 Sidecar)
查询路径:
  Grafana → Thanos Querier
    → 各集群 Sidecar(近期数据)
    → Store Gateway(历史数据,对象存储)
  去重后返回统一结果

3.2 Mimir 架构

Mimir = 原生多租户、水平扩展的长期存储
  写入:Prometheus remote_write → Distributor → Ingester → 对象存储
  查询:Querier → Store Gateway(对象存储)+ Ingester(近期数据)

与 Thanos 的差异:
  - Mimir 是"重写版 Cortex",微服务架构,天然水平扩展
  - Thanos 更"插件式",可渐进式改造现有 Prometheus
  - Mimir 多租户隔离更强(tenant_id 贯穿)

3.3 对比

维度ThanosMimir
部署模式组件化,旁挂 Prometheus微服务,独立集群
写入路径Sidecar 上传块 / Receiverremote_write
多租户弱(靠外部 label)原生强隔离
水平扩展部分组件可扩全组件可扩
改造成本低(加 Sidecar 即可)中(需迁移写入)
运维复杂度中高
适用规模中型多集群大型多租户平台

3.4 查询层的关键能力

全局查询:Querier 合并多个数据源,Grafana 只连一个地址
去重(Dedup):HA 双写场景下,同一序列多副本只保留一份
部分响应:某集群不可达时,返回其余集群结果 + 警告,而非整体失败
跨集群聚合:sum by (service) 自然跨所有集群求和

4. 数据分片、去重与降采样

4.1 去重(Deduplication)

场景:Prometheus HA 部署(两个副本同时抓取同一目标)
问题:不处理会导致所有指标翻倍

Thanos 方案:
  Querier 开启 --query.replica-label=replica
  同 series 同时间戳的多个副本 → 只保留一个
Mimir 方案:
  写入时按 tenant 去重,或依赖 HA tracker(接受一个副本)
前提:副本必须打上可区分的 label,如 replica="a" / replica="b"

4.2 分片策略

按集群分片:每个集群一个 Prometheus / tenant
按租户分片:多业务共用平台,用 tenant_id 隔离
按时间分片:对象存储中按 2h 块组织(Thanos 默认)
按指标分片:超大规模下,同一集群内按 hash 分片抓取

4.3 降采样(Downsampling)

目的:历史数据查询更快、存储更省
策略(Thanos 默认):
  原始数据:保留 15 天(高精度)
  5 分钟降采样:保留 90 天
  1 小时降采样:保留 1 年以上

效果:查询一年前的趋势图,用 1h 粒度即可,无需扫描原始点
注意:降采样后无法再算精确的 P99 → 高精度聚合需在采集时用
      recording rules 预计算并长期保留

4.4 保留策略与成本

分层保留示例:
  热数据(本地 SSD):15 天
  温数据(对象存储):180 天
  冷数据(低频存储):2 年

成本估算关注点:
  活跃序列数 × 采样点大小 × 保留时长
  降采样可把长期存储成本降低一个数量级

ℹ️ 核心:降采样解决「历史查询性能」,recording rules 解决「历史精度丢失」。二者必须配合,否则一年后你只能看到粗糙趋势,算不出精确 SLO。


5. 日志与链路的跨集群聚合

5.1 日志聚合

方案:各集群 Loki/ES 采集 → 中心查询层聚合
Loki 模式:
  各集群 Loki 独立存储,通过 Loki 的 "multi-cluster" 或
  Grafana 多数据源 + Correlations 联合查询
  或统一写入中心对象存储,Loki 查询层横向扩展

关键标签(跨集群必须一致):
  cluster、region、env、service_name
否则无法跨集群聚合与下钻

5.2 链路聚合

挑战:trace 跨越多个集群时,span 分散在不同存储
方案一:统一 trace 后端(各集群 OTel Collector 统一导出到中心 Tempo)
方案二:按 trace_id 哈希分片到不同 Tempo 实例,查询层聚合
关键:trace_id 全局唯一,且采样决策一致(否则 trace 断头)
采样一致性坑:
  集群 A 采样、集群 B 未采样 → trace 在 B 处断裂
  对策:用统一的采样策略(如基于 trace_id 的一致性采样),
      由 Collector 的 tail_sampling 或统一的采样服务决策

5.3 统一语义约定

跨集群聚合的前提是 label/属性命名一致:
  service.name、k8s.cluster.name、cloud.region
建议:把资源属性(resource attributes)在 Collector 层统一注入,
      不让应用各自命名,避免"cluster"与"cluster_name"并存

6. 全局 SLO 与跨集群告警

6.1 全局 SLO 计算

目标:全球用户视角的可用性,而非各集群分别达标
方法:先各集群算分子分母,再全局求和(不能先算比率再平均!)

错误做法:
  avg(cluster_a_availability, cluster_b_availability)  # 忽略流量权重

正确做法:
  sum(rate(http_requests_total{status!~"5.."}[5m]))
    / sum(rate(http_requests_total[5m]))
注意:跨集群聚合必须在"计数"层面做,比率类指标先还原成分子分母

6.2 跨集群告警设计

层次一:集群内告警(本地自治,快速响应)
层次二:全局告警(全局 SLO 燃尽率、全局错误率)
层次三:联邦健康告警(某集群数据上报中断)

关键:告警规则集中定义(GitOps),但评估位置分散
     避免"全局评估单点"导致所有告警一起失效

6.3 全局燃尽率告警

多窗口多燃尽率(SRE 标准做法):
  # 快速燃尽:1h 窗口消耗 2% 预算 → 紧急告警
  (
    sum(rate(errors_total[1h])) / sum(rate(requests_total[1h]))
  ) > (14.4 * (1 - 0.999))
  and
  (
    sum(rate(errors_total[5m])) / sum(rate(requests_total[5m]))
  ) > (14.4 * (1 - 0.999))
好处:既快速发现严重故障,又不因短时抖动误报
跨集群版:把 sum 的范围扩展到所有集群的 remote 数据

6.4 数据缺口检测

问题:某集群上报中断,全局指标"看起来正常"(少了一个集群的坏数据)
对策:监控每个集群的上报心跳
  up{job="federate"} == 0
  count by (cluster) (up) < 期望集群数
告警:集群 X 数据上报中断,全局视图可能不完整

7. 常见避坑

坑现象对策
联邦拉原始指标全局实例 OOM只拉 recording rules 聚合值
未去重HA 双写导致指标翻倍配 replica label 并开启 dedup
比率先平均全局 SLO 被小集群拉偏先还原分子分母再聚合
降采样当长期精度一年后算不出精确 P99关键指标用 recording rules 长期保留
标签命名不统一无法跨集群聚合Collector 层统一注入资源属性
采样策略不一致trace 跨集群断头全局一致性采样
全局评估单点中心挂了所有告警失效集群内自治 + 全局补充
无数据缺口检测集群失联被当成"正常"监控各集群上报心跳
全局查询无超时某集群慢拖垮整个查询设置部分响应与超时
一上来就全量上收成本与复杂度双爆先聚合后明细,渐进演进

8. 最佳实践清单

□ 明确目标:只需聚合视图用联邦,需下钻明细用远程写入方案
□ 联邦只拉预聚合的 recording rules,绝不拉原始指标
□ HA 部署必须配 replica label 并在查询层去重
□ 全局 SLO 在计数层聚合,绝不先算比率再平均
□ 用 recording rules 预计算关键聚合,长期保留高精度
□ 用降采样降低历史查询成本,与 recording rules 配合
□ 在 Collector 层统一注入 cluster/region/service 属性
□ 用全局一致性采样避免 trace 跨集群断头
□ 告警分层:集群内自治 + 全局 SLO + 联邦健康
□ 监控每个集群的上报心跳,检测数据缺口
□ 从单集群到多集群渐进演进,先聚合后明细

一句话原则

多集群可观测性 = 本地自治 + 全局查询层,
聚合在计数层、去重在查询层、降采样在存储层。

小结

多集群可观测性联邦的难点,从来不是「把数据聚到一起」,而是在全局可见与故障隔离、成本可控之间找到平衡。技术选型上,Prometheus 联邦适合轻量聚合视图(只拉 recording rules),需要下钻明细与长期存储则必须上 Thanos 或 Mimir;工程细节上,务必做好 HA 去重、分层降采样、统一标签命名、全局一致性采样;指标语义上,全局 SLO 必须在计数层聚合,绝不能先算比率再平均。再配合「集群内自治 + 全局补充」的告警分层与数据缺口检测,多集群环境才能真正拥有一个可信、可下钻、可告警的全局视图。

继续阅读

探索更多技术文章

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

全部文章 返回首页

「infra」更多文章

  1. 可观测性即代码:仪表盘、告警规则与采集配置的 GitOps
  2. 消息队列可观测性:Kafka 与 RabbitMQ 的滞后、积压与端到端延迟
  3. 数据库与查询层可观测性:慢查询、连接池与执行计划