使用zabbix对服务器主动运维已经好几个月,在几个月的使用过程中,笔者发现了zabbix的很多优点,也看到了它的一些不足,这些不足甚至导致在一些极端情况下使运维工作出现问题。下面我将遇到的问题及解决方法分享给大家,希望在你遇到相同问题时有一个解决方案。
监控服务器down机不报警
当监控服务器突然down掉时,在我对每台服务器都设置了内存、流量等报警阀值的情况下,zabbix并没有触发报警。
机器down是很严重的运维问题,down了还不报警,如果没及时发现,这就上升到饭碗问题的高度。
定位问题
如果你了解zabbix的运行机制,可以很快的定位问题原因。这是因为zabbix使用的是c/s模式,每台监控目标机都需要安装agent,zabbix服务器采用轮询的方式从监控目标机的agent获取数据。但如果目标机down了,目标机的agent通常也无法工作,就导致了zabbix采集不到数据。而zabbix有个机制,对于自定义项(item),如果采集不到agent的值,就保留最后一次获得的值。试想如果目标机down之前的采集值是正常的,那不报警的情况就发生了,因为采信值一直使用down机前的数据,不会更新,直到再次成功采集到目标机的值。
处理方法
解决问题的方法就是增加一个目标机是否存活的检测,并且不能依赖于agent来检测,之前说过如果目标机down掉,就再也采集不到agent的值。因为管理的机器上百台,还是必须用zabbix来做这事,一番查找,zabbix提供了一个“简单检查”(simple check)功能,该功能独立于agent作业,所以即使目标机downb,依然可以进行检测。
判断主机是否存活,最通常的方式是使用ping命令来检测,但这个方法有一定局限性,对于禁ping的机器无法检测,但在大多数场景还是适用的,我们先用用,看看效果。
具体操作
要实现这个功能,需要在zabbix服务器安装一款名为fping的软件.
#下载软件
wget http://www.fping.org/dist/fping-3.10.tar.gz
#软件解压
tar xzvf fping-3.10.tar.gz
#进入软件目录,配置安装软件
./configure --prefix=/usr/local/fping/
make && make install
#配置zabbix_server.conf
#在文件末尾增加一行配置
FpingLocation=/usr/local/fping/sbin/fping
#重启zabbix agent
#centos 6
service zabbix_agentd restart
#centos 7
systemctl restart zabbix_agentd
#设置fping权限,fping命令是由zabbix进程来调用。但fping安装后默认是root.root权限,需要调整。
cd /usr/local/fping/sbin/
chown root:zabbix fping
chmod 4710 fping
配置完成后,前端页面会自动增加fping相关的模板。
将其链接到你正在使用中的模板即可。
添加好以后,你可以在模板的监控项中发现自动添加了3个监控项
顾名思义,ICMP loss表示丢包率,ICMP ping表示是否可PING通,ICMP response time表示响应时间。
这里我们主要使用ICMP ping,监控项有了,接下来就是触发器设置,根据监控的值来决定是否触发并报警。这个触发器在安装fping时也自动帮我们设置好了。
简单解释一下表达式,以Ping不可达触发器为例。
{centos6.x monitor for linux:agent.ping.last()}<>1
,前面都是固定格式,我们只看ping.last()<>1, last表示最后一次监控项获取的结果,为1表示主机可达,不为1表示主机不可达(PING不通),所以意思就是当主机不可达时,触发报警。
通过以上设置后,我们就可以不再依赖agent,由zabbix server直接监控目标机的通断状态,其实就是通过fping命令轮询的发出指令。即使目标机down机,也能够立即获取监控项并触发报警。
另一种独立监控目标机的方法
如前节所提,此方法对禁ping的目标机是没有办法监控的,我们需要另辟蹊径。
我们知道目标机一定会向公众或特定人群提供服务,提供服务就需要开放端口(TCP或UDP)。有了开放端口,我们就好办事情了,只需监控目标机的开放端口,测试其端口是否打开来判断主机是否存活。
简单检查(simple check)
zabbix提供了一项名为简单检查的功能可以实现我们的目标。
在新建监控项中,类型选择简单检查,键值设置为net.tcp.service[tcp,,10410]
,这个表达式的意思是“使用TCP协议,开放端口为10410",其它设置使用默认即可。
设置好以后,zabbix server每30秒会以轮询的方式向模板中的所有主机的10410端口发送检测,判断端口是否已经打开。
有了监控项,我们接下来设置触发器,即如果监测端口未打开,需要立即报警。
核心设置还是表达式,和前面提到的表达式类似,当last的值为0时,表示端口未正常打开,就要触发报警。
这种方式是以监控端口的状态来判断主机通断,一般防火墙策略不会阻止服务端口的通信。
利用以上两种方式,应该可以绝大多数的监控场景,至少我所监控的场景已能够完全满足。希望能带给大家一些帮助,如果你有更好的方法,也欢迎一起交流。