一、Zabbix监控介绍
1、Zabbix的功能概述
1.1 zabbix是什么
Zabbix是一个企业级的、开源的、分布式的监控套件。
Zabbix可以对网络和服务进行监控。Zabbix利用灵活的告警机制,可实现微信
短信和邮件的自动报警。Zabbix利用存储的监控数据提供监控报告及实现图形化显示
1.2 zabbix特性
Zabbix是一个高度集成的网络监控套件,通过一个软件包即可提供如下特性
数据收集
可用性及性能检测
支持SNMP(trapping及polling)、IPMI、JMX监控
自定义检测
自定义间隔收集收据
server/proxy/agents实现分布监控环境
灵活的阀值定义
允许灵活地自定义故障阀值,Zabbix中称为触发器(trigger), 存储在后端数据库中
高级告警配置
可以自定义告警升级(escalation)、接收者及告警方式
告警信息可以配置并允许使用宏(macro)变量
通过远程命令实行自动化动作(action)
实时绘图
通过内置的绘图引擎实现监控数据实时绘图
扩展的图形化显示
允许自定义创建多监控项视图
网络拓扑(network maps)
自定义的面板(screen)和slide shows,并允许在dashboard页面显示
报告
高等级(商业)监控资源
历史数据存储
数据存储在数据库中
历史数据可配置
内置数据清理机制
配置简单
主机通过添加监控设备方式添加
一次配置,终生监控(除非调整或删除)
监控设备允许使用模板
模板使用
模板中可以添加组监控
模板允许继承
网络自动发现
自动发现网络设备
agent自动注册
自动发现文件系统、网卡设备、SNMP OID等
快速的web接口
web前端采用php编写
访问无障碍
你想怎么做就能做么做
审计日志
Zabbix API
Zabbix API提供程序级别的访问接口,第三方程序可以很快接入
权限系统
安全的权限认证
用户可以限制允许维护的列表
全特性、agent易扩展
在监控目标上部署
支持Linux及Windows
二进制守护进程
C开发,高性能,低内存消耗
易移植
1.3 Zabbix功能
监控拓扑图说明:
(1)可以通过微信、短信、邮件实现自动报警机制
(2)可以通过Web页面进行配置,监控状态查看
(3)可以通过SNMP协议实现对打印机、路由器、交换机的设备的监控
对主机可监控项包括:
CPU:CPU负载,CPU使用率
Memory:内存使用率,可交换内存/虚拟内存使用率
Network:网络传输、网络故障、丢包
Disk:磁盘使用率,磁盘I/O
Service:进程监控、界面服务、TCP端口连接,响应时间、DNS监控、NTP监控
Log:日志监控,文本日志,事件日志
File:文件监控
Other:性能计数器(仅限于Windows系统)
自定义报警机制:
如果故障在10分钟没有被解决,可以短信或邮件通知系统管理员
如果故障在15分钟没有被解决,可以短信或邮件通知运维人员
如果故障在30分钟没有被解决,可以短信或邮件通知经理
可以通过proxy代理服务器
代理Zabbix server搜集被监控的监控数据,并统一发送到Server端
2、zabbix程序架构
架构图如下:
2.1 Zabbix各组件的说明:
Zabbix Server
Zabbix Server为核心组件,用来获取agent存活状况及监控数据
所有的配置、统计、操作数据均通过Server进行存取到database
Zabbix database
所有的Zabbix数据均存储在数据库中
Web GUI
为了更简单的无障碍的访问Zabbix, 所以提供了web接口
该接口作为Zabbix Server的一部分,通常和server运行在同一台主机上
注意:如果采用SQLite作为数据库,web接口和Zabbix Server必须运行在同一台主机上
Proxy
Zabbix Proxy能够代替Zabbix Server进行性能及可用性数据采集
Proxy是Zabbix部署的可选组件。 如果想分担单一Zabbix Server负载,推荐使用proxy
Agent
Zabbix agents 部署在目标监控机上并监控本地资源和应用,将收集数据汇报给Zabbix Server
监控流程:
通过zabbix监控数据流,并采取相应的措施。
首先要创建一个host,再创建一个item来搜集数据
通过item来创建触发器(trigger)
通过触发器(trigger)来创建一个动作(action)
2.2 Zabbix各组件结构图:
2.3 Zabbix相关术语:
相关名词解释:
主机(host)
一个你想监控的网络设备(需要知道IP/DNS)
主机组(host group)
一个逻辑的主机组,它包含主机和模板
主机和模板在同一个主机内的话模板不能被link到其他上。主机组通常用于给不同的用户组创建访问权限
监控项(item)
你想从主机中收集到的数据
触发器(trigger)
一个逻辑表达式,用来表达从监控项获取的数据达到了预设的故障阀值
当接收到的监控值达到了预设的阀值
则触发器状态由’OK’变更为’Problem’,当收到的监控值低于阀值,则状态保持/变更为’OK’
事件(event)
一个事情发生如触发器状态变更或一个自动发现(discovery)/agent自动注册等
动作(action)
当一个事件发生时预设的处理过程
一个动作(action)包括操作(operations,如发送告警)和条件(当指定的操作完成)
告警升级(escalation)
在动作中一个自定的操作执行过程,一个发送告警/执行远程命令的队列
媒介(media)
发送告警的渠道
告警(notification)
通过媒介(media)渠道发送事件的消息
远程命令(remote command)
当监控主机达到某些条件(condition)后预设的自动执行的命令
模板(template)
一组包含监控项、触发器、绘图、面板(screen)、应用、低级别自动发现规则等
并且能被其他主机应用的实体模板能够提升主机部署监控任务的速度
同时也非常容易对监控任务做批量(mass)更新。模板被主机链接(link)
应用(application)
监控项逻辑组
web方案(scenario)
对一个web站点可用性进行检查的一个或多个http请求
前端(frontend)
Zabbix提供的web接口
Zabbix API
Zabbix API允许通过JSON RPC协议去创建、更新
获得Zabbix对象(如主机、监控项、绘图等等)以及完成自定义任务
Zabbix server
Zabbix软件中心进程
用于连通Zabbix proxy及agent完成监控、评估触发器、发送告警以及中心数据存储
Zabbix agent
部署在监控主机上的进程,用于监控本地资源和应用
Zabbix proxy
替代Zabbix server完成数据收集的进程,通常用于降低中心Zabbix Server的负载
节点(node)
一套完整的Zabbix server配置,通常位于分布式系统中,用于负责本区域的监控
2.4 Zabbix工作流程介绍:
Server
Zabbix server是Zabbix软件的核心进程
Server通过polling和trapping采集数据来判断是否达到阀值,从而使用触发器发送报警给用户
Server也可以通过简单服务检查(simple service check)来完成远程网络服务检测
Server既是保存所有配置、统计和操作数据的数据库,也是故障报警服务
Zabbix server根据不同功能可划分为三个部分:Zabbix server、Web GUI及Database
由于Zabbix的所有的配置信息保存在数据库中,server和web GUI可以直接进行操作
比如,通过Web界面(或者API)创建一个新的监控项时,它将创建的数据插入数据库
一分钟左右Zabbix server会查询监控项数据表
并将查询的监控项列表保存在自己的缓存(cache)中
这也是为什么通过Zabbix前端进行的变更将在两分钟左右生效的原因
Zabbix server以守护(daemon)进程方式运行
Zabbix server默认要求运行在非root账户下
如果Zabbix server和agent运行在同一台主机上
建议分别运行在不同的用户下,因为一旦运行的同一个用户下
agent将可以访问server的配置文件
并且能够轻松取得Zabbix Admin级别用户,例如:数据库密码
Agent
Zabbix agent部署在被监控主机上用来监控本地资源和应用(如硬盘、内存、处理器等)
Zabbix agent收集本地主机运行信息并将数据发送给Zabbix server进行处理
一旦出现异常(如硬盘满或服务进程中断),Zabbix server会自动响应并进行报警操作
Zabbix agent利用本地系统调用完成统计信息收集,因此它非常的高效
被动(passive)和主动(active)检查
Zabbix agent提供被动和主动查方式
在被动检查模式中agent应答数据请求,Zabbix server或者proxy询问agent数据
如CPU load,然后Zabbix agent回送结果给server
主动检查 处理过程将相对复杂
agent必须先进行一次请求Zabbix server索取监控项列表,然后发送对应的值给server
选择是被动还是主动检查,需要在监控项类型 中选择
’Zabbix agent’或者’Zabbix agent (active)’
Zabbix agent运行在被监控主机上,可以通过守护进行的方式运行
Zabbix agent一般要求运行在非root账户下
如果你在’root’账户下启动Zabbix agent,它将自动选择
在操作系统中建立的’zabbix’用户,除非你修改agent配置文件中’AllowRoot’参数
代理proxy
Zabbix代理(proxy)通常用于替代server收集监控信息并将数据发送给Zabbix server
所收集数据会先存储在代理主机的缓存中然后传送给Zabbix server
代理是可选的,不过使用它可以有效的降低分布式环境中单一的Zabbix server负载
通过代理去收集监控数据,server可以有效降低CPU和磁盘I/O消耗
Zabbix代理可以出色的完成远程区域、分支机构、无本地管理员的网络的集中监控
Zabbix代理使用独立的数据库
注意:
Zabbix proxy数据库可以使用SQLite, MySQL, PostgreSQL
如果Oracle或IBM DB2在低等级自动发现规则时存在限制和风险
Zabbix proxy作为守护进程运行。
Zabbix proxy一般要求运行在非root账户下
如果在’root’账户运行
它将自动选择之前已经在操作系统建立的’zabbix’用户,但是无法在编译时或在配置文件中进行配置
二、项目规划架构方案
2.1 主机分组
交换机
Nginx
Tomcat
Mysql
2.2 监控对象识别
使用SNMP监控交换机
使用IPMI监控服务器硬件
使用Agent监控服务器
使用JMX监控java
监控Nginx状态
监控Mysql
监控Web状态
三、Zabbix监控实践
3.1 SNMP监控网络设备
3.1.1交换机上开始SNMP
config t snmp-server community public ro
3.1.2在zabbix上添加监控
设置SNMP interfaces
3.1.3关联监控模板
选择默认的Template-SNMP-device
(网络设备,可以监控交换机,路由器和防火墙等;模板里面item使用了宏,如下图
所以主机里面要设置宏,替代默认的模板中的宏,配置网络设备时,团体名命名为下面的名字
3.2 添加硬件监控(服务器IPMI)
经验:直接用IPMI监控,经常获取不到数据,模板自带的item也不可能不适合真正的服务器
推荐:使用自定义item,本地执行ipmitool命令监控获取数据,可以用来监控服务器风扇转速
3.3 添加系统监控
使用zabbix agent监控,略
3.4 添加应用监控
3.4.1 JAVA应用
使用JXM模式+java_gateway代理监控
java_gateway可以运行在任何服务器上,是一个单独的服务
[root@linux-node1 ~]# yum install -y zabbix-java-gateway
2)配置zabbix_java_gateway,其实什么都不用改
[root@linux-node1 ~]# vim /etc/zannox/zabbix_java_gateway
3)启动zabbix_java_gateway,检查端口和进程
[root@linux-node1 ~]# systemctl start zabbix-java-gateway
[root@linux-node1 ~]# ps -ef|grep java
[root@linux-node1 ~]# netstat -lntup|grep 10052
4)告诉zabbix-server服务器,javaGateway服务器的位置,重启server
5)开启jmx远程监控
[root@linux-node2 ~]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.56.12"
[root@linux-node2 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@linux-node2 ~]# /usr/local/tomcat/bin/startup.sh
6)在zabbix-server上添加tomcat的主机
并连接Template-JMX-Generic模板,选择JMX interfaces
3.4.2 Nginx应用
1)开启nginx监控
在nginx配置文件中添加一个location,只允许本地访问
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all
}
2)编写脚本来进行数据采集(此脚本可以用来监控redis,memcached,nginx,tcp-status)
[root@linux-node1 ~]# vim redis-memcached-nginx-tcp.sh
#!/bin/bash
############################################################
# $Name: zabbix_linux_plugins.sh
# $Version: v1.0
# $Function: zabbix plugins
# $Description: Monitor Linux Service Status
############################################################
tcp_status_fun(){
TCP_STAT=$1
#netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,state[key]}' > /tmp/netstat.tmp
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}' > /tmp/netstat.tmp
TCP_STAT_VALUE=$(grep "$TCP_STAT" /tmp/netstat.tmp | cut -d ' ' -f2)
if [ -z $TCP_STAT_VALUE ];then
TCP_STAT_VALUE=0
fi
echo $TCP_STAT_VALUE
}
nginx_status_fun(){
NGINX_PORT=$1
NGINX_COMMAND=$2
nginx_active(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}'
}
nginx_reading(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}'
}
nginx_writing(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}'
}
nginx_waiting(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}'
}
nginx_accepts(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}'
}
nginx_handled(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}'
}
nginx_requests(){
/usr/bin/curl "http://127.0.0.1:"$NGINX_PORT"/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}'
}
case $NGINX_COMMAND in
active)
nginx_active;
;;
reading)
nginx_reading;
;;
writing)
nginx_writing;
;;
waiting)
nginx_waiting;
;;
accepts)
nginx_accepts;
;;
handled)
nginx_handled;
;;
requests)
nginx_requests;
esac
}
memcached_status_fun(){
M_PORT=$1
M_COMMAND=$2
echo -e "stats\\nquit" | nc 127.0.0.1 "$M_PORT" | grep "STAT $M_COMMAND " | awk '{print $3}'
}
redis_status_fun(){
R_PORT=$1
R_COMMAND=$2
(echo -en "INFO \\r\\n";sleep 1;) | nc 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp
REDIS_STAT_VALUE=$(grep ""$R_COMMAND":" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2)
echo $REDIS_STAT_VALUE
}
main(){
case $1 in
tcp_status)
tcp_status_fun $2;
;;
nginx_status)
nginx_status_fun $2 $3;
;;
memcached_status) memcached_status_fun $2 $3;
;;
redis_status) redis_status_fun $2 $3;
;;
*)
echo $"Usage: $0 {tcp_status key|memcached_status key|redis_status key|nginx_status key}"
esac
}
main $1 $2 $3
[root@linux-node1 ~]# chmod +x redis-memcached-nginx-tcp.sh
添加完测试脚本是否正常
[root@linux-node1 ~]# ./redis-memcached-nginx-tcp.sh nginx_status 8080 active
101
3)设置用户自定义参数
[root@linux-node1 ~]# vim redis-memcached-nginx-tcp.conf
UserParameter=linux_status[\\*],/etc/zabbix/zabbix_agetd.d/redis-memcached-nginx-tcp.sh "$1" "$2" "$3"
4)增加zabbix-agent配置,并通过zabbix-server测试
修改agent配置
[root@linux-node1 ~]# Include=/etc/zabbix/zabbix_agentd.d/\\*.conf
[root@linux-node1 ~]# service zabbix-agent restart
server端get测试
[root@linux-node1 ~]# zabbix_get -s 192.168.11.11 -k linux_status[nginx_status,8080,active]
12
5)添加template,添加item,多次克隆添加不同item即可
6)创建图形
略
7)创建触发器
略
8)创建通用模板
略
3.4.3 使用percona监控插件监控Mysql应用
学习percona请移步percona-mysql, 此原理是php连接mysql数据库,shell脚本获取数据,下面开始部署
1)在agent端安装模板
[root@linux-node1 ~]# yum install percona-zabbix-templates
2)创建zabbix-agent的配置文件
[root@linux-node1 ~]# mkdir -p /etc/zabbix_agentd.conf.d/ [root@linux-node1 ~]# cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix_agentd.conf.d/userparameter_percona_mysql.conf
3)修改agent配置并重启
[root@linux-node1 ~]# Include=/etc/zabbix/zabbix_agentd.d/\*.conf [root@linux-node1 ~]# service zabbix-agent restart
4)配置连接Mysql
<?php $mysql_user = 'zabbix'; $mysql_pass = '123456';<
5)测试脚本是否正常,确认密码争取,否则会连不上mysql
[root@linux-node1 ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg 405647
6)配置mysql
[client] user = zabbix password = 123456
7)使用zabbix测试脚本,返回0正常,1代表access denied
[root@linux-node1 ~]# sudo -u zabbix -H /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave 0
8)import模板,添加mysql主机关联此模板,添加trigger,添加Graph展示