zabbix实战
课程目标
-
了解zabbix基本的内置宏
-
掌握服务发现与自动注册的配置使用
-
监控TCP连接
-
监控nginx
-
监控MySQL
-
监控MySQL主从
课程实验
-
服务发现与服务自动注册实验
-
监控TCP连接实验
-
监控nginx、监控MySQL、监控MySQL主从实验
课堂引入
- 使用zabbix实现对客户机的监控
授课进程
一、宏的介绍
1、概述
在 Zabbix 中,宏(Macros)是一个非常强大的功能,允许你在监控配置中使用动态变量。宏可以在各种配置项中使用,例如触发器、动作、通知、图形和模板等
2、常用的宏
触发器相关宏
{TRIGGER.NAME}:触发器的名称。
{TRIGGER.STATUS}:触发器的状态。
{TRIGGER.SEVERITY}:触发器的严重性。
{TRIGGER.URL}:触发器的 URL。
事件相关宏
{EVENT.ID}:事件的 ID。
{EVENT.DATE}:事件的日期。
{EVENT.TIME}:事件的时间。
{EVENT.RECOVERY.ID}:恢复事件的 ID。
主机和项目相关宏
{HOST.NAME}:主机的名称。
{HOST.IP}:主机的 IP 地址。
{ITEM.NAME}:项目的名称。
{ITEM.VALUE}:项目的值。
用户相关宏
{USER.FULLNAME}:用户的全名。
{USER.EMAIL}:用户的电子邮件地址。
{USER.PHONE}:用户的电话号码。

二、服务发现与自动注册
1、概述
手动添加客户端非常耗时间,增加人力、时间成本。为了满足监控企业成千上万台服务器,zabbix提供了自动发现与自动注册的功能,自动批量发现局域网中的服务器,并自动添加到zabbix监控平台
自动发现(被动模式):由服务端主动发起,Zabbix Server开启发现进程,定时扫描局域网中IP服务器、设备。实现自动将发现主机、自动将主机添加到主机组、自动加载模板、自动创建项目(item)、自动创建图像等功能。缺点:当 Agent服务器过多的时候采用自动发现,zabbix-server压力会比较大,自动添加主机进度就会非常慢。
自动注册(主动模式):Zabbix Server 等待 Zabbix Agent主动上报。由客户端主动发起,客户端必须安装并启动Agentd,否则无法被自动注册添加至主机列表。对于使用SNMP的要采用自动发现。缺点:agent有可能找不到Server。
PS:主动还是被动是基于agent而言,不管是主动还是被动模式都是在agent端进行配置
2、自动发现
操作步骤:
1. 创建自动发现规则
2. 创建自动发现动作
3. 在“检测中”->“自动发现”可以查看 已发现的设备
1)创建自动发现规则
"配置"->"自动发现"->"创建发现规则" 填入名称、需发现服务器、设备的IP范围、更新间隔、检查项(ssh和zabbix客户端)、设备唯一性准则 最后勾选已启用、点击添加。

2)创建自动发现动作
"配置"->"动作"->事件源"自动发现"->"创建动作"


点击->操作配置,选择具体的操作类型:添加主机、添加到主机群组、与模板关联

3)在"检测中"->"自动发现"可以查看 已发现的设备

3、自动注册



三、监控TCP连接
1、TCP连接概述
# 用于查看网络状态的两个命令
netstat -anpt
ss -anpt


Proto: 显示连接使用的协议
Recv-Q: 接收队列
Send-Q: 发送队列
Local Address:Port 请求的本地址与端口号
Foreign Address 客户端地址
PID/Program name 进程号与进程名称


netstat中的各种状态:
CLOSED : 初始(无连接)状态。
LISTEN : 侦听状态,等待远程机器的连接请求。
SYN_SEND : 在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV : 在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED : 完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1 : 在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2 : 在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT : 在TCP四次挥手时,主动关闭端发送ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING : 在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,进入CLOSING状态。
CLOSE_WAIT : 在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK : 在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
主动连接端可能的状态有:
CLOSED SYN_SEND ESTABLISHED。
主动关闭端可能的状态有:
FIN_WAIT_1 FIN_WAIT_2 TIME_WAIT。
被动连接端可能的状态有:
LISTEN SYN_RECV ESTABLISHED。
被动关闭端可能的状态有:
CLOSE_WAIT LAST_ACK CLOSED。
ESTABLISHED socket已经建立连接
CLOSED socket没有被使用,无连接
CLOSING 服务器端和客户端都同时关闭连接
CLOSE_WAIT 等待关闭连接
TIME_WAIT 表示收到了对方的FIN报文,并发送出了ACK报文,等待2MSL后就可回到CLOSED状态
LAST_ACK 远端关闭,当前socket被动关闭后发送FIN报文,等待对方ACK报文
LISTEN 监听状态
SYN_RECV 接收到SYN报文
SYN_SENT 已经发送SYN报文
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.
2、自定义监听key
需求:获取tcp连接中处于监听状态的tcp连接的数量
1)编写获取数据的shell命令
ss -an | grep -w 80 | grep "LISTEN" | wc -l

2)客户端添加配置文件,编写自定义key
vim /etc/zabbix/zabbix_agentd.d/tcp_status.conf
# Format: UserParameter=<key>,<shell command>
UserParameter=tcp.status.listen,ss -an | grep -w 80 | grep "LISTEN" | wc -l
更改了配置文件,重新启动agent
systemctl restart zabbix-agent
3)客户端测试获取数据
zabbix_get -s client -k tcp.status.listen

4)web页面添加监控项与图形



5)课堂练习
需求:获取tcp连接中处于(TIME-WAIT、ESTAB、SYN_RECV、SYN_SENT、CLOSE)状态的tcp连接的数量
3、动态参数
1)问题描述
以下的自定义的监听的数据非常类似,这样记忆或者操作起来就比较繁琐,有没有一种方式可以通过key来传递参数呢?

2)动态参数语法
使用动态传参的方式来解决上述的问题:
cp /etc/zabbix/zabbix_agentd.d/tcp_status.conf /etc/zabbix/zabbix_agentd.d/tcp_status.conf.bak
vim /etc/zabbix/zabbix_agentd.d/tcp_status.conf
UserParameter=tcp.status[*],ss -an | grep -w 80 | grep "$1" | wc -l
*:表示在填写key是传递过来的参数,如果有多个参数,通过,隔开
$1:表示第一个参数
3)实验

4、第三方模板
工作过程中,很多的key其实都已经定好了,并不需要我们去重新设置,所以,工作中,要监听什么数据,只需要把对应的配置文件放到对应的客户端中就可以了。

我们以tcp监控的数据作为示例来进行讲解
1)上传文件

2)将文件添加到agent指定目录
vim /root/tcp_connect_status/tcp_connect_status
UserParameter=tcp.connect.status[*],/etc/zabbix/tcp_connect.status/tcp_connect_status.sh $1
vim /root/tcp_connect_status/tcp_connect_status.sh
#!/bin/bash
#ESTABLISHED/LISTEN/SYN_SENT/SYN_RECV/FIN_WAIT1/FIN_WAIT2/TIME_WAIT/CLOSE/CLOSE_WAIT/LAST_ACK/LISTEN/CLOSING/ERROR_STATUS
LISTEN() {
netstat -an |grep ^tcp |grep LISTEN |wc -l
}
ESTABLISHED() {
netstat -an |grep ^tcp |grep ESTABLISHED |wc -l
}
TIME_WAIT() {
netstat -an |grep ^tcp |grep TIME_WAIT |wc -l
}
SYN_SENT() {
netstat -an |grep ^tcp |grep SYN_SENT |wc -l
}
SYN_RECV() {
netstat -an |grep ^tcp |grep SYN_RECV |wc -l
}
CLOSE() {
netstat -an |grep ^tcp |grep CLOSE |wc -l
}
$1
# 创建目录
mkdir /etc/zabbix/tcp_connect.status
# 复制tcp_connect_status.sh脚本到/etc/zabbix/tcp_connect.status目录中
cp /root/tcp_connect_status/tcp_connect_status.sh /etc/zabbix/tcp_connect.status
chmod -R +x /etc/zabbix/tcp_connect.status
# 复制自定义的key的文件到agent的指定目录,并修改名字
cp /root/tcp_connect_status/tcp_connect_status /etc/zabbix/zabbix_agentd.d/tcp_connect_status.conf
3)重启agent
systemctl restart zabbix-agent
4)服务端测试
zabbix_get -s client -k tcp.connect.status[LISTEN]

5)web端添加监控项与图形

6)验证

四、监控nginx
1、nginx配置状态查询
目的:观察用户与 nginx 服务器的链接数量
状态模块:stub_status_module
启用状态模块
location /nginx_status {
stub_status;
allow all;
}
# 当有人访问 /nginx_status 这个页面时,给他看 stub_status 这个模块,授予所有用户访问权限
修改nginx的配置并重启nginx
location /nginx_status {
stub_status;
deny all;
allow 192.168.217.155;
}


Active connections: 22 当前活动的连接数
server accepts handled requests 6 6 6 服务器接受处理请求
6 总连接数connection(TCP)
6 成功的连接数connection (TCP)
6 总共处理的请求数requests(HTTP)
Reading: 0 读取客户端Header的信息数,请求头
Writing: 1 返回给客户端的header的信息数,响应头
Waiting: 0 等待的请求数,开启了keepalive
2、客户端
1)上传文件

vim /root/nginx/nginx_status
UserParameter=Active,/usr/local/zabbix-agent-ops/bin/nginx_status.sh Active
UserParameter=Reading,/usr/local/zabbix-agent-ops/bin/nginx_status.sh Reading
UserParameter=Writing,/usr/local/zabbix-agent-ops/bin/nginx_status.sh Writing
UserParameter=Waiting,/usr/local/zabbix-agent-ops/bin/nginx_status.sh Waiting
vim /root/nginx/nginx_status.sh
#!/bin/bash
#nginx status
Active(){
wget --quiet -O - http://localhost/nginx_status?auto |awk 'NR==1 {print$3}'
}
Accept(){
wget --quiet -O - http://localhost/nginx_status?auto |awk 'NR==3 {print$1}'
}
Handled(){
wget --quiet -O - http://localhost/nginx_status?auto |awk 'NR==3 {print$2}'
}
Request(){
wget --quiet -O - http://localhost/nginx_status?auto |awk 'NR==3 {print$3}'
}
Reading(){
wget --quiet -O - http://localhost/nginx_status?auto |awk 'NR==4 {print$2}'
}
Writing(){
wget --quiet -O - http://localhost/nginx_status?auto |awk 'NR==4 {print$4}'
}
Waiting(){
wget --quiet -O - http://localhost/nginx_status?auto |awk 'NR==4 {print$6}'
}
$1
2)创建目录并授权
mkdir /usr/local/zabbix-agent-ops/bin/
chmod -R +x /usr/local/zabbix-agent-ops/bin/
3)复制文件到指定目录
cp /root/nginx/nginx_status /etc/zabbix/zabbix_agentd.d/nginx_status.conf
cp /root/nginx/nginx_status.sh /usr/local/zabbix-agent-ops/bin/
chmod -R +x /usr/local/zabbix-agent-ops/bin/
4)重启agent
systemctl restart zabbix-agent
3、服务端
1)命令测试
zabbix_get -s client -k Active

2)添加监控项与图形
此处自行添加即可
五、监控MySQL
1、常用监控数据
对于MySQL数据库而言,我们常见的监听项有以下几项:
- 查询吞吐量
Com_select:select查询语句个数/每秒
Com_insert:insert操作语句个数/每秒
Com-update:update操作语句个数/每秒
Com-delete:delete操作语句个数/每秒
Questions:查询语句总量

- 慢查询数量
Slow_queries:慢查询数量

- 连接情况
Threads_connected:当前打开的数据库连接数
max_connections:数据库当前的最大连接数
# 获取最大连接数
mysql -uroot -pAa123456= -e "show variables like 'max_connections'"|grep max_connections
# 获取当前打开的数据库连接数
mysqladmin -uroot -pAa123456= extended-status | grep -E 'Threads_connected'

2、客户端
自行完成
3、服务端
自行完成
六、监控MySQL主从
1、需求描述
1)MySQL主机与从机的状态
2)slave主从复制的状态
3)slave主从复制的延迟
课堂小结
-
服务发现与服务自动注册实验
-
监控TCP连接实验
-
监控nginx、监控MySQL、监控MySQL主从实验
课后作业
-
完成课堂的案例及练习
-
将今天的内容整理为思维导图的形式
-
完成以下需求
1、zabbix怎么监控的,有哪些监控指标?
2、Zabbix 的主动模式和被动模式有什么区别?
3、zabbix 主动模式server是否通过agent?
4、zabbix会监控哪些指标?怎么进行优化?
5、如果不使用zabbix你怎么去监控cpu,脚本?那脚本如何告警?
6、zabbix进程指标怎么看?
扩展内容
无