一、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程序架构

架构图如下:

wKiom1kahWKTkP4EAAmjWcTJDho579.png-wh_50


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各组件结构图:

wKiom1kahXngA9oLAACHGpy92l8365.png-wh_50


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’用户,但是无法在编译时或在配置文件中进行配置


二、项目规划架构方案

wKiom1kahtPzDNntAAEbd1udh5k278.png-wh_50

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使用了宏,如下图 

wKioL1kah-zw9PdgAAEGAl5jDYE725.png-wh_50

所以主机里面要设置宏,替代默认的模板中的宏,配置网络设备时,团体名命名为下面的名字 

wKiom1kah7DDkjtWAAFttExFduo876.png-wh_50

3.2 添加硬件监控(服务器IPMI)

  • 经验:直接用IPMI监控,经常获取不到数据,模板自带的item也不可能不适合真正的服务器

  • 推荐:使用自定义item,本地执行ipmitool命令监控获取数据,可以用来监控服务器风扇转速

3.3 添加系统监控

使用zabbix agent监控,略

3.4 添加应用监控

3.4.1 JAVA应用

使用JXM模式+java_gateway代理监控 
java_gateway可以运行在任何服务器上,是一个单独的服务 

wKioL1kaiVTwujcEAAFWg3I0acw241.png-wh_50
1)安装zabbix-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

wKioL1kaiX2SxlzCAAHaViaWWrs694.png-wh_50

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即可 

wKiom1kaiabB10PQAAG3iL6gDmw494.png-wh_50 

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展示