2. 监控体系架构设计:拉模式 vs 推模式、分层架构、数据流设计

监控架构选型,说白了就是回答两个问题:数据怎么拿?数据怎么流?

我见过不少团队,一上来就追时髦,Prometheus 拉模式、Kafka 推模式全上,结果数据链路乱成一锅粥。排错的时候,连数据丢在哪一步都搞不清楚。今天咱们就把这事掰扯清楚。

2.1 拉模式 vs 推模式:谁更适合你?

先看一张对比图,心里有个底。

核心结论:拉模式适合指标类监控(CPU、内存、QPS),推模式适合事件类监控(日志、异常、调用链)。

维度 拉模式 (Pull) 推模式 (Push)
典型代表 Prometheus Datadog Agent / Kafka
数据采集 监控系统主动拉取目标端点 目标主动上报数据到收集端
服务发现 依赖注册中心(Consul/K8s API) 依赖 Agent 配置或 SDK
扩展性 拉取频率受限于采集器数量 容易水平扩展,数据先入队列
数据丢失风险 目标宕机则丢失该周期数据 队列缓冲,重试机制更灵活
防火墙友好 需要目标暴露端口,跨网络麻烦 Agent 主动出站,穿透性好
适用场景 基础设施指标、K8s 集群 业务日志、分布式追踪、事件告警

我个人习惯:核心指标用拉模式,业务事件用推模式。为什么?

拉模式有个天然好处——谁拉谁负责。监控系统知道每个目标上次拉取的时间,如果超时了,立刻能感知到。我在项目中遇到过一个问题:业务方用推模式上报订单量,结果 Agent 进程 OOM 了,数据停了 3 小时没人发现。换成拉模式后,Prometheus 直接报 TargetDown,5 分钟就发现了。

避坑指南:我曾经在混合架构里犯过一个错——让同一个指标既走拉又走推。结果告警重复,数据对不上。后来定了个规矩:一个指标只走一条路。拉模式的数据源在 Prometheus 里查,推模式的数据源在 Elasticsearch 或 Kafka 里查,互不干扰。

2.2 分层架构:别让监控系统变成单点

你想想看,如果监控系统自己挂了,谁来监控监控?所以架构必须分层。

我一般把监控体系分成四层:

  1. 采集层:Exporter、Agent、SDK。负责从目标拿数据。
  2. 传输层:消息队列、负载均衡。负责把数据安全送到后端。
  3. 存储层:时序数据库、日志存储。负责持久化。
  4. 展示层:Grafana、告警引擎。负责可视化和通知。

下面这张图能帮你快速理解分层关系:

监控体系分层架构 展示层 Grafana 仪表盘 · 告警规则引擎 · 通知渠道(钉钉/邮件/PagerDuty) 存储层 Prometheus TSDB · Elasticsearch · InfluxDB · ClickHouse 传输层 Kafka · RabbitMQ · Nginx 负载均衡 · 数据缓冲队列 采集层 Prometheus Exporter · Datadog Agent · OpenTelemetry SDK · 自定义脚本 数据流方向:采集层 → 传输层 → 存储层 → 展示层

嗯,这里要注意:每一层都要有高可用设计。采集层可以多副本部署,传输层用 Kafka 做缓冲,存储层做数据分片和副本。我曾经见过一个团队,存储层只部署了一个单机 Prometheus,硬盘满了直接丢数据。后来我帮他们加了 Thanos 做长期存储和全局视图,才算稳下来。

警告:不要把所有监控数据都塞进同一个存储后端。指标数据用 TSDB,日志数据用 ES,调用链数据用 Jaeger。混在一起会导致查询性能急剧下降,排错时你连日志都搜不出来。

2.3 数据流设计:从采集到展示,每一步都要可观测

数据流设计,说白了就是数据从哪来,经过哪,到哪去。我习惯画一张数据流图,标清楚每个节点的输入输出。

以拉模式为例,典型的数据流是这样的:

  1. Exporter 暴露端点:比如 node_exporter 在 9100 端口暴露 /metrics。
  2. Prometheus 拉取:根据服务发现配置,定时(默认 15s)拉取数据。
  3. 数据写入 TSDB:Prometheus 将数据写入本地磁盘或远程存储。
  4. Grafana 查询:Grafana 通过 PromQL 查询数据并渲染图表。
  5. 告警触发:Prometheus Alertmanager 根据规则发送告警。

推模式的数据流稍有不同:

  1. Agent 采集:比如 Filebeat 采集日志文件。
  2. 发送到 Kafka:Agent 将数据推送到 Kafka Topic。
  3. 消费者处理:Logstash 或 Flink 从 Kafka 消费数据,做清洗和转换。
  4. 写入存储:数据写入 Elasticsearch 或 ClickHouse。
  5. 展示与告警:Kibana 展示,ElastAlert 触发告警。

关键设计原则:数据流中每个环节都要有指标暴露。比如 Kafka 的消费延迟、Prometheus 的拉取成功率、ES 的写入速率。这样当数据链路出问题时,你能快速定位是哪个环节卡住了。

我记得有一次线上告警延迟了 20 分钟才收到。查了一圈,发现是 Kafka 消费组 lag 飙到了 10 万条,但消费端没有监控消费延迟。后来我在每个消费者里都加了一个指标:consumer_lag,一旦超过阈值立刻告警。从那以后,数据积压再也没超过 5 分钟。

2.4 实战建议:如何选择你的第一套架构?

如果你是刚起步,我建议这样选:

  • 团队小于 10 人:直接用 Prometheus + Grafana 拉模式,日志用 ELK 推模式。简单粗暴,够用。
  • 团队 10-50 人:引入 Kafka 做传输层缓冲,存储层用 Thanos 或 VictoriaMetrics 做长期存储。
  • 团队大于 50 人:考虑全链路推模式 + 拉模式混合,引入 OpenTelemetry 统一数据格式,存储层做多级冷热分离。

小技巧:不管选哪种模式,数据采样一定要做。全量采集在规模大了以后成本极高。我一般对指标做 10s 粒度的全量采集,对日志做 1% 的采样,对调用链做 10% 的采样。够用,且省钱。

最后说一句:架构没有银弹。拉模式简单可靠,推模式灵活可控。关键是你得清楚自己的场景,然后把每一层的数据流都画出来,标清楚监控点。这样排错的时候,你才能像看地图一样,一眼找到问题在哪。