尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

监控系统核心概念与落地实践:从Prometheus到Zabbix的全面指南

监控系统核心概念与落地实践:从Prometheus到Zabbix的全面指南 凌晨两点被手机震醒一脸懵地爬起来打开电脑发现线上一个核心服务毫无征兆地挂了。如果这时候你手边连个监控面板都没有只能一台台服务器登录上去看日志、看进程、看磁盘那感觉就像黑灯瞎火在仓库里找一根掉在地上的针急得满头大汗却连从哪下手都不知道。做运维和研发这几年我越来越觉得监控系统就是数字世界的“健康体检中心”。它平时不声不响但每隔几秒就给你的服务器、数据库、中间件、业务接口做一次全面检查量体温、测血压、查心率一旦指标异常马上把“体检报告”推到你的手机、钉钉、企业微信或者邮件里。这套东西你早做一天就少熬一个夜做得好半夜被叫醒的次数能降一个数量级。这篇文章是“监控基础概念”系列的第一篇定位是给刚接触监控的同学打地基同时也帮已经用过一些监控工具、但没系统梳理过底层逻辑的同行把概念串起来。文章会从监控系统的本质讲起拆解它的核心部件、数据模型、常见设计方案对照当前主流的开源工具和商业方案最后落到一套最小可用监控系统的搭建思路和避坑经验。无论你是运维、后端开发、SRE还是准备做个人项目监控的小团队负责人这篇文章都值得花十分钟看完。1. 监控到底在解决什么问题不只是“挂了发个告警”很多刚入行的同学对监控的理解就是“出问题的时候能收到通知”这个理解没错但太窄了。监控系统真正要解决的问题不是“发现故障”而是“让你在用户感知到故障之前发现故障正在发生”以及“故障发生之后能用最短的时间定位到根因”。这两个目标决定了监控系统在设计上的许多关键取舍。1.1 三类最常见的故障场景监控分别怎么应对第一类是资源耗尽型故障比如磁盘写满、内存泄漏导致OOM、CPU被打满、带宽跑满。这类故障的特征是有一个从“正常”到“异常”的渐变过程磁盘不可能一秒写满内存也不可能瞬间泄漏到爆。只要你在指标上设置好合理的阈值完全可以在故障发生之前十几分钟甚至更早收到告警提前介入处理。第二类是进程级故障比如服务进程崩溃、端口失联、死锁导致线程池耗尽、依赖的数据库连接数被占满。这类故障的特征是“突然”发生渐变过程很短或者没有。应对手段不能只靠指标阈值还得配合心跳检测、端口探测、健康检查接口等“主动探活”机制。第三类是业务逻辑层的“假正常”故障这是最阴的。所有基础设施指标都是绿的CPU低、内存低、进程活着、端口通着但用户就是下单失败或者页面打开特别慢。这种故障靠传统监控指标很难发现必须从业务指标层去覆盖比如订单成功率、接口响应时间P99、支付回调延迟等。这也是为什么我一直强调监控体系一定要从基础设施层一直建到业务层缺了业务层的监控前面的监控做得再漂亮也只能算半套。1.2 监控、日志、链路追踪三兄弟各有分工初次接触可观测性的人很容易把监控、日志、链路追踪三件事搞混。我打个比方监控好比是定期体检告诉你血压高了、血糖异常了日志好比是生活记录你每天吃了什么、做了什么、几点睡的都写在本子上链路追踪则是针对一次具体事件的“全程回放”比如你点了一次外卖从下单到支付到商家接单到骑手配送每一站花了多少时间、在哪一站卡的壳都能完整还原。三者的关系不是替代而是配合。监控负责“发现问题”日志和链路追踪负责“定位问题”。一套好的监控体系在发出告警之后应该能通过关联日志和链路数据直接帮你把一个模糊的“服务变慢”缩小到“某个接口的某次查询慢了慢在数据库查询上慢的具体SQL是某某”。如果没有监控日志和链路数据就像一堆没索引的文档出问题后大海捞针。反过来如果只有监控没有日志你知道了“哪里出了问题”却很难知道“为什么出问题”。所以在搭建监控体系的时候不要孤立地去想“我要装一个监控工具”而是要把数据采集、指标存储、告警、日志、链路追踪放在一起做整体规划。虽然工具可以分步落地但架构上一定是一盘棋。2. 监控系统的五大核心部件一套功能完整的监控系统不管用的是Prometheus、Zabbix、夜莺还是商业产品拆开来看都是由几个固定模块组成的。把每个模块的职责和背后的设计逻辑理清楚你在选型和排障的时候会从容很多。2.1 数据采集指标的“输入端”采集层负责从被监控对象那里获取数据。这里的被监控对象包括服务器CPU、内存、磁盘、网络、中间件MySQL、Redis、Kafka、应用进程JVM指标、HTTP接口指标、甚至业务数据订单量、支付成功率。采集方式有主动和被动两种模型。主动模型是监控服务端主动去拉取目标暴露的指标典型代表就是Prometheus的exporter模式。被动模型是目标主动把数据推给监控端典型代表是Zabbix的agent主动上报、Telegraf推给InfluxDB等。两种模式没有绝对优劣主动拉的模型对被监控端的侵入性小天然适合容器和云环境的动态发现被动推的模型在网络隔离环境下更方便比如被监控对象在私网、无法暴露端口给监控端时主动推送往往是唯一选择。采集层设计中有一个核心指标叫“采集周期”。采集周期越短数据粒度越细越容易发现瞬时抖动但对存储和网络的压力越大。我自己的经验是基础设施类指标采集周期可以设15~30秒应用层指标建议10~15秒业务指标如果依赖关系型数据库至少也要1分钟一次。太细的采集除了增加成本和噪音对故障定位的边际收益非常有限。2.2 数据存储监控系统的“记忆体”采集上来的数据绝大部分是带时间戳的时序数据比如某个时间点某台机器的CPU使用率是多少。这类数据的特征是写入频率极高、数据量极大、几乎没有更新操作、查询时高度依赖时间范围。普通的关系型数据库MySQL、PostgreSQL在这种场景下表现很差插入和查询都扛不住更别说十几万条时间线同时写入。所以现在主流的监控系统底层几乎都用时序数据库来存储。开源领域最典型的是Prometheus自研的TSDB和VictoriaMetrics传统监控方案Zabbix也内置了自己优化的历史数据存储商业方案如InfluxDB企业版、TimescaleDB也各有拥趸。时序数据库的核心优化思路是压缩和聚合对历史数据做降精度采样比如保留30天原始数据更早的数据自动聚合成5分钟一个点再早的聚合成1小时一个点用存储空间换查询性能。理解了这个底层逻辑你就知道为什么某些监控平台的时间范围选择器只能精确保留最近多少天、再往前的数据要选“聚合视图”。这不是产品能力弱而是时序数据本身的特征决定了存储策略必须是分层的。2.3 告警引擎整个系统的“触发器”告警引擎要做三件事第一根据预设规则判断当前数据是否异常比如CPU使用率连续3次超过90%第二对告警事件做聚合和收敛避免同一故障触发几十条重复告警第三把最终需要触达人的告警通过不同渠道发出去比如钉钉、企业微信、短信、电话。告警引擎设计得好不好直接决定了监控系统是“帮手”还是“狼来了”。阈值设得太紧告警满天飞大家很快会对告警脱敏真正出问题的时候反而没人看了阈值设得太松告警失去意义。这里面的控制点包括持续多少个采集周期才触发、是否只在业务时段告警、同一规则在N分钟内最多触发几次、告警恢复后是否自动通知等。每个参数都值得反复调优而不是用默认值走天下。另外告警必须带上下文。一条合格的告警消息应该包含什么服务、什么指标、当前值是多少、阈值是多少、持续多久了、影响的业务范围是什么、有没有关联的日志查询链接。只发一句“CPU过高”的告警等于没发。2.4 可视化把数字变成一眼能看懂的信息很多人以为可视化就是“画图”其实可视化的核心价值是降低认知成本。一个设计良好的监控大屏或仪表盘应该让人一眼看出当前所有核心服务是否健康哪个模块的趋势在变差最近一小时的流量波动是否异常可视化设计有一些基本法则颜色只用红黄绿三档别用花里胡哨的渐变图表放在一起时时间轴要对齐否则没法对比重要指标做大数字卡片次要指标做趋势图表格只放需要精确值的场景一屏最好控制在9个图以内太多会变成“监控墙”看不过来就等于没看。工具层面Prometheus生态几乎默认搭配GrafanaZabbix自带图表能力夜莺也内置了仪表盘功能。2.5 自监控监控系统本身也会生病很多团队把监控搭起来之后就放心地认为万事大吉了直到某天出故障了才发现监控平台自己挂了而你又恰好没给监控服务器配告警。监控系统也是软件系统它同样会磁盘满、内存泄漏、进程崩溃。所以自监控不是可选项是必选项。比较常见的做法是专用一台或几台机器部署监控服务然后对监控服务的进程、端口、磁盘、自身数据库做外部探活探活结果发到一个独立的告警通道。这个通道绝对不能复用监控系统自己的报警链路否则监控挂了告警也发不出去形成闭环死亡。哪怕你的告警通道就用一个最简陋的、独立部署的脚本只要能保证“监控挂了能通知到你”就行。3. 监控数据的“语言”指标类型与设计模型理解监控系统的运作方式一定要先理解监控数据本身的结构。很多人用监控工具很久了却对“Counter”“Gauge”“Histogram”这些概念一知半解这会导致你在配置告警规则时犯下方向性错误。3.1 四种核心指标类型第一类是计数器Counter只增不减典型代表是请求总数、错误总数、CPU时间。机器重启会让计数器清零所以它反映的是“累计值”。你在Prometheus里查HTTP请求总量看到的就是一个Counter。用Counter配置告警通常不是直接看它的值而是看它的变化率比如“最近5分钟请求错误率超过5%”。第二类是仪表盘Gauge可增可减反映当前瞬间的状态值典型代表是CPU使用率、内存使用量、在线人数。Gauge的值本身直接反映健康状态告警规则大部分都是针对Gauge配置的。第三类是直方图Histogram用来统计数值的分布情况比如“接口响应时间分布在0-100ms的有多少次、100-200ms的有多少次”。通过直方图可以计算出百分位数P50、P99、P999这是衡量用户体验的关键指标。很多接口性能问题看平均值是看不出来的必须看P99因为平均值会被少数极慢的请求拉高也可能被大量极快的请求掩盖掉尾部慢请求。第四类是摘要Summary作用和Histogram类似但计算方式不同。Summary是在客户端直接计算好分位数推给监控端Histogram则是在服务端聚合计算。前者对客户端性能有侵入后者更灵活在Prometheus生态里Histogram是更主流的选择。3.2 标签与维度数据组织的灵魂时序数据除了“时间”和“值”还有一组非常重要的维度就是标签。比如一台服务器的监控指标至少带有“主机名”这个标签一个业务接口的QPS指标都带有“接口名”“服务名”“环境”这几个标签。标签的价值在于它决定了你能从哪些维度去切分和聚合数据。举个例子只有一个“订单量”指标你只能看到全局总量但如果这个指标带上了“渠道”“省份”“下单终端”三个标签你就能分析出“华东地区的App端订单量是否异常”“哪个渠道的转化率在下降”。监控体系设计阶段给指标规划好标签是性价比最高的投资之一。不过也要注意标签的基数不能太高一张表里如果有几百万个不同的标签组合查询性能会大幅下降这就是所谓的基数爆炸high cardinality。常见做法是高基数标签如用户ID、订单号不要直接作为指标标签而是放到日志或链路数据里。3.3 Windows性能监控到底在看什么热搜词里有“windows性能监控底层原理”这个值得展开讲一下。Windows系统的性能数据来源和Linux完全不同Linux下你通过/proc文件系统读一堆临时文件Windows下性能数据主要来自几个底层接口。最核心的是性能计数器Performance Counter由操作系统和各个应用通过注册表注册比如“\Processor(_Total)% Processor Time”表示总CPU使用率、“\Memory\Available MBytes”表示可用内存。监控工具通过PDHPerformance Data Helper接口或者WMIWindows Management Instrumentation来读取这些计数器。WMI的底层走的是CIMOM服务查询语法接近SQL在Windows上做自定义监控脚本时很常用但需要注意WMI的查询效率不高频繁查询大数据量时CPU开销比较大。再底层一点Windows还有ETWEvent Tracing for Windows这个高性能事件追踪机制很多复杂排查场景下会用到但普通监控场景不需要走到这一层。所以在Windows上做监控核心思路不是自己造采集器而是搞清楚你关注的对象提供了哪些性能计数器然后使用工具如Zabbix agent、Prometheus的windows_exporter去读取即可。Zabbix监控Windows GPU这个场景本质也是通过GPU驱动暴露的PerfCounter或者NVMLNVIDIA Management Library的命令行工具来采集数据底层逻辑没有变。3.4 进程存活监控除了心跳还有哪些办法很多同学提到进程监控第一反应就是“让进程往监控端发心跳”。心跳确实是最通用的手段但它有一个前提进程本身能跑起来并执行心跳逻辑。如果进程卡死在死循环里或者线程池耗尽无法响应新请求进程还活着心跳照发但服务实际上已经不可用了。比心跳更可靠的方式有几种。第一种是主动拨测从监控端发起真实的探测请求比如HTTP GET某个健康检查接口、尝试建立TCP连接、执行一次MySQL查询。这种方式最接近用户视角很多“假死”状态都能被拨测发现。第二种是端口探活用“TCP connect”去检查端口是否可连接但注意它只能证明“内核网络栈在处理”不能证明应用层健康所以更适合做辅助手段。第三种是资源关联指标比如进程活着但线程数异常升高、CPU持续100%、日志不再滚动这些指标组合起来也能反映进程是否“真的正常”。我给新手的建议是重要服务至少要部署“端口探活健康检查接口拨测关键日志关键字告警”三层探测单纯的心跳只能算兜底。4. 主流监控方案怎么选从Prometheus到Zabbix聊完概念来说说具体工具。很多新人在选型时纠结于“到底该学哪个监控系统”其实工具没有绝对的好坏只有适合不适合。下面这张对比表我按自己的实践体会把主流方案的核心差异列了出来。方案数据模型典型场景优势短板Prometheus指标Metric标签Label云原生、Kubernetes、微服务生态丰富、与服务发现天然契合、Pull模型安全可控存储单机容量有限高可用和长期存储需要额外组件Zabbix监控项Item触发器Trigger传统服务器、网络设备、虚拟机功能全面、支持SNMP/Agent多种协议、告警策略灵活配置偏重容器支持弱于PrometheusUI现代化程度一般Grafana主要作为可视化层多数据源统一展示图表美观、支持的数据源多本身不是采集和告警核心需搭配其他后端夜莺Nightingale指标标签国内团队运维场景、大规模监控国产开源、接入Prometheus指标生态、内置告警和权限管理社区和资料相对少于前两者云厂商监控如阿里云监控、腾讯云监控等类指标服务使用云服务器和云产品的团队开箱即用、不需要自建、与云产品深度打通锁定厂商、数据离开云平台不方便、费用随规模增加商业APM如SkyWalking、Pinpoint等APM类产品TraceMetricLog应用性能管理、微服务链路追踪链路追踪能力强大、对代码侵入小部署较重指标监控能力不如专用监控系统全面表格信息量比较大我展开讲讲几个常见选型场景。4.1 什么时候无脑选Prometheus如果你的公司或者项目已经上了Kubernetes或者正在向云原生架构迁移那基本上不用犹豫直接选Prometheus。原因有两个一是Kubernetes里服务实例会动态创建和销毁传统监控“手动加一台机器”的模式根本跟不上节奏Prometheus基于服务发现自动发现新目标的能力是刚需二是云原生生态里的中间件、应用框架几乎都默认暴露Prometheus格式的指标比如Kubelet、Istio、Nginx Ingress Controller、各类exporter接入成本极低。我自己在用的组合是Prometheus Grafana Alertmanager。Prometheus负责采集和存储指标Alertmanager负责告警路由和去重Grafana负责可视化。这套组合一旦跑顺日常加监控项只需要改一段配置然后reload非常灵活。4.2 传统机房场景Zabbix依然能打如果你的环境里主要是物理服务器、虚拟机还有大量网络设备和传统中间件而且网络环境复杂、跨网段、有大量内网设备不便对外暴露端口那Zabbix可能是更省心的选择。Zabbix的Agent主动上报模式天然适配“监控端在中心机房被监控设备分布在各子网”的拓扑。它还支持SNMP协议对交换机、路由器、防火墙、打印机这类网络设备和硬件设备监控特别方便。不少老牌企业和政企机房至今仍是Zabbix的主力用户不是因为他们不追求新潮而是Zabbix在这种环境下确实稳定好用。Zabbix监控Windows GPU这类场景社区也已经有比较成熟的模板通过调用nvidi-smi或者基于NVML的脚本采集指标再用自定义监控项传给Zabbix Server配置好图形和触发器就能跑起来。4.3 云原生与传统环境并存怎么破很多公司的实际情况是一部分老系统在虚拟机里跑一部分新服务已经容器化中间还夹杂着一些云上的RDS、Redis云实例。这种情况下我不建议强行把所有东西都塞进同一套监控系统里更务实的做法是分治——云产品用云厂商自带监控Kubernetes集群用Prometheus传统虚拟机用Zabbix然后把所有人的数据统一接入Grafana做汇总展示。Grafana在这里的价值不是充当监控后端而是作为一个“统一可视化和告警入口”。它支持同时配置Prometheus、Zabbix插件、云监控数据源等多个数据源把不同系统拉到一个面板上看告警也能统一配置转发到钉钉和企业微信。这样既不用推翻现有的存量监控又能让团队在一个界面里看到全局是成本最低的融合方案。4.4 用“最小成本”验证选型是否合适选型最大的忌讳是“调研三个月最后装了A工具又花三个月发现要换B工具”。我的建议是先明确一个最小的核心业务场景比如“监控5台服务器的CPU和内存服务挂了能收到告警”然后用候选工具各搭一个最小可用系统跑一周看体验。体验维度包括配置一台新机器的接入成本是多少想加一个自定义监控项需要几步告警配置是否灵活仪表盘是否够用出问题的时候查数据方不方便一周之后答案往往就清楚了。工具这东西看着官网文档再好用不如亲手跑一遍顺手。5. 监控落地实操从0到1搭建一套最小可用系统这个部分我想结合自己的实操经历讲一套最轻量的监控落地路径。假设的场景是你手上有几台Linux服务器跑的是一些Web服务和数据库手里没有现成的监控平台预算为零从零开始。5.1 第一步先列“必要监控项清单”动手装工具之前先花二十分钟把你要监控的东西列成一个清单。这个清单不需要完美但要覆盖五个维度至少保证最核心的部分。基础设施层面每台机器的CPU使用率、内存使用量、磁盘空间、磁盘IO、网络流量应用层面关键端口是否存活、健康检查接口是否可以访问、进程是否在运行中间件层面MySQL是否可以正常连接、主从延迟多少、Redis内存碎片率和命中率业务指标层面每天订单量和支付成功率的趋势告警层面哪些指标异常时需要通知到谁。建议用表格或Notion文档把上面的内容维护起来这个清单既是你的监控需求文档也是后续扩容监控项的Roadmap。我见过太多团队装了监控工具之后想加一项监控就临时去配置最后指标库混乱不堪告警规则全靠拍脑袋。先有清单再动工具事半功倍。5.2 第二步搭Prometheus Grafana的组合以Prometheus方案为例最小可用系统只需要三个组件。Prometheus Server负责指标抓取和存储exporter负责暴露指标Grafana负责展示和告警展示。我这里给一个最简安装示例操作系统假设是CentOS或Ubuntu直接使用二进制包安装就行不需要容器化先跑通再说。第一步在监控服务器上下载Prometheus压缩包解压后用默认配置启动。默认配置里有一个scrape_interval: 15s表示每15秒抓一次指标。然后修改prometheus.yml配置文件增加一个对当前机器自身的监控任务节点指标采集使用node_exporter。global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: prometheus static_configs: - targets: [localhost:9090] - job_name: node_exporter static_configs: - targets: [localhost:9100]第二步在被监控的服务器上启动node_exporter默认监听9100端口这个进程会把机器的CPU、内存、磁盘、网络等指标暴露成一个HTTP接口供Prometheus拉取。wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar xvf node_exporter-1.7.0.linux-amd64.tar.gz cd node_exporter-1.7.0.linux-amd64 nohup ./node_exporter 确认一下Prometheus能不能拉到数据浏览器访问http://监控服务器IP:9090/targets只要node_exporter那行显示UP就说明采集链路通了。第三步在监控服务器上装Grafana然后添加Prometheus数据源导入一个成熟的模板比如Node Exporter Full这个知名的dashboard ID 1860。导入之后服务器的基础资源图表就出来了。5.3 第三步配置第一条真正的告警规则很多人在Grafana里看到图表了就以为监控完成了这是最大的认知误区。没有告警的监控只是“事后诸葛”出故障还是靠用户反馈才知道。告警才是监控系统真正发挥价值的环节。告警规则可以在Prometheus里配置也可以直接用Grafana的告警功能。我推荐新手用Prometheus自带的告警规则配合Alertmanager使用因为这套链路更通用、更可控。先在Prometheus的配置文件中引入一条规则比如检测磁盘使用率是否超过85%。rule_files: - rules.ymlrules.yml的内容如下核心含义是最近5分钟内任意一台被监控机器的磁盘使用率超过85%就产生一条告警。for: 5m这个参数很关键表示持续5分钟都满足条件才触发避免磁盘使用率短暂抖动就误报。groups: - name: node_alerts rules: - alert: DiskUsageHigh expr: (1 - (node_filesystem_avail_bytes{mountpoint/} / node_filesystem_size_bytes{mountpoint/})) * 100 85 for: 5m labels: severity: warning annotations: summary: {{ $labels.instance }} 磁盘使用率超过85%然后部署Alertmanager配置一个最简单的webhook或者邮件通知渠道。如果你用的是钉钉群机器人那只需要拿到一个webhook地址在Alertmanager的配置里写一个receiver把告警消息以POST请求发到钉钉群即可。配置好之后重启Prometheus和Alertmanager故意把磁盘塞到85%以上验证一下告警能否正确到达手机。5.4 第四步给自己留一条“后路”——生成定期报告监控仪表盘是实时视图但你不可能每天24小时盯着屏幕。我推荐配置一个定期自动生成PDF监控报告的机制比如每周一早上把上一周的核心指标趋势汇总成一份报告发到团队邮箱或者企业微信群里。这样即使这个星期你没怎么看监控也能通过报告发现潜在趋势问题。Grafana本身就支持报告的生成和导出并且有插件可以直接渲染dashboard为PDF文件再配合定时任务发送。具体来说可以通过Grafana的Reporting功能设置每周一9点生成一份包含指定dashboard的PDF报告输出到指定邮箱。如果你不想引入额外的商业插件也可以直接用Grafana的渲染服务通过命令行调用grafana-reporter生成快照PDF再用cron定时发送。这块逻辑不难难的是坚持养成“定期看报告”的习惯很多人图省事省略了这步结果就是监控数据堆积成山没有任何人回顾。5.5 监控项接入的“脏活”交换机、虚拟机、Windows GPU说完最小链路再补充几个热搜里反复出现的高频场景。监控交换机比较简单核心是启动交换机的SNMP协议然后在Zabbix或者Prometheus生态里加一个SNMP exporter把SNMP的OID映射成可读的指标比如端口流量、丢包率、CPU温度、电源状态。需要注意不同厂商交换机的OID表有差异华为、思科、H3C各自不同不要指望一套模板通吃一定先用snmpwalk工具去实际探测一下OID返回的数据。监控虚拟机的核心注意点是虚拟机里的CPU使用率指标是“虚拟机内部视角”宿主机上的CPU使用率是“物理机视角”两者不能互相替代。如果你同时监控宿主机和虚拟机要多注意云厂商或者虚拟化平台提供的Agent采集的CPU指标往往是“按配额计算的使用率”而不是物理CPU的绝对使用率看告警阈值时要单独调整。Zabbix监控Windows GPU的场景我在前面也提到了一般用NVIDIA官方提供的nvidia-smi命令配合Zabbix自定义监控项或者用Windows性能计数器里GPU相关计数器。GPU温度超过90度、显存占用持续100%、GPU利用率持续为0但有业务在跑这三种情况都应该配置告警尤其是最后一种“GPU空闲但业务在等待”往往比温度问题更难排查。6. 监控系统实战踩坑记录与排查速查监控系统本身是个软件系统装了并不等于能跑好。结合我和身边同行的经历这里整理一批高频问题每个都有完整的现象和排查思路。6.1 时间不同步一切异常的元凶表现监控面板上的数据曲线出现锯齿状断裂Prometheus告警偶尔触发偶尔不触发日志和指标的时间对不上。原因被监控机器和监控服务器的时间不同步。Prometheus抓取数据时用被监控端的当前时间打标签如果被监控端时间比监控端慢了几分钟数据就会“迟到”而告警规则恰好按时间窗口计算结果就是误报漏报一起来。解决办法全环境统一配置NTP时间同步在Prometheus服务器和所有被监控节点上安装chrony或ntpd。更极致一点用systemd-timesyncd也可以关键是确保时间偏差不超过秒级。这个问题新手最容易忽略但一旦出现会让你怀疑监控工具本身有问题。6.2 告警风暴一晚上被轰炸到关停告警表现某个底层服务抖动依赖它的几十个服务同时产生告警一晚上收到几百条消息群里直接被刷屏。第二天大家心照不宣地把告警全部静音监控系统变成了摆设。原因告警规则之间没有做依赖关系设计也没有设置聚合和收敛。底层数据库挂了上层所有接口都会报超时但每一层的告警都是独立的于是连锁放大。解决办法第一给告警设置依赖关系底层的故障告警可以“抑制”上层告警Alertmanager的inhibit_rules就是干这个的第二给同类的告警做分组聚合比如同一个服务名下的告警10分钟内只发一条汇总通知第三告警规则里加上for: 5m这种延迟触发条件避免瞬时抖动直接触发。6.3 监控数据有缺口曲线断断续续表现某些时间段的监控曲线是断的查Prometheus的Target状态发现偶尔会报“context deadline exceeded”或者“connection refused”。原因多数是网络不稳定、被监控端负载过高导致探活超时、采集器自身OOM。还有一个隐蔽原因是被监控端的exporter并发能力不足当同一台机器被两个Prometheus同时拉取或者拉取间隔太短exporter会直接拒绝。解决办法采集超时时间调大一点比如将scrape_timeout从10秒调到30秒保证两台Prometheus不会重复抓取同一份exporter被监控端负载过高的机器考虑独立部署exporter进程并调整采集频率。另外给Prometheus增加合理的本地存储保留时间比如90天同时对历史数据启用压缩降采样避免查询时的长跨度数据转圈问题。6.4 海康威视、大华监控设备的常见坑视频监控设备和传统IT监控不太一样主要涉及的是摄像头、NVR和流媒体平台这个领域常见的坑我也列几个。第一个坑是摄像头时间不准。海康摄像头时间不准会直接影响录像回放的定位不是“跳秒”小问题。解决办法是在NVR上设置以NVR时间为准开启NTP校时并且保证NVR自身时间准确。如果你有成百上千个摄像头强烈建议建一个内网NTP服务器统一给所有摄像机设备校时。第二个坑是浏览器访问问题。海康威视的Web管理界面在部分浏览器下插件加载异常尤其是新版Chrome、Edge默认阻止NPAPI插件。老版本的操作界面依赖Safari或者IE模式。如今比较可靠的办法是使用海康官方的iVMS-4200客户端或者通过Web Service接口直接调取RTSP视频流做集成不要依赖浏览器插件。第三个坑是视频推送设置。很多场景下需要将门店的监控汇总到总部常见做法是在NVR上配置“平台接入”或“流媒体推送”把RTSP流推到总部的流媒体服务再由总部网页或客户端统一查看。这个链路里最容易出问题的是带宽如果几十路视频同时推到总部店铺上行的带宽很容易被占满码流需要压低分辨率或者使用子码流传输具体要在“视频编码”设置里调整码率上限比如主码流限制到2048Kbps、子码流限制到512Kbps。6.5 FTP、MQTT、嵌入式设备等特殊场景怎么接监控对象千奇百怪但思路是一致的就是“找到对象能暴露出来的数据接口”。FTP监控重点监控FTP服务是否可登录、目录是否可以列出、上传下载是否成功最简单的方式是写一个拨测脚本定时执行FTP登录和上传测试然后把结果以文本形式暴露给Prometheus的textfile collector。MQTT和智能家居平台监控在MQTT Broker里订阅各种主题通过解析消息中的设备状态字段来判断设备是否在线再自定义指标暴露出来。嵌入式环境监控重点是资源受限不适合跑完整的监控Agent建议使用轻量级的采集器或者由嵌入式设备主动通过MQTT上报运行数据到边缘网关再转发到监控平台。这些场景的共同经验是不要试图让所有设备都接入同一个监控协议先从业务需求出发定义好“这个设备哪些状态需要我看”再选一个轻量的数据通路把它传出来比盲目追求统一标准要实在得多。6.6 人员行为分析等视频监控AI方向现在的视频监控早就不是“录像回放”这么简单了。基于监控视频做人员行为检测、多模态行为识别是安防行业的热点方向。通过目标检测、姿态估计、异常行为识别等模型可以自动分析出视频中是否有人员聚集、奔跑、跌倒、翻越等异常行为并联动告警系统在事件发生时立即通知安保人员。我在实际项目中的经验是这类系统性能瓶颈往往不在算法模型本身而在视频流的接入和预处理环节。一路720P视频如果按25fps解码占用的CPU资源是相当可观的更不要提一个边缘盒子要处理几十路视频流。落地时优先考虑用GPU或者专用的AI加速卡做解码和推理同时降低AI分析视频流的帧率比如每秒分析2~5帧而不是全帧率可以在准确率和成本之间取得很好的平衡。至于模型训练需要准备好足够多的现场有效数据样本做精细化标注离线环境下的模型迭代效率决定了这个项目的上限。7. 最后再分享几个日常可用的小建议监控这套东西真正值钱的地方不在工具本身而在于你有没有一套清晰的体系认知。我在实际搭建和维护监控系统的过程中有几点体会特别深。第一监控项不是越多越好。指标数量膨胀到一定程度维护成本会反噬价值。每个指标在上线前都先问一句这个指标异常的时候我会为此做点什么如果答案是“不会”就不要接进来。第二告警要有分级。P0级是一定要立即处理并可能影响线上业务的通知到值班人手机P1级是需要尽快处理但不影响核心业务的通知到技术群P2级是可以工作日处理的走日报汇总就行。没有分级的告警体系早晚会被噪音摧毁。第三定期做“告警演练”。挑一个周末人为制造故障比如停掉一个中间件、把磁盘塞满看看监控能不能发现、告警能不能到达正确的人、值班同学能不能快速定位。演练过之后你才知道你的监控系统里哪些环节是纸糊的。第四不要忘了给监控配置保留策略。时序数据一直攒着不清理存储迟早爆掉。建议原始数据最少保留30天聚合数据保留6~12个月超过一年的数据除非有合规要求否则可以直接归档清空。我见过太多团队花了一周搭起来监控然后放任自流。其实监控系统是个需要持续维护的对象每新增一个服务、每调整一次架构都应该同步更新监控项和告警规则。把这个习惯坚持下来你会发现自己从“救火队员”变成了“预防医生”晚上能睡踏实觉这大概就是做监控最大的回报了。
返回列表