1. Prometheus 架构总览:核心组件与数据流

Prometheus 是一个开源的系统监控与告警工具包,其核心设计理念是拉取(Pull)模型。理解其整体架构是进行性能调优与资源配额规划的前提。本章将逐一拆解 Prometheus Server、TSDB、Alertmanager、Pushgateway 四大核心组件,并通过数据流图展示指标从采集到告警的完整路径。

1.1 核心组件一览

组件 职责 关键特性
Prometheus Server 指标采集、存储、查询、告警规则评估 Pull 模式抓取目标;内置时序数据库(TSDB);支持 PromQL 查询;触发告警规则后推送至 Alertmanager
TSDB 高效存储和压缩时序数据 自定义存储格式;支持 2 小时 block 合并与压缩;内存映射(mmap)加速查询;支持 WAL 与数据回放
Alertmanager 告警路由、去重、静默、通知 接收 Prometheus Server 推送的告警;分组抑制;支持邮件、PagerDuty、Slack 等接收器
Pushgateway 接收短生命周期任务的指标推送 允许批处理或无法被 Pull 的任务主动推送指标;作为指标的中转缓存
架构要点:Prometheus Server 是整个系统的中枢,TSDB 是存储基石,Alertmanager 负责告警生命周期管理,Pushgateway 是 Pull 模型的补充。性能调优的核心往往集中在 Server 的抓取能力与 TSDB 的 I/O 效率上。

1.2 数据流图:从指标采集到告警通知

下图展示了 Prometheus 生态中一条完整的指标数据流。箭头方向代表数据或告警的传递方向。

Prometheus 核心数据流图 被监控目标 (Exporter / 应用) Pushgateway (短任务指标缓存) Prometheus Server 抓取 / 存储 / 查询 / 规则评估 TSDB (时序数据存储) Alertmanager 去重 / 分组 / 通知 通知接收器 Pull (HTTP /metrics) Pull Push (批处理) 写入 告警推送 通知 数据流说明: 1. Prometheus Server 定期 Pull 被监控目标(Exporter)的 /metrics 端点。 2. 短生命周期任务通过 Pushgateway 主动 Push 指标,Server 再 Pull Pushgateway。 3. 采集到的指标写入 TSDB 持久化;PromQL 查询直接读取 TSDB。 4. 告警规则评估触发后,告警推送至 Alertmanager,经去重分组后发送通知。

1.3 组件交互与数据流详解

  1. 指标采集阶段:Prometheus Server 根据配置的 scrape_config,定期向目标 Exporter 或应用暴露的 HTTP 端点发起 Pull 请求,获取指标数据。对于无法直接 Pull 的批处理任务,由任务主动向 Pushgateway 推送指标,Server 再统一从 Pushgateway 拉取。
  2. 存储阶段:Server 将拉取到的样本数据写入内嵌的 TSDB。TSDB 按 2 小时为一个 block 进行数据压缩与合并,并利用 WAL(Write-Ahead Log)保证数据可靠性。
  3. 查询与告警评估阶段:用户通过 PromQL 查询 TSDB 中的数据。Server 定期评估告警规则,当规则表达式持续满足阈值条件时,生成告警事件。
  4. 告警通知阶段:告警事件被推送至 Alertmanager。Alertmanager 根据路由配置对告警进行分组、抑制、静默,最终通过配置的接收器(如邮件、Webhook)发送通知。
性能关注点:在数据流中,Pull 抓取和TSDB 写入是 Prometheus Server 最消耗 CPU 和 I/O 的两个环节。当目标数量超过 1000 个或每秒样本数超过 50 万时,需要重点优化抓取间隔、样本大小以及 TSDB 的 block 压缩参数。

1.4 组件部署关系与资源边界

在生产环境中,各组件可以独立部署,也可以合并部署。下表列出了常见的部署模式及其资源隔离建议:

部署模式 组件组合 资源配额建议
单机 All-in-One Server + TSDB + Alertmanager 4C / 16GB RAM / 500GB SSD(小规模 < 500 目标)
分离部署 Server + TSDB(独立节点)
Alertmanager(独立节点)
Server: 8C / 32GB RAM
Alertmanager: 2C / 4GB RAM
高可用联邦 多个 Server + 联邦层 + 独立 Alertmanager 集群 按每 1000 目标分配 8C / 32GB RAM 基线
注意:Pushgateway 通常不与其他组件共享高负载节点,因为它可能成为短任务指标的单点瓶颈。建议为 Pushgateway 单独分配 1C / 2GB RAM 资源,并设置合理的指标过期时间(--pushgateway.expiry-interval)。