Prometheus 架构深度解析
Prometheus 不是又一个监控工具,而是一个重新定义监控数据模型的系统。它用 Pull 模型取代 Push 模型,用标签模型取代树形指标,用 PromQL 取代 SQL-like 查询语言。这三个改变让监控变得灵活得多,但也引入了一些独特的概念和限制。
理解 Prometheus 的架构,有助于你做出正确的使用决策:什么时候用 Prometheus,什么时候需要 Thanos 或 VictoriaMetrics。
整体架构
Pull 模型
原理
Prometheus 不等待数据推送过来,而是主动去拉取(Pull)。每个被监控的服务需要暴露一个 /metrics HTTP 端点,Prometheus 按照配置的间隔去访问这个端点。
为什么 Pull 比 Push 更适合监控
Pull 模型的局限
高延迟监控:prometheus.pushgateway 用于解决短生命周期任务(批处理、Lambda 函数)无法被 Pull 的问题。
高频指标:Prometheus 每次拉取只能获取最新值,不适合需要毫秒级精度的场景。
数据模型
时间序列
Prometheus 的基本数据单位是时间序列(Time Series),每条时间序列由以下元素组成:
示例:
标签的命名规范
服务发现
Prometheus 支持多种服务发现机制,让它能自动找到需要监控的目标:
Kubernetes 服务发现
常见服务发现角色
TSDB 存储引擎
存储结构
Prometheus 的存储分为两部分:
- Head(内存区):最新写入的数据,存储在内存中,支持高写入速率
- Block(磁盘区):定期压缩后的历史数据块
Gorilla 压缩算法
Prometheus 使用改进版的 Gorilla 压缩算法,可以将时序数据压缩 10 倍以上:
查询执行流程
写入速率与查询性能的权衡
scrape_interval 越短,数据越精细,但存储和查询压力越大。15 秒是大多数场景的合理默认值。
高可用架构
基本 HA
两台 Prometheus 同时抓取同一目标,数据去重由 Thanos Query 层处理。任一台 Prometheus 宕机,不影响监控连续性。
Thanos 实现全局视图
Thanos Sidecar 让 Prometheus 可以从对象存储读取历史数据,实现无限历史存储,同时保持 Prometheus 的独立运行能力。
常见问题
问题一:Prometheus OOM
问题二:查询超时
质量判断标准
读完本节后,你应该能够回答:
- Prometheus 的 Pull 模型相比 Push 模型,在「服务发现」和「健康检查」两个维度上有什么优势?
- Prometheus TSDB 的 Head Block 和 Block 分别承担什么职责?Gorilla 压缩算法是如何工作的?
- 在 Kubernetes 环境中,Prometheus 是如何自动发现需要监控的 Pod 的?
relabel_configs的作用是什么? - Prometheus 的 HA 架构中,两台 Prometheus 同时抓取同一目标,数据如何去重?Thanos Query 在其中扮演什么角色?
- 如果 Prometheus 出现 OOM 问题,最可能的原因是什么?如何从配置层面避免?