中小企业Zabbix监控生产案例实践


1、Zabbix监控介绍

一、Zabbix的功能概述php


1.1 zabbix是什么html

Zabbix是一个企业级的、开源的、分布式的监控套件。前端

Zabbix能够对网络和服务进行监控。Zabbix利用灵活的告警机制,可实现微信java

短信和邮件的自动报警。Zabbix利用存储的监控数据提供监控报告及实现图形化显示node


1.2 zabbix特性mysql

Zabbix是一个高度集成的网络监控套件,经过一个软件包便可提供以下特性linux


数据收集

  • 可用性及性能检测nginx

  • 支持SNMP(trapping及polling)、IPMI、JMX监控web

  • 自定义检测redis

  • 自定义间隔收集收据

  • 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端


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


2、项目规划架构方案

wKiom1kahtPzDNntAAEbd1udh5k278.png-wh_50

2.1 主机分组

交换机 
Nginx 
Tomcat 
Mysql

2.2 监控对象识别

使用SNMP监控交换机 
使用IPMI监控服务器硬件 
使用Agent监控服务器 
使用JMX监控java 
监控Nginx状态 
监控Mysql 
监控Web状态


3、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展现

相关文章
相关标签/搜索