200字
Zabbix 监控实战案例
2026-04-04
2026-04-04

Zabbix 监控实战案例

Zabbix 的监控功能强大,还支持定制的自定义监控项,可以说能做到想监控什么就可以监控什么

以下实战案例中实现了对生产环境中各种资源的监控

监控内存使用情况

在客户端定义监控项

[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/mem.conf
[root@centos8 ~]#cat /etc/zabbix/zabbix_agent2.d/mem.conf
UserParameter=mem_use_percent,free | awk 'NR==2{print $3/$2*100}'
UserParameter=mem_unuse_percent,free | awk 'NR==2{print 100-($3/$2*100)}'

#客户端测试
[root@centos8 ~]#zabbix_agent -t mem_use_percent
[root@centos8 ~]#zabbix_agent2 -t mem_use_percent
mem_use_percent [s|11.9297]
[root@centos8 ~]#zabbix_agent2 -t mem_unuse_percent
mem_unuse_percent [s|88.2598]

[root@centos8 ~]#systemctl restart zabbix-agent.service
[root@centos8 ~]#systemctl restart zabbix-agent2.service

#服务器端测试
[root@zabbix-server ~]#yum -y install zabbix-get
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -p 10050 -k "mem_use_percent"
11.1591
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -p 10050 -k "mem_unuse_percent"
88.7257

在 Zabbix Server 添加监控项

验证结果

监控TCP 十一种有限状态机

TCP 十一种有限状态机

TCP 共十一种状态

ESTABLISHED
SYN_SENT
SYN_RECV
FIN_WAIT1
FIN_WAIT2
TIME_WAIT
CLOSE
CLOSE_WAIT
LAST_ACK
LISTEN
CLOSING
[root@rocky8 ~]#man netstat
State
The state of the socket. Since there are no states in raw mode and
usually no states used in UDP and UDPLite, this column may be left
blank. Normally this can be one of several values:
ESTABLISHED
The socket has an established connection.
SYN_SENT
The socket is actively attempting to establish a connection.
SYN_RECV
A connection request has been received from the network.
FIN_WAIT1
The socket is closed, and the connection is shutting down.
FIN_WAIT2
Connection is closed, and the socket is waiting for a shutdown
from the remote end.
TIME_WAIT
The socket is waiting after close to handle packets still in the
network.
CLOSE The socket is not being used.
CLOSE_WAIT
The remote end has shut down, waiting for the socket to close.
LAST_ACK
The remote end has shut down, and the socket is closed. Waiting
for acknowledgement.
LISTEN The socket is listening for incoming connections. Such sockets
are not included in the output unless you specify the --listening
(-l) or --all (-a) option.
CLOSING
Both sockets are shut down but we still don't have all our data
sent.
UNKNOWN
The state of the socket is unknown.

[root@rocky8 ~]#netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.8:22 10.0.0.1:9680 ESTABLISHED
tcp 0 52 10.0.0.8:22 10.0.0.1:9682 ESTABLISHED
tcp 0 0 10.0.0.8:22 10.0.0.1:9681 ESTABLISHED
tcp6 0 0 :::10050 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 10.0.0.8:10050 10.0.0.100:55018 TIME_WAIt

实现自定义监控项

案例1: 自定义监控项实现监控TCP当前ESTABLISHED状态的连接数

先准备脚本实现自定义监控项实现连接数

[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=tcp_state_estab,netstat -ant|grep -c ESTABLISHED

[root@centos8 ~]#systemctl restart zabbix-agent.service

[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state_estab"
5

添加被控制主机

在被监控主机添加监控项

测试是否能获取到相关的值

案例2:自定义监控项实现监控TCP 状态的连接数

修改监控项的脚本为以下形式,可以实现一个脚本实现多个自定义监控项

[root@centos8 ~]#yum -y install net-tools
[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/tcp_state.sh

tcp_state () {
	netstat -atn|grep -c $1
}
tcp_state $1
#netstat -nat|awk -v STATE=$1 '$NF ~ STATE{state[$NF]++}END{for(i in state){print state[i]}}'

[root@centos8 ~]#chmod +x /etc/zabbix/zabbix_agentd.d/tcp_state.sh
[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=tcp_state[*],/etc/zabbix/zabbix_agentd.d/tcp_state.sh $1

[root@centos8 ~]#systemctl restart zabbix-agent.service
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state[LISTEN]"
9
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k"tcp_state[ESTABLISHED]"
3
[root@zabbix-server ~]#zabbix_get -s 10.0.0.38 -p 10050 -k "tcp_state[TIME-WAIT]"
8200

测试是否能取到数据

自定义模板实现监控

对于主机和监控项众多时,直接将监控项关联至主机的方法,是比较繁琐的

可以通过将自定义的监控项加入到自定义的模板或已有的模板中,再将此模板关联至需要监控的主机,从而提高效率

创建应用集tcp_state

在自定义的模板中创建自定义监控项或者将已有的监控项复制到模板中

查看自定义的模板中已存在自定义的应用集和监控项

在监控主机上清空前面小节已关联的监控项

在被监控主机重新关联自定义的模板

查看关联的模板及相关的监控项

导出自定义的模板

查看文件内容

创建自定义触发器

创建触发器

选择指定的模板中创建触发器

创建触发器

测试触发触发器

默认没有触发消息

[root@centos8 ~]#zabbix_get -s 10.0.0.7 -p 10050 -k "tcp_state[ESTAB]"
3
[root@centos8 ~]#zabbix_get -s 10.0.0.8 -p 10050 -k "tcp_state[ESTAB]"
2

多建立连接查看到下面提示信息

[root@centos8 ~]#zabbix_get -s 10.0.0.8 -p 10050 -k "tcp_state[ESTAB]"
6
[root@centos8 ~]#zabbix_get -s 10.0.0.7 -p 10050 -k "tcp_state[ESTAB]"
7

自定义图形

选择自定义的模板,查看"图形"

在图形中添加监控项

确定创建图

在模板中可以看到图形有一个

在主机中验证结果

验证图形和颜色

导出模板

将自定义的模板导出,可以在其它Zabbix Server导入进行复用

监控 Redis 服务

客户端配置

[root@centos8 ~]#key1="used_memory";redis-cli info |awk -F: -v key2=$key '$1==key2{print $2}'

[root@centos8 ~]#key1="total_system_memory";redis-cli info |awk -F: -v key2=$key '$1==key2{print $2}'

[root@centos8 ~]#key1="connected_clients";redis-cli info |awk -F: -v  key2=$key '$1==key2{print $2}'

[root@centos8 ~]#cat /etc/zabbix/zabbix_agent2.d/redis.conf
UserParameter=redis.status[*],/etc/zabbix/zabbix_agent2.d/redis_status.sh "$1"
UserParameter=redis.config.maxclients,redis-cli -p 6379 config get maxclients | awk "NR==2"

[root@centos8 ~]#cat /etc/zabbix/zabbix_agent2.d/redis_status.sh
#!/bin/bash
KEY=$1
redis-cli -p 6379 info | grep "\<${KEY}\>" | awk -F ':' '{print $NF}'
[root@centos8 ~]#systemctl restart zabbix-agent2

#服务器测试
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -k redis.status[used_memory]
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -k redis.status[total_system_memory]
[root@zabbix-server ~]##zabbix_get -s 10.0.0.8 -k redis.status[connected_clients]

配置 Zabbix Web

  • 创建自定义模板
  • 在上面的模板中创建监控项
  • 在模板上创建2个图形,连接状态和内存状态

注意: total_system_memory 的类型为图形总数

  • 创建触发器
#当Redis连接数达到最大连接数的70%: 活跃连接数/最大连接数*100 >70
#宏定义: {$REDIS.CLIENTS.MAX}=70
#名称:Redis活跃连接数达到{$REDIS.CLIENTS.MAX}
#问题形式:
{ Template Redis status :redis.status[connected_clients].avg(1m)}/{Template Redis status:redis.config.maxclients.last()}*100 >={$REDIS.CLIENTS.MAX}

#当Redis内存使用率达到50%:(used_memory/total_system_memory*100> 50 )
#宏定义: {$REDIS.MEM.MAX}=50
#名称:Redis 已用内存达到{$REDIS.MEM.MAX}
#问题形式:
{ Template Redis
status:redis.status[used_memory].last()}/{Template Redis
status:redis.status[total_system _memory].last()}*100>={$REDIS.MEM.MAX}

#测试
[root@rocky8 ~]#redis-cli
127.0.0.1:6379> debug populate 5000000
  • 将自定模板关联主机

监控 Nginx 服务

自定义监控项监控 nginx 状态页

[root@rocky8 ~]#vim /etc/nginx/conf.d/default.conf
# 加入
location /nginx_status {
    stub_status;
    access_log off;
    allow 127.0.0.1;
    deny all;
}
# 重启服务
[root@rocky8 ~]#systemctl restart nginx

配置 agent

[root@rocky8 ~]#vim /etc/zabbix/zabbix_agentd.d/nginx_status.sh
#!/bin/bash
# Description:zabbix监控nginx性能以及进程状态
HOST="127.0.0.1"
PORT="80"
URL=nginx_status
# 检测nginx进程是否存在
case $1 in
ping)
    pidof nginx | wc -l
    ;;
# 检测nginx性能
active)
    curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==1{print $NF}'
    ;;
    
reading)
    curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==4{print $2}'
    ;;

writing)
    curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==4{print $4}'
    ;;

waiting)
    curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==4{print $6}'
    ;;
    
accepts)
    curl -s "http://$HOST:$PORT/$URL/" |awk 'NR==3{print $1}'
    ;;
    
handled)
    curl -s "http://$HOST:$PORT/$URL/" | awk 'NR==3{print $2}'
    ;;
    
requests)
    curl -s "http://$HOST:$PORT/nginx_status/" | awk 'NR==3{print $3}'
    ;;
*)
echo "Usage `basename $0` {ping | active | reading | writing | waiting | accepts | handled | requests }"
esac

[root@rocky8 ~]#chmod +x /etc/zabbix/zabbix_agent2.d/nginx_status.sh

[root@rocky8 ~]#/etc/zabbix/zabbix_agent2.d/nginx_status.sh active
# 成功
1

#添加监控配置
[root@rocky8 ~]#vim /etc/zabbix/zabbix_agent2.d/nginx.conf
UserParameter=nginx.status[*],/etc/zabbix/zabbix_agent2.d/nginx_status.sh $1

#agent测试
[root@rocky8 ~]#zabbix_agent2 -t nginx.status[ping]
nginx.status[ping] 			[s|1]
[root@rocky8 ~]#zabbix_agent2 -t nginx.status[active]
nginx.status[active] 		[s|1]
[root@rocky8 ~]#systemctl restart zabbix-agent2.service

#服务器测试
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -k nginx.status[ping]
1
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -k nginx.status[active]
1

配置 Zabbix Web

  • 创建模板
  • 创建8个监控项
  • 创建触发器(为ping设定监控项)
  • 创建图形
  • 关联对应主机

监控 MySQL 服务

percona 提供了相关的监控MySQL的插件,不过此项目已经不再开发,官网访问链接已经从首页删除,只能直接从下面链接访问

注意: percona提供的最新1.1.8版本对应的模板只适配与zabbix3.0之前的版本

https://www.percona.com/downloads/percona-monitoring-plugins/

监控MySQL 状态

使用 MySQL 自定义模板,监控mysql性能,可以监控如下内容:OPS(增删改查)、mysql请求流量带宽,mysql响应流量带宽

[root@centos8 ~]#yum -y install mysql-server
[root@centos8 ~]#systemctl enable --now mysqld
[root@centos8 ~]#mysql -e 'create user zabbix@"localhost" identified by "123456"'

[root@centos8 ~]#grep "^Include" /etc/zabbix/zabbix_agentd.conf
Include=/etc/zabbix/zabbix_agentd.d/*.conf

[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.version,mysql -V
UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/check_mysql.sh $1 2> /dev/null
UserParameter=mysql.ping,mysqladmin -uzabbix -p123456 -P3306 -h127.0.0.1 ping 2>/dev/null | grep -c alive

[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/check_mysql.sh
#!/bin/bash
#
MYSQL_USER='zabbix'
MYSQL_PWD='123456'
MYSQL_HOST='127.0.0.1'
MYSQL_PORT='3306'
MYSQL_CONN="/usr/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} -h${MYSQL_HOST} -P${MYSQL_PORT}"
#MYSQL_CONN=mysql -e "show global status" | awk -v s=$1 '$1 ~ "^"s"$"{print $2}'

if [ $# -ne "1" ];then
	echo "arg error!"
fi

case $1 in
	Threads)
        result=`${MYSQL_CONN} status |awk '{print $4}'`
        ;;
    Uptime)
        result=`${MYSQL_CONN} status|cut -f2 -d":"|cut -f1 -d"T"`
        ;;
    Com_update)
        result=`${MYSQL_CONN} extended-status |grep -w "Com_update"|cut -d"|" -f3`
        ;;
    Slow_queries)
        result=`${MYSQL_CONN} status |cut -f5 -d":"|cut -f1 -d"O"`
        ;;
    Com_select)
        result=`${MYSQL_CONN} extended-status |grep -w "Com_select"|cut -d"|" -f3`
        ;;
    Com_rollback)
        result=`${MYSQL_CONN} extended-status |grep -w "Com_rollback"|cut -d"|"-f3`
        ;;
    Questions)
        result=`${MYSQL_CONN} status|cut -f4 -d":"|cut -f1 -d"S"`
        ;;
    Com_insert)
        result=`${MYSQL_CONN} extended-status |grep -w "Com_insert"|cut -d"|" -f3`
        ;;
    Com_delete)
        result=`${MYSQL_CONN} extended-status |grep -w "Com_delete"|cut -d"|" -f3`
        ;;
    Com_commit)
        result=`${MYSQL_CONN} extended-status |grep -w "Com_commit"|cut -d"|" -f3`
        ;;
    Bytes_sent)
        result=`${MYSQL_CONN} extended-status |grep -w "Bytes_sent" |cut -d"|" -f3`
        ;;
    Bytes_received)
    	result=`${MYSQL_CONN} extended-status |grep -w "Bytes_received" |cut -d"|" -f3`
		;;
	Com_begin)
		result=`${MYSQL_CONN} extended-status |grep -w "Com_begin"|cut -d"|" -f3`
    	;;
    *)
echo
    "Usage:$0(Threads|Uptime|Com_update|Slow_queries|Com_select|Com_rollback|Questions|Com_insert|Com_delete|Com_commit|Bytes_sent|Bytes_received|Com_begin)"
    ;;
esac
echo $result

[root@centos8 ~]#chmod +x /etc/zabbix/zabbix_agentd.d/check_mysql.sh
[root@centos8 ~]#systemctl restart zabbix-agent.service


[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.version'
mysql Ver 8.0.21 for Linux on x86_64 (Source distribution)
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.status[Uptime]'
1141
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.status[Slow_queries]'
0

[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.ping'
1
#停止MySQL服务后再测试看到下面结果
[root@zabbix-server ~]#zabbix_get -s 10.0.0.8 -p 10050 -k 'mysql.ping'
0
#按下面操作导入自定义模板

监控 MySQL 主从复制

Agent 端配置

[root@centos8 ~]#cat/etc/zabbix/zabbix_agent2.d/mysql_repl_status.sh
#!/bin/bash
KEY=$1
PASS='123456'
mysql -uroot -p$PASS -e "show slave status\G"|grep "${KEY}"|awk '{print $NF}'

[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=mysql.repl.status[*],/etc/zabbix/zabbix_agent2.d/mysql_repl_status.sh "$1"

#服务器取值测试
[root@zabbix ~]#zabbix_get -s 10.0.0.8 -k mysql.repl.status[Slave_SQL_Running]
[root@zabbix ~]#zabbix_get -s 10.0.0.8 -k mysql.repl.status[Slave_IO_Running]
[root@zabbix ~]#zabbix_get -s 10.0.0.8 -k mysql.repl.status[Second_Behind_Master]

配置 Zabbix Web

  • 创建模板
  • 创建监控项(添加三个监控项)
    注意: 线程状态的监控项的信息类型为字符,复制延时的监控项为数字
  • 创建触发器(添加两个触发器)
#触发器1:名称:复制线程异常, 两个复制线程状态都要为 Yes
{Template MysQL slave {Temp1ate MySQL repl
status:mysql.repl.status[Slave_IO_Running].str(Yes)}=0 or {Template MySQL repli status :mysql.repl.status[Slave_SQL_Running].str(Yes)}=0

#触发器2: 名称:复制延时不超过100s
{Template MysQL repl status:mysql.repl.status[Second_Behind_Master].last()]}>=100
  • 关联对应主机

监控 Keepalived 集群的脑裂问题

生产中使用的 Keepalive集群 ,偶尔会出现两台 Keepalive 上都有 VIP 的情况,即经常所说的“脑裂”问题,为避免对线上业务造成不可估量的损失,利用Zabbix 监控及时发现和解决这一问题

#自定义报警的key
[root@ubuntu1804 ~]# cat /apps/zabbix/etc/zabbix_agentd.conf.d/check_keepalived.conf
UserParameter=check_keepalived[*],/bin/bash /apps/zabbix/etc/zabbix_agentd.conf.d/check_vip.sh

#自定义监控项脚本
[root@ubuntu1804 ~]# cat /apps/zabbix/etc/zabbix_agentd.conf.d/check_vip.sh
#!/bin/bash
#
VIP="10.0.0.10"
NET="eth0"
CHECK_MAC=$(arping -c 1 -I $NET $VIP|awk -F"[][]" '/Unicast/{print $2}'|wc -l)
if [[ $CHECK_MAC -gt 1 ]]
then
	result=1
else
	result=0
fi
echo $result

监控 Memcached 服务

在 Zabbinx Agent安装memcached 服务

[root@centos8 ~]#yum -y install memcached nc
[root@centos8 ~]#vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
#OPTIONS="-l 127.0.0.1,::1" #注释此行
[root@centos8 ~]#systemctl enable --now memcached

Zabbix Agent的监控脚本

[root@centos8 ~]#cat /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh
#!/bin/bash

memcached_state(){
	port=$1
	echo -e 'stats\nquit'| nc 127.0.0.1 $port |awk -v item=$2 '$2==item{print $3}'
}
memcached_state $1 $2


#编译安装路径
[root@centos8 ~]#chmod +x /apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh
#如果是包安装路径如下
[root@centos8 ~]#chmod +x /etc/zabbix/zabbix_agentd.d/memcached_state.sh
[root@centos8 ~]#/apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 version
1.5.9

#取当前连接数
[root@centos8 ~]#/apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 curr_connections
2
#取内存使用
[root@centos8 ~]#/apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 bytes
131
[root@centos8 ~]#/apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 get_hits
0
[root@centos8 ~]#/apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh 11211 get_misses
0

zabbix Agent 添加自定义的监控项

[root@centos8 ~]#vim /apps/zabbix_agent/etc/zabbix_agentd.conf
### Option: UserParameter
# User-defined parameter to monitor. There can be several user-definedparameters.
# Format: UserParameter=<key>,<shell command>
# See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
UserParameter=tcp_state[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/tcp_state.sh "$1"
UserParameter=memcached_state[*],/apps/zabbix_agent/etc/zabbix_agentd.conf.d/memcached_state.sh "$1" "$2"

#如果是包安装,配置文件如下
[root@centos8 ~]#cat /etc/zabbix/zabbix_agentd.d/test.conf
UserParameter=memcached_state[*],/etc/zabbix/zabbix_agentd.d/memcached_state.sh "$1" "$2"


[root@centos8 ~]#systemctl restart zabbix-agent.service

Zabbix Server 测试监控memcached服务的监控项数据

[root@zabbix-server ~]#zabbix_get -s 10.0.0.103 -p 10050 -k"memcached_state[11211,version]"
1.5.9
[root@zabbix-server ~]#zabbix_get -s 10.0.0.103 -p 10050 -k"memcached_state[11211,curr_connections]"
2

创建memached的监控自定义模板

创建自定义模板

创建自定义监控项

监控项实现监控当前连接数

键值: memcached_state[11211,curr_connections]

创建针对自定义模板的触发器

当前连接数大于1000时生成触发器事件

创建自定义模板版的图形

自定义的模板关联图形,一个图形可以用多个监控项,不同的监控项会自动使用不同的颜色进行区分,也可以手动调整各监控项的颜色和图形类型。

将自定义的模板关联至需要监控的主机上

验证监控结果

评论