去年由于时间精力和人员有限,我在线上服务器搭建了一个zabbix server 2.0对所有服务器作了基本的监控。并没有根据业务实际情况作业务层面上的监控,以及没有添加zabbix server和zabbix proxy和zabbix agent的启动脚本。去年主要是代码上线发布这一块太折腾人了,一次代码上线发布涉及多个部门,包括策划,程序和测试,而且各个部门相互依赖,加班都得一起耗在那。3月份我花了大力气和策划,程序和测试部门一起商量规范了上线流程,并利用开源软件Rundeck+Shell脚本的方式搭建了内部测试平台和代码正式上线平台。总算不用去年那样苦逼了。4月份的工作重点主要是调整监控,包括检查各个区服的配置文件语法,各个区服的模拟登陆监控,BI相关的redis key监控等等。好了,闲话不多说,下面主要从几个方面谈谈zabbix。
一 什么是zabbix?
zabbix一个开源企业级的监控工具,它能够对成千上万的服务器,虚拟机和网络设备进行实时监控,它将收集到的数据存入到数据库中以进行数据分析。它提供丰富的图形界面显示功能,包括图表,网络拓扑图等。我选择zabbix最大的理由在于zabbix同时也是一个分布式的监控工具,利用zabbix的proxy功能可以将不同地点的服务器监控数据汇集到一起进行分析。zabbix的官方网站地址是http://www.zabbix.com/ 。可以通过官方网站了解更多信息。
二 zabbix的功能和特性
1.监控所有信息
使用zabbix可以很容易的监控服务器,网络设备,和各种应用,并收集准确的统计和性能数据。
利用zabbix agent可以很容易的监控到各种设备的各项性能指标,包括CPU,内存,磁盘和进程等信息。对于没法安装agent的设备,可以利用snmp agent进行监控,对于无法安装zabbix agent和snmp agent的设备可以利用zabbix的agentless monitoring功能监控FTP,HTTP,SMTP,DNS等这样的标准服务。
zabbix支持自定义监控脚本,可以用shell,python或perl编写适合自身业务的监控脚本。
使用zabbix可以监控多种数据库的详细信息,包括MySQL,MongoDB,Oracle,Microsoft SQL Server等。
使用zabbix的Java网关可以监控Tomcat,JBoss等Java应用服务器。
通过zabbix内置的web监控支持,可以监控外部网站,内部网站等的可用性,响应时间和下载速度等
如果被监控的硬件设备支持IPMI访问,利用zabbix可以收集温度,风扇速度等数据。此外,zabbix可以利用IPMI命令远程开启或关闭设备。
2.zabbix是一个企业级的监控工具
小到几十台,大到几万台设备,zabbix都有很好的性能表现。
利用zabbix proxy可以达到分布式监控的目的,可以集中监控多个位置的服务器。
zabbix可以和其他一些自动化系统配置管理工具如puppet,chef等整合,并且可以通过LDAP或SSO进行登录认证。
3.zabbix有很强大的自动发现功能
当需要监控的服务器数量太多时,手动添加管理太麻烦了,zabbix提供三种方式来自动发现被管理设备和作出相应的监控管理操作。
1)网络发现功能
zabbix可以根据设定的发现规则定期的扫描外部服务或zabbix agent(被动监控模式)并作出一些预先定义好的动作,比如发送通知给指定用户,添加或删除主机监控,启用或停止主机监控,添加到一个分组或从一个分组中移除或执行远程脚本等操作。
2)低级发现功能
利用zabbix的低级发现功能,zabbix可以自动的为需要监控的设备创建监控项目,创建触发器,和创建图标等。
3)zabbix agent的自动注册功能
只要一台设备上安装了zabbix agent并配置正确,zabbix server可以自动的监控这台设备,而不用手动去添加任何监控项目。
4.zabbix有丰富的API
通过zabbix的API可以和各种外部系统进行整合,如Puppet,SaltStack,JIRA等。还可以进行二次开发。
三 zabbix 2.2.3的新特性
1.增大最大缓存大小到8GB。
2.更有效的snmp监控
3.更多信息可以参考https://www.zabbix.com/documentation/2.2/manual/introduction/whatsnew223
http://www.zabbix.com/rn2.2.3.php
四 升级步骤
1.升级前注意事项
php版本最低要求从5.1.6提高到5.3.0。目前线上采用5.4
mysql版本最低要求从5.0.0提高到5.0.3。
使用php的mysqli扩展替代默认的mysql扩展,php的mysqli扩展信息可以参考
http://www.php.net/manual/en/set.mysqlinfo.php
需要安装php的gettext扩展用于本地化语言翻译。
2.停掉zabbi server
killall zabbix_server
3.备份zabbix数据库
mysqldump -uroot zabbix -p > zabbix_backup.sql
4.备份zabbix server配置文件,php代码文件和zabbix server程序
cp -rf /var/www/html/zabbix /var/www/html/zabbix_backup
cp zabbix_server.conf zabbix_server.conf.bak
cp zabbix_server zabbix_server.bak
5.安装新的zabbix server
yum install mysql mysql-devel libssh2 libssh2-devel php php-gd gd gcc mysql-libs curl-devel net-snmp net-snmp-libs net-snmp-devel php-mysql php-mbstring php-bcmath php-xmlwriter php-xmlreader php-xml php-devl php-pear openldap-devel
./configure --prefix=/usr/local/zabbix/ --enable-server --enable-proxy --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-ssh2 --with-ldap
make install 这里需要root权限
6.更改zabbix server的配置文件
主要更改以下这些参数如:
LogFile=/tmp/zabbix_server.log
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
7.安装zabbix的web界面
配置nginx虚拟主机
server
{
listen 80;
server_name zabbix.abc.com;
access_log /data/app_data/nginx/logs/zabbix.log main;
client_max_body_size 5m;
autoindex off;
location / {
root /var/www/html/zabbix;
index index.php;
autoindex off;
}
location ~ \.php$ {
root /var/www/html/zabbix;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
}
进入到zabbix-2.2.3代码目录
cd zabbix-2.2.3/
cp -rf frontends/php/ /var/www/html/zabbix/
编辑php.ini文件添加以下内容,这些参数在安装web界面的时候会有提示信息,根据提示信息更改配置就行。
memory_limit = 128M
post_max_size = 16M
upload_max_filesize=2M
max_execution_time = 300
max_input_time = 300
session.auto_start = 0
详细安装信息可以参看官方文档
https://www.zabbix.com/documentation/2.2/manual/installation/install
8.添加zabbix server的启动脚本
编写zabbix相关的启动脚本最好的方法就是去更改zabbix的官方rpm或deb包安装后的启动脚本如/etc/init.d/zabbix-server,/etc/init.d/zabbix-agent,/etc/init.d/zabbix-proxy。然后根据自身编译安装的zabbix server或agent的程序路径和配置文件路径去更改启动脚本就行。
如下zabbix-server
#!/bin/sh # # chkconfig: - 85 15 # description: Zabbix server daemon # ### BEGIN INIT INFO # Provides: zabbix-server # Required-Start: $local_fs $network # Required-Stop: $local_fs $network # Default-Start: # Default-Stop: 0 1 2 3 4 5 6 # Short-Description: Start and stop Zabbix server # Description: Zabbix server daemon ### END INIT INFO # Source function library. . /etc/rc.d/init.d/functions exec=/usr/local/zabbix/sbin/zabbix_server prog=${exec##*/} syscf=${0##*/} lockfile=/var/lock/subsys/$syscf [ -f /etc/sysconfig/$syscf ] && . /etc/sysconfig/$syscf config=${CFG_FILE:-/usr/local/zabbix/etc/zabbix_server.conf} if [ ! -f $config ]; then echo "Not starting Zabbix server: Config file $config not found!" echo "Check /etc/sysconfig/$syscf" exit 3 fi pidfile=$(grep -e "^PidFile=.*$" $config | cut -d= -f2) param="-c $config" start() { echo -n $"Starting Zabbix server: " daemon --user zabbix --pidfile "$pidfile" $exec $param rv=$? echo [ $rv -eq 0 ] && touch $lockfile return $rv } stop() { echo -n $"Shutting down Zabbix server: " killproc -p "$pidfile" $prog rv=$? echo [ $rv -eq 0 ] && rm -f $lockfile return $rv } restart() { stop start } case "$1" in start|stop|restart) $1 ;; force-reload) restart ;; status) status -p "$pidfile" -l $prog $exec ;; try-restart|condrestart) if status -p "$pidfile" -l $prog $exec >/dev/null ; then restart fi ;; reload) action $"Service ${0##*/} does not support the reload action: " /bin/false exit 3 ;; *) echo $"Usage: $0 {start|stop|status|restart|try-restart|force-reload}" exit 2 ;; esac
zabbix-agent启动脚本
#!/bin/sh # # chkconfig: - 86 14 # description: Zabbix agent daemon # ### BEGIN INIT INFO # Provides: zabbix-agent # Required-Start: $local_fs $network # Required-Stop: $local_fs $network # Should-Start: zabbix-server zabbix-proxy # Should-Stop: zabbix-server zabbix-proxy # Default-Start: # Default-Stop: 0 1 2 3 4 5 6 # Short-Description: Start and stop Zabbix agent # Description: Zabbix agent daemon ### END INIT INFO # Source function library. . /etc/rc.d/init.d/functions exec=/usr/local/zabbix/sbin/zabbix_agentd prog=${exec##*/} syscf=${0##*/} lockfile=/var/lock/subsys/$syscf [ -f /etc/sysconfig/$syscf ] && . /etc/sysconfig/$syscf config=${CFG_FILE:-/usr/local/zabbix/etc/zabbix_agentd.conf} if [ ! -f $config ]; then echo "Not starting Zabbix agent: Config file $config not found!" echo "Check /etc/sysconfig/$syscf" exit 3 fi pidfile=$(grep -e "^PidFile=.*$" $config | cut -d= -f2) param="-c $config" start() { echo -n $"Starting Zabbix agent: " daemon --user zabbixagent --pidfile "$pidfile" $exec $param rv=$? echo [ $rv -eq 0 ] && touch $lockfile return $rv } stop() { echo -n $"Shutting down Zabbix agent: " killproc -p "$pidfile" $prog rv=$? echo [ $rv -eq 0 ] && rm -f $lockfile return $rv } restart() { stop start } case "$1" in start|stop|restart) $1 ;; force-reload) restart ;; status) status -p "$pidfile" -l $prog $exec ;; try-restart|condrestart) if status -p "$pidfile" -l $prog $exec >/dev/null ; then restart fi ;; reload) action $"Service ${0##*/} does not support the reload action: " /bin/false exit 3 ;; *) echo $"Usage: $0 {start|stop|status|restart|try-restart|force-reload}" exit 2 ;; esac
自定义编译安装zabbix更改启动脚本主要注意这几行,更加自身情况进行修改
exec=/usr/local/zabbix/sbin/zabbix_agentd //编译后的程序路径
config=${CFG_FILE:-/usr/local/zabbix/etc/zabbix_agentd.conf} //编译后的配置文件路径
daemon --user zabbixagent --pidfile "$pidfile" $exec $param //这里的账号名需要是服务器上存在的账号
9.启动zabbix server
sudo service zabbix-server start