一.背景
工作中有几个应用,分别使用十几台机器,然后这些机器或者机器上的进程偶尔会down掉,从而影响使用,而公司自带的监控体量比较大,用起来没办法作到定制而且加载的时候还比较慢,在此条件下,我选择使用zabbix来做一次简单的定制化监控
感觉zabbix使用起来不难,在网上找一下技术博客,然后就阔以进行安装使用了,真正需要考虑的是阈值的设置以及zabbix目前已有的功能是否能满足当前业务的需求(本人比较懒,不是必须的情况下不想自己写脚本)
二、zabbix使用环境以及zabbix安装
服务器
这里简单的写下(ps:不是实际上的服务器域名):
http://zabbix-server.com:zabbix服务器
zabbix-agent01.com: agent端1
zabbix-agent02.com: agent端2
安装
1.安装php
安装下载源
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
安装PHP7(php版本低可能造成其他问题)
yum install php70w.x86_64 php70w-cli.x86_64 php70w-common.x86_64 php70w-gd.x86_64 php70w-ldap.x86_64 php70w-mbstring.x86_64 php70w-mcrypt.x86_64 php70w-mysql.x86_64 php70w-pdo.x86_64
yum install php70w-devel
当执行php -v 不报错时,即为php安装成功
2.安装zabbix
安装zabbix源
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
下载zabbix-server包
yum -y install zabbix-server-mysql zabbix-web-mysql
ps:当出现问题的时候google下,我在批量安装的时候也出现各种各样的错误,比方说rpm-db出问题、yum无法使用、zabbix源出问题等,google上都有对应的处理结果的
3.安装mariadb(mysql)
yum install -y mariadb-server
为root用户设置密码
#mysql
>set password for 'root'@'localhost' = password('root');
创建zabbix数据库并导入zabbix的一些表(用户是zabbix,密码是Pass123!)
>create database zabbix charset 'utf8';
>grant all privileges on zabbix.* to zabbix@localhost identified by 'Pass123!';
>flush privileges;
导入表结构
#cd /usr/share/doc/zabbix-server-mysql-3.4.15/
#zcat create.sql.gz | mysql -uzabbix -pPass123! -D zabbix
ps:在实际应用中,sql所在的目录和你安装的zabbix版本有关系,勿直接复制使用以上命令
查看是否导入成功
mysql> show tables from zabbix;
mysql>select count(*) tables,table_schema from information_schema.tables where table_schema ="zabbix";
4.安装apache(也可以使用nginx)
安装
yum install -y httpd
编辑Zabbix前端的PHP配置
#vim /etc/httpd/conf.d/zabbix.conf
添加php_value date.timezone Asia/Shanghai , 如下图所示
启动apache服务
service httpd start
5.修改zabbix配置文件并启动zabbix服务
修改zabbix_server.conf配置文件
[root@zabbix ~]#vim /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=localhost
DBName=zabbix
DBUser=zabbix (用户名)
DBPassword=Pass123! (密码)
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts //zabbix默认脚本的执行目录
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
ps:需要注意的是DBHost、DBName、DBUser、DBPassword,我是用的另外一台服务器单独作为DB,所以这里DBHost填写的该服务器的地址,如果是都在一台机器上,直接按照上面写localhost即可
给/etc/zabbix/zabbix_server.conf文件授权,因为执行的时候是用zabbix用户执行的
#chmod -R 755 /etc/zabbix/zabbix_server.conf
启动Zabbix Server服务
#service zabbix-server start
执行到这里,zabbix服务端就已经设置好了.访问,ip/zabbix/ 即可,出现如下所示表示安装成功,然后在点击Next的时候,可能会出现文件无法创建的问题,自己在对应目录手动创建下,然后给775权限即可.默认账号密码是:admin:zabbix
三、zabbix-agent安装
光有服务端没用,我们还需要在要监控的服务器上安装zabbix-agent客户端,然后配置才行
1.安装zabbix下载源(7)
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch.rpm
安装zabbix下载源(6)
rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/6/x86_64/zabbix-release-3.4-1.el6.noarch.rpm
2.下载zabbix-agent
yum -y install zabbix-agent
就将/etc/yum.repo.d/zabbix.repo中的源都从6换成7,参考该解决办法
3.修改zabbix客户端的配置文件( /etc/zabbix/zabbix_agentd.conf )
server 以及severActive填写 http://zabbix-server.com(zabbix服务端的ip,这里以域名代替),HostnameItem填写http://zabbix-agent01.com/zabbix-agent02.com (填写服务器的域名)即可.
4.给配置文件授权并开启zabbix-agent服务
# chmod 775 /etc/zabbix/zabbix_agentd.conf //授权
# service zabbix-agent start //开启zabbix-agent服务
四、zabbix设置监控
上面的设置都比较简单,在网上找篇技术博客就能上手了.
下面说下实际的需求:
1.每个应用都有几台服务器,然后每个应用上的服务都是一样的,监控一样的内容,然后达到了阈值后就钉钉报警
2.监控进程、监控服务器上的日志
3.其中一个应用需要通过执行某个脚本,通过判断脚本的执行结果来判断是否报警
4.当报警内容没解决的时候,工作时间想每20min重复报警一次,非工作时间不想重复报警(因为非工作时间本来就没人看)
...................................
解决方案:
FOR 1:
1.在每台主机上安装zabbix-agent客户端,具体怎么安装见上面的教程
2.在zabbix的web端页面中建几个主机分组:应用A、应用B、应用C...
3.添加主机,将zabbix-agent客户端都添加到zabbix服务端中,并根据应用的不同划分到不同的分组(之后在设置action的时候会用到)
4.根据每个应用的实际需求来新增模板(模板适合有多个机器都需要一样的环境),然后在模板中选择机器,选择好了以后,模板会应用到你选择的机器中
FOR 2:
1.监控进程使用的键值对是proc.num[,root,all,xx],第一个参数建议不填写,第二个参数是进程的启动用户(貌似只是简单的根据grep 用户筛选),第三个参数是进程的状态,第四个参数会根据值进行筛选(支持正则表达式比方说(a|b).*master).
2.监控服务器上的日志需要使用zabbix客户端(主动式),需要用到log表达式,这个我还在测试中
FOR 3:
需要自定义监控来实现该功能,在zabbix-agent端设置定义好的键值对,然后在zabbix服务端进行引用即可,具体的可百度或google,不难,这里只是提供思路
FOR 4:
实现时的第一反映是写脚本来实现该功能,然后实现起来也比较麻烦,当实现完成了以后,突然发现Action部分可以根据时间段来进行设置(大概我最开始的时候眼瞎了)。实现该功能可以考虑针对主机群组里面的监控项设置两个Action,一个是工作日每20min报警一次,一个是非工作日只报警一次.
................................
五、FAQ
Q:脚本一直无法被触发,已在zabbix服务端测试脚本可以使用
A:该问题一般是权限问题导致的:
1.检查脚本文件的权限,看zabbix用户是否可以执行
2.检查用户的权限,报警会通过某个用户发消息,检查该用户的权限(无特殊要求可将该用户设置为管理员权限)
Q:当一个监控项已经触发报警时,我停掉了该主机的该项监控项,但是报警依旧还是继续....
A:还在排查中,有同学遇到过的话帮忙解答下
Q:当报警没解决时,到了非工作时间段,还是一直发报警信息
A:目前认为触发action的时间筛选是根据触发报警的时间,而不是根据当前时间
Q:监控的服务器出于未知原因导致当监控的进程down掉后,zabbix-agent进程也会down掉,从而造成无法有效的监控,报警信息只是zabbix-agent down掉了
A:在该服务器上写了一个一分钟执行一次的crontab表达式,当监控到zabbix-agent down的时候,重启zabbi-agent服务....
一些使用中的小坑:
1:zabbix模板中去掉某个主机后,该模板的监控项和触发器依然还会留在那个主机上,但是不再是挂在模板下了,而是单独的存在了....(会造成一直报警)【解决:从模板中点击取消链接并清理.....】
2.当action触发后,再修改action,zabbix还是依然使用的老的action(不明所以...)
3.zabbix执行脚本的超时时间需要自己设置,不然很容易报超时的问题(在动作日志中看),但是实际上脚本还是执行成功了.
六、其他
之后会陆续补充上一些实际应用中的需求...
思考:
1.需要监控jenkins上执行的任务,然后进行报警,jenkins已有的邮件服务不如钉钉报警(钉钉工作时一直都是开的)
2.针对进程做一些服务自愈的过程,比方说执行重启脚本或者清理脚本等...