3. Prometheus 采集架构:Pull模型、Push模型、采集作业生命周期
Prometheus 的采集架构是其性能基准测试与压测设计的核心基础。理解 Pull 模型、Push 模型 以及 采集作业(Scrape Job)生命周期,是后续制定压测指标、配置负载模型、分析瓶颈的前提。本章从架构原理出发,逐步拆解这三个关键概念。
3.1 Pull 模型:主动拉取架构
Prometheus 默认采用 Pull(拉取)模型。在这种架构中,Prometheus Server 作为主动方,定期向配置好的目标(Target)发起 HTTP 请求,获取指标数据。这种设计将采集控制权集中在 Server 端,便于统一调度与故障管理。
核心特征: Server 主动连接 Target,Target 只需暴露 /metrics 端点,无需感知 Prometheus 的存在。
Pull 模型工作流程
- 服务发现 / 静态配置: Prometheus 通过服务发现(Consul、Kubernetes)或静态配置文件(
scrape_configs)获取目标列表。 - HTTP GET 请求: 每个采集周期,Prometheus 向目标的
/metrics端点发送 HTTP GET 请求。 - 响应解析: 接收并解析返回的文本格式指标数据(Prometheus Exposition Format)。
- 数据存储: 解析后的样本数据经过标签处理、时间戳对齐后写入本地存储(TSDB)。
Pull 模型优缺点对比
| 维度 | 优势 | 劣势 |
|---|---|---|
| 控制权 | Server 端统一控制采集频率、超时、重试,易于做负载均衡 | Target 必须网络可达,对网络防火墙策略要求较高 |
| 健康检查 | Pull 失败即代表 Target 不可用,天然具备 Up/Down 检测 | 无法主动推送告警,依赖 Server 端判断 |
| 扩展性 | 可通过分片(Sharding)水平扩展采集能力 | 大量短生命周期任务(如 CronJob)可能导致采集遗漏 |
| 安全性 | Server 端可配置 TLS、Basic Auth 统一认证 | Target 需暴露端口,增加攻击面 |
3.2 Push 模型:被动接收架构
虽然 Prometheus 原生是 Pull 模型,但在某些场景(如批处理任务、防火墙隔离的网络、IoT 设备)下,Target 无法被 Server 直接访问。此时需要 Push 模型 作为补充。Prometheus 通过 Pushgateway 组件实现 Push 能力。
适用场景: 短生命周期任务(如 Spark Job)、网络隔离区(DMZ)内的服务、无法长期暴露 /metrics 端点的临时进程。
Push 模型工作流程
- 客户端推送: 任务进程在结束时,将指标数据通过 HTTP POST 推送到 Pushgateway。
- 中间缓存: Pushgateway 作为指标缓存层,持久保留最后一次推送的数据。
- Server 拉取: Prometheus Server 仍然使用 Pull 模型,从 Pushgateway 的
/metrics端点拉取聚合后的指标。
Pull vs Push 模型决策矩阵
| 决策条件 | 推荐模型 | 原因 |
|---|---|---|
| 长期运行的服务(Web、DB) | Pull | 便于统一管理采集周期、健康检查、水平分片 |
| 批处理 / 定时任务 | Push | 任务结束后进程退出,无法被 Pull;Pushgateway 缓存最终状态 |
| 网络隔离 / NAT 环境 | Push | Target 无法被 Server 直接路由,只能主动外连 Pushgateway |
| 高基数 / 大规模集群 | Pull | Pushgateway 会成为单点瓶颈,且无法处理高基数标签 |
3.3 采集作业生命周期
一个完整的 Scrape Job(采集作业) 从配置加载到数据落盘,经历多个阶段。理解每个阶段的耗时与资源消耗,是压测中定位瓶颈的关键。
生命周期阶段分解
- 配置加载与目标发现: Prometheus 定期重新加载
scrape_configs,通过服务发现或文件 SD 更新目标列表。此阶段涉及网络请求(如 Consul API)或文件 I/O。 - 目标实例化: 为每个目标创建
ScrapePool和ScrapeLoop,分配采集周期、超时、标签等参数。 - HTTP 请求阶段:
- DNS 解析(如果目标使用主机名)
- TCP 连接建立(三次握手)
- TLS 握手(如果启用 HTTPS)
- 发送 HTTP GET 请求
- 等待响应(Server 处理时间 + 网络延迟)
- 读取响应体(指标数据流)
- 数据解析与标签处理:
- 解析 Prometheus Exposition Format 或 Protobuf
- 应用
relabel_configs(标签重写、丢弃、保留) - 执行
metric_relabel_configs(指标级标签操作)
- 样本存储: 将解析后的样本追加到 TSDB 的 Head Block,触发预写日志(WAL)写入。
压测关注点: 在压测中,HTTP 请求阶段 和 数据解析阶段 是 CPU 和网络 I/O 的主要消耗点。如果目标响应缓慢或返回大量指标,会导致采集超时(
scrape_timeout)和样本丢失。
采集作业生命周期流程图
3.4 采集性能关键参数
在压测中,以下参数直接影响采集作业的性能表现,需要在测试方案中明确配置:
| 参数 | 默认值 | 压测影响 |
|---|---|---|
scrape_interval |
1m | 决定采集频率,越短则 Server 负载越高,网络连接数越多 |
scrape_timeout |
10s | 超时后该次采集失败,影响 up 指标和样本完整性 |
sample_limit |
0(无限制) | 限制每个目标返回的最大样本数,防止内存溢出 |
relabel_configs |
无 | 复杂的正则匹配和标签操作会显著增加解析阶段的 CPU 开销 |
honor_labels |
false | 控制冲突标签处理策略,影响最终存储的标签数量 |
压测基线建议: 在基准测试中,建议从
scrape_interval=15s、scrape_timeout=10s、sample_limit=10000 开始,逐步增加目标数量和指标基数,观察 Server 的 CPU、内存、网络 I/O 变化曲线。