一、监控体系概述
1.1 监控的核心目标
监控是运维工作的 “眼睛”,通过持续采集、分析系统和应用的指标数据,实现以下核心目标:
- 实时感知系统状态:掌握 CPU、内存、磁盘、网络等资源的实时使用情况,以及应用的响应时间、错误率等关键指标。
- 提前发现潜在风险:通过趋势分析和阈值告警,在问题影响业务前识别风险(如磁盘空间即将占满、内存泄漏导致内存使用率持续上升)。
- 快速定位故障根源:当故障发生时,结合监控数据、日志和链路追踪,缩短故障排查时间,降低业务中断损失。
- 优化资源配置:基于历史数据和趋势预测,合理调整服务器、网络等资源,避免资源浪费或不足。
- 支撑业务决策:通过业务指标(如订单量、用户活跃度)的监控,为产品迭代和运营决策提供数据支持。
1.2 监控的层次结构
一个完整的监控体系应覆盖从底层基础设施到上层业务的全栈监控,层次结构如下:
- 基础设施监控:包括物理服务器、虚拟机、容器、网络设备(交换机、路由器)、存储设备等,核心指标为资源使用率(CPU、内存、磁盘 I/O、网络带宽)、设备健康状态。
- 中间件监控:数据库(MySQL、PostgreSQL、MongoDB)、消息队列(Kafka、RabbitMQ)、缓存(Redis、Memcached)、Web 服务器(Nginx、Apache)等,核心指标为连接数、响应时间、吞吐量、错误率。
- 应用程序监控:自研应用或第三方应用,核心指标为接口响应时间(RT)、每秒请求数(QPS)、错误率(5xx/4xx 状态码占比)、并发用户数、业务逻辑执行状态。
- 业务监控:从用户视角出发的业务指标,如注册转化率、支付成功率、页面加载时间、订单处理耗时等,直接反映业务健康度。
- 端到端监控:模拟用户真实操作路径(如登录→浏览商品→下单→支付),监控全链路的响应时间和成功率,覆盖前端、API 网关、后端服务、数据库等环节。
1.3 监控的关键指标类型
- 资源类指标:CPU 使用率、内存使用率、磁盘空间使用率、磁盘读写 IOPS、网络带宽使用率、网络包丢失率。
- 性能类指标:应用响应时间(平均、P95、P99)、数据库查询耗时、接口吞吐量(TPS/QPS)、缓存命中率。
- 可用性指标:服务在线率(SLA)、接口成功率、数据库主从同步延迟、集群节点存活数量。
- 业务类指标:日活跃用户数(DAU)、新增用户数、订单成交量、支付金额、页面访问量(PV/UV)。
- 安全类指标:异常登录次数、SQL 注入攻击尝试次数、敏感接口调用频率、防火墙拦截次数。
二、监控工具深度解析
2.1 Prometheus 与 Grafana
- Prometheus 核心特性:
-
- 时序数据存储:采用自定义的时序数据库,按时间序列存储指标数据,支持高写入和高查询性能。
-
- 多维数据模型:每个指标通过名称和键值对标签(labels)唯一标识,如http_requests_total{method="GET",status="200"},便于按维度筛选和聚合。
-
- 灵活的查询语言(PromQL):支持丰富的聚合函数(sum、avg、rate)、条件过滤和时间范围查询,如rate(http_requests_total[5m])计算 5 分钟内 HTTP 请求的每秒增长率。
-
- 基于 Pull 的采集方式:主动从监控目标(通过 Exporter 暴露指标接口)拉取数据,无需在目标端部署代理,简化架构。
-
- 服务发现:支持静态配置、Kubernetes、Consul、DNS 等多种服务发现机制,自动发现新增的监控目标。
-
- 告警规则:基于 PromQL 定义告警规则,满足条件时触发告警,通过 Alertmanager 发送通知。
- Prometheus 部署架构:
-
- Prometheus Server:负责数据采集、存储和查询。
-
- Exporters:用于将非 Prometheus 格式的指标转换为 PromQL 兼容格式,常见 Exporter 包括:
-
-
- node_exporter:采集服务器 CPU、内存、磁盘、网络等指标。
-
-
-
- mysqld_exporter:采集 MySQL 数据库指标(连接数、慢查询数、InnoDB 状态)。
-
-
-
- redis_exporter:采集 Redis 缓存指标(内存使用、命中率、键数量)。
-
-
-
- blackbox_exporter:监控 HTTP、ICMP、TCP 等端点的可用性(如 URL 是否可访问、SSL 证书过期时间)。
-
-
- Alertmanager:处理 Prometheus 触发的告警,支持分组、抑制、路由和静默,对接邮件、Slack、钉钉等通知渠道。
-
- Grafana:可视化面板工具,与 Prometheus 深度集成,通过拖拽方式创建折线图、柱状图、仪表盘等图表,支持按时间范围缩放和指标下钻。
- PromQL 实战示例:
-
- 计算 5 分钟内 Nginx 的平均每秒请求数:rate(nginx_http_requests_total[5m])。
-
- 统计各状态码的 HTTP 请求占比:sum by (status) (rate(http_requests_total[5m])) / sum(rate(http_requests_total[5m])) * 100。
-
- 筛选出 CPU 使用率超过 80% 的节点:node_cpu_usage{mode="idle"} < 20(空闲 CPU 低于 20% 即使用率高于 80%)。
-
- 计算 Redis 缓存命中率:redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) * 100。
- Grafana 仪表盘设计:
-
- 关键指标突出显示:将核心指标(如系统可用性、业务成功率)放在仪表盘顶部,使用大字体和颜色区分状态(绿色正常、黄色警告、红色错误)。
-
- 多维度聚合展示:对同一指标按不同维度(如服务器、应用模块、地区)拆分图表,便于对比分析。
-
- 时间范围联动:所有图表共享时间选择器,切换时间范围时同步更新,支持查看实时数据和历史趋势。
-
- 告警阈值可视化:在图表中添加阈值线(如 CPU 使用率 80% 的红线),直观判断指标是否超标。
2.2 Zabbix 监控系统
- Zabbix 架构组件:
-
- Zabbix Server:核心组件,负责接收 Agent 发送的监控数据、处理告警、存储历史数据、管理配置。
-
- Zabbix Agent:部署在被监控主机上,主动采集本地指标并发送给 Server(主动模式)或接收 Server 的查询(被动模式),支持 Linux、Windows、AIX 等操作系统。
-
- Proxy:用于分布式监控场景,减轻 Server 压力,收集远程区域的监控数据后转发给 Server。
-
- Database:存储配置信息、历史数据和告警记录,支持 MySQL、PostgreSQL、Oracle 等数据库。
-
- Web Interface:基于 PHP 的 Web 管理界面,用于配置监控项、查看图表、管理告警。
- 监控项与触发器:
-
- 监控项(Item):定义需要采集的指标,如system.cpu.util[,idle](CPU 空闲率)、net.if.in[eth0](eth0 接口入站流量),支持自定义键值(UserParameter)采集应用指标。
-
- 触发器(Trigger):基于监控项数据设置告警规则,如{host:system.cpu.util[,idle].last()} < 20(CPU 空闲率低于 20% 触发告警),支持表达式组合(如and/or)和时间窗口(如连续 3 次触发才告警)。
- 模板与自动发现:
-
- 模板(Template):预定义监控项、触发器、图表的集合,可快速应用到同类主机(如 Web 服务器模板包含 Nginx 监控项),支持模板继承(子模板复用父模板配置)。
-
- 低级别自动发现(LLD):自动识别被监控主机上的动态对象(如磁盘分区、网络接口、Docker 容器),动态创建监控项,避免手动配置(如新增磁盘后自动添加磁盘使用率监控)。
- Zabbix 与 Prometheus 对比: