哥们儿,最近这段时间,我们生产环境的监控系统可把我给折腾惨了。就是那个普罗米修斯4,版本号5.50的,前阵子出幺蛾子了,真是头大。事情是这样的,那天早上我刚到公司,屁股还没坐热,就看到我们公司的报警群里跟过年放鞭炮似的,噼里啪响个不停。平时偶尔有那么一两个报警我都紧张半天,今天这阵势,感觉整个服务都要塌了。
本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu
我赶紧打开我们用的Grafana面板,想看看究竟是哪里出了问题。结果一看,好家伙,平时那些绿油油的监控图,好多都断崖式下跌,或者直接显示“No Data”。服务一看就挂了一大片,但凭我的直觉,不可能这么多服务一下子全挂,肯定是监控系统本身出了问题。
发现问题,初步排查
我心想这不对劲。第一反应就是,是不是网络又抽风了?我们这网络时不时就耍一下脾气。赶紧SSH到我的Prometheus服务器上,先敲了个`top`命令,看看CPU、内存啥的,是不是跑满了。结果一看,都挺正常的,没啥异常波动,内存和CPU使用率都还挺低。
那既然Prometheus服务器本身资源没问题,我就得去看看Prometheus自己内部的状态了。我打开浏览器,输入Prometheus的Web UI地址,进去就直奔“Targets”页面。这一进去,哇靠,密密麻麻的红叉叉!一大片“down”掉的targets,眼睛都快看花了。这下心里有谱了,八成是Prometheus抓取数据出问题了。
深入调查,定位真凶
我点开几个显示“down”的target,想看看具体的错误信息。有些显示的是“connection refused”,有些是“context deadline exceeded”。这两种错误,一个说明Prometheus连不上目标端口,另一个说是连接超时了。妈的,这两种错误混在一起,搞得我更有点摸不着头脑了。
我先挑了一个“connection refused”的target,这个我知道,它跑在一台单独的机器上。我赶紧登录那台机器,敲了个`systemctl status node_exporter`,结果显示“active (running)”,exporter服务好好的在那儿跑着。那我又想,是不是防火墙把端口挡住了?赶紧用`firewall-cmd --list-all`命令查了查,端口是开着的,没被防火墙拦。这就奇了怪了。
为了确认是不是真的连不上,我回到Prometheus服务器,直接用`curl`命令去访问那个exporter的端口,比如`curl http://target-ip:9100/metrics`。结果?依然是“connection refused”!这下我才明白,不是目标机器防火墙的问题,也不是exporter没跑起来,是Prometheus这边的机器根本就连不上那台目标机器的端口。
问题难道是网络连通性?可我ping了一下,又是通的。这就把我搞蒙了。我决定换个思路,不盯着单个target看了,直接看Prometheus自己的日志。我赶紧在Prometheus服务器上敲`journalctl -u * -f`,把Prometheus的日志拉出来,刷刷刷,屏幕上像瀑布一样涌出大量的错误信息。我眼疾手快地往上翻,就看到好多这样的日志:`level=warn msg="Append failed" err="写入WAL文件失败"`。哎哟卧槽,WAL文件写入失败?这可是大事儿!Prometheus的数据存储机制,WAL文件是核心!
我心里咯噔一下,赶紧敲了个`df -h`命令,查看服务器的磁盘空间使用情况。好家伙!根目录的文件系统快满了!只剩下几个G的空间了,Prometheus的WAL文件和数据文件占了一大半。这不就是因为磁盘空间不足,导致Prometheus写不了WAL文件,然后就没法正常抓取和存储数据了嘛
这下什么都明白了!怪不得那么多target都down了,Prometheus自己都没地方存数据了,它就是抓过来也没用。之前看到的那些“connection refused”和“context deadline exceeded”的错误,可能都只是因为Prometheus内部出问题,忙不过来导致的假象,而不是真正的网络或服务问题。
解决问题,总结经验
找到问题就好办了。我赶紧清理了一下服务器上一些老旧的日志文件,还有一些以前没用的备份啥的,一下子就腾出来了几十个G的空间。空间有了,我赶紧重启了Prometheus服务:`systemctl restart *`。
服务重启之后,我立刻刷新Prometheus的“Targets”页面,激动地看着,果然,那些红叉叉们一个接一个地变成了绿色的“up”!然后我赶紧去Grafana看,数据也慢慢恢复了,那些断崖式的图表又开始有了数据,重新跑了起来。
不过这事儿还没算完,这回是老旧日志太多导致的,下次要是Prometheus自己的数据长太快又把磁盘空间占满了咋办?我得给他想个一劳永逸的办法。我们运维之前就给Prometheus专门挂了一块挺大的数据盘。我赶紧动手,把Prometheus的数据目录改到了那块大盘上,编辑Prometheus的systemd服务文件,把启动参数里的`*`指向了新的路径。
改完配置,我又重启了一遍Prometheus,确认路径是对的,服务也正常跑起来了。然后我把旧路径下的那些数据文件删了,这下彻底踏实了,短期内不用担心磁盘空间再被它吃光了。
这回的经历真是把我折腾得够呛,但也算长了个教训。以前没太注意Prometheus的数据增长速度,以为定期清理就行,没想到它这么能吃。所以说,以后监控系统自己也得被监控起来,特别是磁盘IO、空间这些关键指标。我已经加了个报警规则,一旦Prometheus服务器的磁盘使用率超过80%,就立马给我吼一嗓子,不能再犯这种低级错误了。
排查问题的时候,真的不能慌。先看表面现象,但更重要的是要从服务本身、日志、资源消耗一步步往下挖。很多时候表面现象会骗人,得看本质。这回如果我只盯着那些“connection refused”去一个个排查网络或者exporter,估计得绕一大圈才能发现真正的罪魁祸首是磁盘满了。日志,永远是排查问题的好帮手,关键时候能救命!
就这么点事儿,折腾了我大半天。不过总算搞定了,也算有点收获。