Zabbix
监控服务介绍
逻辑布局

整体布局

常见的监控服务
开源监控软件:cacti、naglos、zabbix、smokeping、open-falcon 等
Cacti
官网:https://www.cacti.net/
github:https://github.com/Cacti/cacti
1 | Cacti是基于LAMP平台展现的网络流量监测及分析工具,通过SNMP技术或自定义脚本从目标设备/主机获取监控指标信息;其次进行数据存储,调用模板将数据存到数据库,使用rrdtool存储和更新数据,通过rrdtool绘制结果图形;最后进行数据展现,通过Web方式将监控结果呈现出来,常用于在数据中心监控网络设备 |
缺点:只针对物理设备、虚拟机这样有固定 IP 地址的设备,不适用于容器
Nagios
1 | Nagios用来监视系统和网络的开源应用软件,利用其众多的插件实现对本机和远端服务的监控,当被监控对象发生异常时,会及时向管理员告警,提供一批预设好的监控插件,用户可以直接调用,也可以自定义Shell脚本来监控服务,适合各企业的业务监控,可通过Web页面显示对象状态、日志、告警信息,分层告警机制及自定义监控相对薄弱 |
缺点:报警机制比较简单,无法实现分组报警、递归报警等功能
SmokePing
官网地址:https://oss.oetiker.ch/smokeping/
1 | Smokeping是一款用于网络性能监测的开源监控软件,主要用于对IDC的网络状况,网络质量,稳定性等做检测,通过rrdtool制图方式,图形化地展示网络的时延情况,进而能够清楚的判断出网络的即时通信情况 |
可以监测全国各地连接到网站的网速,类似 站长之家 的某些测速功能
Open-falcon
官网:https://www.open-falcon.org/
github:https://github.com/XiaoMi/open-falcon
文档:https://book.open-falcon.org/zh_0_2/contributing.html
1 | 小米公司开源出来的监控软件open-falcon(猎鹰),监控能力和性能较强 |
夜莺
1 | 滴滴出品,一款经过大规模生产环境验证的、分布式高性能的运维监控系统,基于 Open-falcon 二次开发 |
Zabbix
1 | Zabbix是一个企业级解决方案,支持实时监控数千台服务器,虚拟机和网络设备,采集百万级监控指标,适用于任何IT基础架构、服务、应用程序和资源的解决方案 |
缺点:zabbix 使用 mysql,数据库部分容易成为瓶颈
Prometheus
针对容器环境的开源监控软件
商业监控解决方案
- 监控宝:https://www.jiankongbao.com/ 推荐使用
- 听云:https://www.tingyun.com/
Zabbix 使用场景及系统概述
https://www.zabbix.com/cn/features
使用场景
系统概述
主要功能
数据采集、问题检测、可视化、告警 & 修复、安全 & 认证、轻松部署、自动发现、分布式监控、Zabbix API
数据采集
所有监控系统的工作原理都类似,都需要采集被监控对象的数据
周期性时序数据
1 | - 主机/对象:服务器、路由器、交换机、存储、防火墙、IP、PORT、URL、自定义监控对象… |
数据采集方式:
- zabbix-agent 采集本机数据,然后发送给 zabbix-proxy
- zabbix-proxy 将数据发送给 zabbix-server
注意:不是实时转发,zabbix-proxy 也搭配 mysql,负责临时存储数据 - zabbix-server 只和 zabbix-proxy 保持连接即可,将数据存储到 mysql,结束采集
如果不安装(或者无法安装)agent 客户端,可以使用特定的协议进行数据采集:
1 | - SNMP:适用于路由器、交换机等网络设备 |
数据存储
监控数据存储系统
1 | - SQL: MySQL/MariaDB(Zabbix) |
数据类型
1 | - 历史数据: 每个监控项采集到的每个监控值,查询时可能会造成数据库负载过大,开发和测试也会查看 |
阈值
可按照预定义的阈值等级实现分层报警,可以 80%,不过要考虑基数,Zabbix 用的好不好,就看阈值设置的好不好,需要慢慢优化
告警机制
email、短信、微信、语音、故障自治愈(zabbix 通知服务器重启,需事先写好脚本,针对物理机和虚拟机)
初级运维 –> 中级运维/高级运维 –> 架构师 –> 总监 –> CTO
1 | host (host groups) <- templates # 从模板继承告警配置 |
数据展示
1 | - zabbix web:基于nginx+php |
Zabbix 规划及部署
目前最新的 LTS 版本是 5.0,5.0 和之前版本有明显区别,但是文档还是英文的,所以目前学习还是以 4.0 为准
下载页面:https://www.zabbix.com/cn/download
规划
- 数据库:CPU 和磁盘 IO 一定要快,内存最好 32G,磁盘要大,zabbix 的监控数据会远大于业务数据量
- zabbix server:zabbix server 直接装在物理机
- CPU:16 核
- 磁盘:RAID10、500G
- 内存:8G(监控几十个节点),16G(监控几百个节点),32G(监控两千个节点)
实验:
部署环境:服务器系统 ubuntu 18.04.5 / Centos 7.x
| 主机类型 | IP 地址 |
|---|---|
| zabbix server | 10.0.1.21 |
| zabbix 主动代理 | 10.0.1.22 |
| zabbix 被动代理 | 10.0.1.23 |
| mysql master | 10.0.1.24 |
| mysql slave | 10.0.1.25 |
| web server1 | 10.0.1.26 |
| web server2 | 10.0.1.27 |
yum/apt 安装
Install Zabbix repository
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3+bionic_all.deb
$ls
zabbix-release_4.0-3+bionic_all.deb
$dpkg -c zabbix-release_4.0-3+bionic_all.deb #查看dep包的内容
...
#zabbix.list:官方提供的源
-rw-r--r-- root/root 118 2019-07-30 16:34 ./etc/apt/sources.list.d/zabbix.list
...
$dpkg -i zabbix-release_4.0-3+bionic_all.deb #安装dep包
$vim /etc/apt/sources.list.d/zabbix.list #修改zabbix源
#deb http://repo.zabbix.com/zabbix/4.0/ubuntu bionic main
#deb-src http://repo.zabbix.com/zabbix/4.0/ubuntu bionic main
deb https://mirrors.aliyun.com/zabbix/zabbix/4.0/ubuntu bionic main #替换为阿里云的源
deb-src https://mirrors.aliyun.com/zabbix/zabbix/4.0/ubuntu bionic main
$apt update安装 Zabbix server,Web 前端,agent
1
2
3[root@zabbix-server ~]$apt install zabbix-server-mysql zabbix-frontend-php zabbix-agent
[root@zabbix-server ~]$systemctl disable mysql.service # 数据库单独装,把自带的禁用掉
[root@zabbix-server ~]$systemctl stop mysql.service安装、配置 mysql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[root@mysql-master ~]$apt search mysql-server # 确保mysql版本不低于5.7
[root@mysql-master ~]$apt install mysql-server mysql-client
[root@mysql-master ~]$mysql -uroot -p
# 创建 zabbix_server 数据库
mysql> create database zabbix_server character set utf8 collate utf8_bin;
# 创建 zabbix_server 用户
mysql> create user zabbix_server@'10.0.%.%' identified by '123456';
mysql> grant all privileges on zabbix_server.* to zabbix_server@'10.0.%.%';
[root@mysql-master ~]$vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
bind-address = 0.0.0.0 # 修改监地址,默认监听127.0.0.1,修改为0.0.0.0
[root@mysql-master ~]$systemctl restart mysql.service数据库初始化:
1
[root@zabbix-server ~]$zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix_server -p123456 -h10.0.1.24 zabbix_server
为 Zabbix server 配置数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# 编辑配置文件 /etc/zabbix/zabbix_server.conf
[root@zabbix-server ~]$vim /etc/zabbix/zabbix_server.conf
DBHost=10.0.1.24
DBName=zabbix_server
DBUser=zabbix_server
DBPassword=123456
[root@zabbix-server ~]$grep '^[a-Z]' /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=10.0.1.24
DBName=zabbix_server
DBUser=zabbix_server
DBPassword=123456
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
FpingLocation=/usr/bin/fping
Fping6Location=/usr/bin/fping6
LogSlowQueries=3000为 Zabbix 前端配置 PHP
1
2
3
4
5
6
7# 编辑配置文件 /etc/zabbix/apache.conf
[root@zabbix-server ~]$vim /etc/zabbix/apache.conf
# php_value date.timezone Europe/Riga
php_value date.timezone Asia/Shanghai # 修改时区
# 重启 zabbix 和 apache 服务
[root@zabbix-server ~]$systemctl restart zabbix-server zabbix-agent apache2浏览器访问 http://10.0.1.21/zabbix,然后根据提示一步步配置
![]()
1
2
3
4
5
6
7
8
9
10
11
12
13
14Database type MySQL
Database server 10.0.1.24
Database port 3306
Database name zabbix_server
Database user zabbix_server
Database password 123456
Zabbix server 10.0.1.21 # ip 和 主机名 均可
Zabbix server port 10051
Zabbix server name zabbix_server # 这里随便写
# 如果以后更改配置,需要修改两个文件
# /etc/zabbix/zabbix_server.conf
# /usr/share/zabbix/conf/zabbix.conf.php # 生成的配置在此文件中默认的账号 Admin,密码 zabbix
默认只能显示英文,所以需要汉化
1
2
3
4
5
6
7
8# 安装简体中文语言环境
[root@zabbix-server ~]$apt install language-pack-zh*
# 增加中文语言环境变量
[root@zabbix-server ~]$vim /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
LANG="zh_CN.UTF-8" # 添加此行
# 重新设置本地配置
[root@zabbix-server ~]$dpkg-reconfigure locales![]()
![]()
1
2# 配置好后,需要重启apacha、php-fpm
[root@zabbix-server ~]$systemctl restart apache2 php-fpm![]()
但是,还有部分页面乱码,需要更换默认的字体包:
从 windows(位于 C:\Windows\Fonts) 系统中挑一个顺眼的字体包,上传到服务器
1
2
3
4
5
6
7
8
9
10
11
12
13[root@zabbix-server fonts]$pwd
/usr/share/zabbix/assets/fonts # 注意目录
[root@zabbix-server fonts]$ls | tr ' ' \n
graphfont.ttf # 默认字体
simhei.ttf # 刚上传的 黑体
simkai.ttf # 刚上传的 楷体,这两个都可以,其他的不一定可以
[root@zabbix-server include]$pwd
/usr/share/zabbix/include # 注意目录
# 修改默认字体为黑体,楷体也可以
[root@zabbix-server include]$sed -i 's/graphfont/simkai/' defines.inc.php
[root@zabbix-server include]$systemctl restart apache2 php-fpm![]()
编译安装
官方文档:https://www.zabbix.com/documentation/4.0/zh/manual/installation/install
把 apt 安装的 zabbix-server、zabbix-proxy、zabbix-agent 等软件的 service 文件拷贝出来备用,然后恢复快照
具体详见脚本 script-apt
注意:
server 和 proxy 不能安装在同一台主机
如果是 centos,安装依赖参考:
1
yum install gcc libxml2-devel net-snmp net-snmp-devel curl curl-devel php phpbcmath php-mbstring mariadb mariadb-devel -y
汉化操作需要手动执行,脚本没有实现这个功能,不要忘记重启 php-fpm
Zabbix 监控入门基础
- 了解业务结构
- 监控
- 业务优化
zabbix 概念
配置
模板:
- 键值(key):最基础的指令,每个键值表示一项数据,比如
system.hostname表示主机名,zabbix 内置了 一些,如果不够用,可以自定义(需要在 zabbix_agentd.conf 中指定) - 监控项(item):主要是由 键值 + 更新周期 组成
- 应用集:对监控项分组,功能类似的监控项的合集
- 触发器:据监控项的返回值对比预先设置的阈值,触发器会触发动作
- 表达式:功能一般选择 last
- 图形:
- 自动发现:
- web 场景/web 检测:
- 键值(key):最基础的指令,每个键值表示一项数据,比如
主机群组
- 1
主机
- d
维护
- w
动作
动作:动作由触发器触发,触发动作选项用来限制触发器的范围,一般选主机群组,只有该主机群组中的主机的触发器可以触发动作,多个触发条件可以选择和/或的关系
操作:动作的操作会调用报警媒介,发送到指定用户,毕竟数据库出问题,需要发给 DBA,发给网络工程师也不管用
默认操作步骤持续时间:发送周期,一般配置 60s,即 60 秒发一次
默认标题 和 消息内容:用{}包裹的变量是宏,zabbix 所有内置的宏,参考:官方文档
1
2
3
4# 示例:
{ALERT.SENDTO} # 报警脚本参数,值来自于用户报警媒介配置,可能是邮件、手机号等等
{ALERT.SUBJECT} # 报警脚本参数,默认值由动作配置
{ALERT.MESSAGE} # 报警脚本参数,默认值由动作配置
恢复操作:解决完报警信息后,恢复信息也要发送
更新操作:
关联事件
- 4
自动发现:添加/移除/更改元素时执行自动操作
https://www.zabbix.com/cn/auto_discovery
https://www.zabbix.com/documentation/4.0/zh/manual/discovery/network_discovery- 网络发现:定期扫描、发现设备类型,IP,状态,运行时间/停机时间等,并采取预定义的操作。
- 低级别发现(LLD):自动为设备上不同元素创建监控项,触发器和图形。
- 主动 agent 自动注册 使用 Zabbix agent 自动开始监控新设备
服务
- 2
管理
- agent 代理程序:即 proxy
- 报警媒介类型:把报警信息通知给用户的方式,可以配置邮件、短信、微信(通过脚本实现)等方式,以 qq 邮件为例,将 qq 邮箱和用户关联起来,发生报警后,qq 邮箱作为发件人将报警信息发送到用户的邮箱中
- 用户
zabbix server
官方文档:https://www.zabbix.com/documentation/4.0/zh/manual/concepts/server
zabbix server 是整个 zabbix 软件的核心程序。
zabbix server 是所有配置、统计和操作数据的中央存储中心,也是 zabbix 监控系统的告警中心。
基本的 zabbix server 的功能分解成为三个不同的组件。他们是:zabbix server、web 前端和数据库。
zabbix proxy
官方文档:https://www.zabbix.com/documentation/4.0/zh/manual/concepts/proxy
zabbix proxy 代表 zabbix server 采集监控数据,减轻 zabbix server 的 cpu 和 io 开销。
zabbix proxy 从受监控设备采集监控数据,先将数据缓存到本机数据库,然后传输到所属的 zabbix server。
zabbix agent
官方文档:https://www.zabbix.com/documentation/4.0/zh/manual/concepts/agent
proxy 和 agent 都是代理,但前者是 服务端,后者是客户端
zabbix agent 部署在被监控目标上,以主动监控本地资源和应用程序(硬盘、内存、处理器统计信息等)。
zabbix agent 收集本地的操作信息并将数据报告给 zabbix server 用于进一步处理。一旦出现异常 (例如硬盘空间已满或者有崩溃的服务进程),zabbix server 会主动警告管理员指定机器上的异常。
zabbix agents 的极高效率缘于它可以利用本地系统调用来完成统计数据的采集。
默认监听在 10051 端口。
sender
主要用于测试的命令,例如:如果 Zabbix agent 收集不到数据,可以用这个命令发一下测试数据,看一下是 Zabbix agent 的问题还是网络问题
get
主要用于测试的命令,可以与 Zabbix agent 进行通信,并从 Zabbix agent 那里获取所需的信息
注意:只有 zabbix_agentd.conf 中 Server 配置的 ip 才能从该主机上 get 到数据
监控 tomcat
所有的监控,配置步骤都是一样的:
- 创建主机
- 给主机添加模板
主动与被动监控模式
主动和被动都是相对 agent 来说的,被动模式配置简单,所以默认是被动模式
- 被动检查:zabbix server(或 proxy)向 agent 要数据,agent 才工作,否则就不工作
- 主动检查:agent 从 zabbix server 获取监控项列表,然后定期采集数据,主动发送给 zabbix server
被动模式
被动模式下,zabbix server 会根据主机关联的模板中的监控项和数据采集间隔时间,周期性的打开随机端口并向 zabbix agent 服务器的 10050 发起 tcp 连接,然后发送获取监控项数据的指令,即 zabbix server 发送什么指令,zabbix agent 就收集什么数据,zabbix server 什么时候发送 zabbix agent 就什么时候采集,zabbix server 不发送 zabbix agent 就闲着,所以 zabbix agent 也不用关心其监控项和数据采集周期间隔时间
优点就是配置简单,缺点是会加大 zabbix server 的工作量,在数百甚至数千台服务器的环境下会导致 zabbix server 需要轮训向每个 zabbix agent 发送数据采集指令,如果 zabbix server 负载很高还会导致不能及时获取到最新数据
主动模式
主动模式下,zabbix agent 主动向 zabbix server 的 10051 端口发起 tcp 连接请求(zabbix agent 配置文件中指定 zabbix server 的 IP 或者主机名),获取到自己的监控项和数据采集周期等信息,然后再周期性的采集指定的数返回给 zabbix server
主动模式可以有效减轻 zabbix server 的压力,推荐使用主动模式
配置主动模式:
修改 zabbix agent 配置文件
1
2
3
4
5
6
7
8
9
10# zabbix_agentd.conf
PidFile=/usr/local/zabbix/run/zabbix_agentd.pid
LogFile=/tmp/zabbix_agentd.log
LogFileSize=0
Server=10.0.1.21 # 被动模式下,指定zabbix server的ip,如果全部监控项都是主动模式,则可注释此项
StartAgents=3
ServerActive=10.0.1.21 # 重点,开启主动模式,指定zabbix server的ip
Hostname=10.0.1.26 # zabbix agent本机的ip
Timeout=30
Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf生成主动模式模板
完全克隆 zabbix 内置的 Template OS Linux 模板,命名为:Template OS Linux-active,修改监控项的类型,可以单独改,也可以批量更新![]()
最后把主动模式模板添加到主机上
zabbix proxy
zabbix proxy 架构

zabbix proxy 对比 zbbbix server
| 功能 | zabbxy proxy | zabbix server |
|---|---|---|
| 量级 | 请量级 | 相对重量级 |
| 图形 | 无 | 带图形控制界面 |
| 可以独立工作 | 是,可以独立采集数据并存储 | 是,即数据采集、存储、分析、展示于一体 |
| 易维护 | 是,配置完成后基本无需管理 | 维护也不难 |
| 独立数据库 | 保留少量最近数据 | 保留指定时间内的所有数据 |
| 报警通知 | 不支持发送邮件通知 | 支持邮件、短信等告警机制(基于调用脚本) |
zabbix proxy 部署与使用
zabbix proxy 的大版本必须要和 zabbix server 版本一致,否则会出现兼容性问题
apt/yum 安装 zabbix proxy
https://www.zabbix.com/documentation/4.0/zh/manual/installation/install_from_packages/debian_ubuntu
1 | # 安装软件仓库配置包 |
编译安装 zabbix proxy
- 编译安装,参考脚本…
- 修改被监控主机的配置文件,Server 和 ServerActive
- 管理 -> agent 代理程序 -> 创建代理(注意名称要和 zabbix_proxy.conf 中的 hostname 对应起来) -> 修改主机的“由 agent 代理程序监测”参数
zabbix 监控案例实战
- 自定义监控项
- 通过脚本采集监控项数据
- zabbix agent 获取监控项数据
- 自定义模板和图形及触发器
- 验证数据
监控 Linux TCP 连接状态
监控 TCP 连接数脚本
1
2
3[root@zabbix-web1 ~]#cat /usr/local/zabbix/data/tcp_conn.sh
#!/bin/bash
ss -ant | awk -v TCP_STAT=$1 -v s=0 '$1==TCP_STAT {++s} END {print s}'zabbix agent 添加自定义监控项
1
2
3
4
5
6[root@web1 etc]$vim zabbix_agentd.conf
...
UserParameter=tcp_status[*],/bin/bash /usr/local/zabbix/data/tcp_conn.sh $1 $2
...
[root@web1 etc]$chmod a+x zabbix_agentd.conf
[root@web1 etc]$systemctl restart zabbix-agentzabbix server 测试监控项数据
1
2
3
4
5
6[root@zabbix bin]$./zabbix_get -s 10.0.1.26 -p 10050 -k tcp_status[TIME-WAIT]
1
[root@zabbix bin]$./zabbix_get -s 10.0.1.26 -p 10050 -k tcp_status[ESTAB]
2
[root@zabbix bin]$./zabbix_get -s 10.0.1.26 -p 10050 -k tcp_status[LISTEN]
9zabbix web 导入模板
配置-模板-导入将 TCP 监控模板关联至主机
验证监控数据
监控 Memcached
安装 memcached
监控脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94[root@web1 data]$grep '^[^#]' /etc/memcached.conf
-d
logfile /var/log/memcached.log
-m 64
-p 11211
-u memcache
-l 127.0.0.1
-P /var/run/memcached/memcached.pid
[root@web1 data]$echo -e "stats\nquit" | nc 127.0.0.1 11211
STAT pid 5590
STAT uptime 725
STAT time 1613618905
STAT version 1.5.6 Ubuntu
STAT libevent 2.1.8-stable
STAT pointer_size 64
STAT rusage_user 0.072870
STAT rusage_system 0.048580
STAT max_connections 1024
STAT curr_connections 1
STAT total_connections 4
STAT rejected_connections 0
STAT connection_structures 2
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
STAT get_misses 0
STAT get_expired 0
STAT get_flushed 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 35
STAT bytes_written 3795
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT slab_reassign_rescues 0
STAT slab_reassign_chunk_rescues 0
STAT slab_reassign_evictions_nomem 0
STAT slab_reassign_inline_reclaim 0
STAT slab_reassign_busy_items 0
STAT slab_reassign_busy_deletes 0
STAT slab_reassign_running 0
STAT slabs_moved 0
STAT lru_crawler_running 0
STAT lru_crawler_starts 1275
STAT lru_maintainer_juggles 774
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT slab_global_page_pool 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evicted_active 0
STAT evictions 0
STAT reclaimed 0
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
STAT moves_to_cold 0
STAT moves_to_warm 0
STAT moves_within_lru 0
STAT direct_reclaims 0
STAT lru_bumps_dropped 0
END
[root@web1 data]$cat memcache_monitor.sh
#!/bin/bash
echo -e "stats\nquit" | nc 127.0.0.1 11211 | grep "STAT $1" | awk '{print $3}'zabbix agent 添加自定义监控项
zabbix server 测试监控项数据
zabbix web 制作模板
- 创建模板
- 创建监控项
- 创建触发器
- 创建图形
模板关联主机
验证监控项数据
监控 Redis
安装 Redis
监控脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32[root@web1 data]$redis-cli -h 127.0.0.1 -p 6379 info # 所有info
...
[root@web1 data]$redis-cli -h 127.0.0.1 -p 6379 info clients # 客户端相关info
# Clients
connected_clients:1 # 当前连接数
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
[root@web1 data]$redis-cli -h 127.0.0.1 -p 6379 info memory # 内存相关info
# Memory
used_memory:839288 # 已用内存
used_memory_human:819.62K
used_memory_rss:3846144
used_memory_rss_human:3.67M
used_memory_peak:841288
used_memory_peak_human:821.57K
used_memory_peak_perc:99.76%
used_memory_overhead:832134
used_memory_startup:782504
used_memory_dataset:7154
used_memory_dataset_perc:12.60%
total_system_memory:2065870848
total_system_memory_human:1.92G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:4.58
mem_allocator:jemalloc-3.6.0
active_defrag_running:0
lazyfree_pending_objects:0zabbix agent 添加自定义监控项
zabbix server 测试监控项数据
zabbix web 模板制作
- 创建模板
- 创建触监控项:当前连接数监控项、已用内存监控项
- 创建触发器:当前连接数触发器、已用内存触发器
- 创建图形:Redis 当前连接数图形、Redis 已用内存图形
模板关联主机
验证监控项数据
监控 Nginx

安装 nginx
监控脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
nginx_active() {
curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Active' | awk '{print $NF}'
}
nginx_reading() {
curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Reading' | awk '{print $2}'
}
nginx_writing() {
curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Writing' | awk '{print $4}'
}
nginx_waiting() {
curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | grep 'Waiting' | awk '{print $6}'
}
nginx_accepts() {
curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | awk NR==3 | awk '{print $1}'
}
nginx_handled() {
curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | awk NR==3 | awk '{print $2}'
}
nginx_requests() {
curl "http://127.0.0.1:/nginx_status/" 2>/dev/null | awk NR==3 | awk '{print $3}'
}
case $1 in
active)
nginx_active
;;
reading)
nginx_reading
;;
writing)
nginx_writing
;;
waiting)
nginx_waiting
;;
accepts)
nginx_accepts
;;
handled)
nginx_handled
;;
requests)
nginx_requests
;;
esaczabbix agent 添加自定义监控项
1
2
3
4[root@web1 etc]$cat zabbix_agentd.conf
...
UserParameter=nginx_status[*],/usr/local/zabbix/data/nginx_status.sh $1
...导入 Nginx 监控模板
模板关联主机
验证监控数据
SNMP 监控
SNMP:Simple Network Management Protocol,简单网络管理协议,TCP/IP 协议簇的一个应用层协议
Linux 设备通过 agent 监控,网络设备通过 SNMP 协议监控,主要用于监控华为、思科等网络设备
SNMP 有三个版本:目前主要使用的是 v2c 版本
1 | SNMP v1 # 团体名(Community Name)认证 |

SNMP 数据交互
SNMP 管理进程与代理进程之间为了交互信息,定义了 5 种报文:
1 | get-request # 从代理进程处提取一个或多个参数值 |


SNMP 组织结构
SNMP 结构非常复杂,一套完整的 SNMP 系统主要包括以下几个方面:
- SNMP 报文协议
- 管理信息结构(SMI, Structure of Management Information),一套公用的结构和表示符号
- 管理信息库(MIB,Management Information Base),管理信息库包含所有代理进程的所有可被查询和修改的参数
- OID(Object Identifiers),一个 OID 是一个唯一的键值对,用于标识具体某一个设备的某个具体信息(对象标识),如端口信息、设备名称等
SNMP MIB
MIB 是 OID 的集合。MIB 是基于对象标识树的,对象标识是一个整数序列,中间以”.”分割,这些整数构成一个树型结构,类似于 DNS 或 Unix 的文件系统,MIB 被划分为若干个组,如 system、 interfaces、 a t(地址转换)和 ip 组等。iso. org.dod.internet.private.enterprises(1.3 .6 .1.4.1)这个标识,是给厂家自定义而预留的,比如华为:1.3.6.1.4.1.2011,华三:1.3.6.1.4.1.25506

SNMP OID
OID 就是对象标识
snmpwalk 工具可以使用 SNMP 的 get 请求查询指定 OID 入口的所有 OID 树信息。通过 snmpwalk 也可以查看支持 SNMP 协议(可网管)的设备的一些其他信息,比如 cisco 交换机或路由器 IP 地址、内存使用率等,也可用来协助开发 SNMP 功能
ubuntu 中版本较新,这里以 centos7 为例:
1 | $yum -y install net-snmp-utils |
配置 zabbix
使用 zabbix 自带的 SNMP,要先修改团体名称,否则 会因为团体名不一致导致 zabbix 没有权限去获取被监控服务器的 snmp 利用率



监控 MySQL
监控 MySQL 连接数、主从同步、同步延迟等
percona-monitoring-plugins
percona 官方出了专门的监控管理软件,所以已经停止维护 percona-monitoring-plugins,以下使用旧的版本
监控脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[root@mysql-master src]$wget https://downloads.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/debian/artful/x86_64/percona-zabbix-templates_1.1.8-1.artful_all.deb
$dpkg -c percona-zabbix-templates_1.1.8-1.artful_all.deb | awk '{print $NF}'
...
./var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh # 监控脚本,修改手动修改
./var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php # 设置mysql的用户名和密码
./var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf # userparameter
./var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml # 模板文件,直接导入即可
...
$dpkg -i percona-zabbix-templates_1.1.8-1.artful_all.deb
$cp /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh /usr/local/zabbix/data/
$vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
<?php
...
$mysql_user = 'root';
$mysql_pass = '123456';
...新建模板:直接导入
zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml即可新建主机,并连接到刚创建的模板
自定义脚本监控 MySQL
编写脚本监控脚本 MySQL 主从同步及延迟
slave 机器上有两个关键的进程:
- Slave_SQL_Running:负责自己的 slave mysql 进程
- Slave_IO_Running:负责与主机的 io 通信
1 | # 主从延迟,实际上只靠 Seconds_Behind_Master 这一个参数是不够的 |
自定义端口和进程监控
zabbix 内置相关 key:
1 | # 检查 TCP 端口 是否处于侦听状态。返回 0 - 未侦听;1 - 正在侦听 |
故障自治愈功能
当 zabbix 监控到指定的监控项异常的时候,通过指定的操作使故障自动恢复,通常是重启服务等一些简单的操作,也可以调用脚本执行比较复杂的操作
设置监控项和触发器,新建动作,在触发条件里面添加操作,在远程主机通过 zabbix 客户端执行命令
zabbix agent 需要开启远程命令执行
1
2
3# zabbix_agentd.conf
EnableRemoteCommands=1 # 开启远程执行命令
UnsafeUserParameters=1 # 允许远程执行命令的时候使用不安全的参数(特殊字符串)zabbix 用户授权
1
2# /etc/sudoers
zabbix ALL = NOPASSWD: ALL # 授权指定用户执行特殊命令不再需要密码,比如sudo等创建动作
配置–动作–创建动作![]()
执行远程操作
![]()
验证自治愈功能
将被测试的服务手动停止运行,验证能否自动启动或重启,更多操作可以远程执行脚本
手动将 Nginx、Tomcat 等 web 服务停止后,验证 zabbix agent 能否自动启动或重启
grafana 图形展示
grafana 本身只是一个图形显示工具,它独立于 zabbix 之外,通过 zabbix 提供的 api 获取数据,进行展示,其实不只是 zabbix,它还可以搭配 prometheus、elasticsearch、mysql 等等,只要你提供数据,它都能给你展示出来
grafana 相比 zabbix 自带的 web 界面,更加好看

安装 grafana 服务
https://grafana.com/grafana/download?platform=linux1
2
3sudo apt-get install -y adduser libfontconfig1
wget https://dl.grafana.com/oss/release/grafana_7.4.2_amd64.deb
sudo dpkg -i grafana_7.4.2_amd64.debgrafana 安装并启用 zabbix 插件
https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app1
2
3
4
5
6
7
8grafana-cli plugins install alexanderzobnin-zabbix-app
# 以上方式可能失败,推荐直接下载,然后移动到插件目录
$wegt https://storage.googleapis.com/plugins-community/alexanderzobnin-zabbix-app/release/4.1.2/alexanderzobnin-zabbix-app-4.1.2.zip
$unzip alexanderzobnin-zabbix-app-4.1.2.zip
$mv alexanderzobnin-zabbix-app /var/lib/grafana/plugins/
$systemctl restart grafana-server.service启动 zabbix 插件
![]()
![]()
添加 zabbix 数据源
添加 mysql 数据源
![]()
![]()
添加 zabbix 数据源
![]()
![]()
添加 Dashboard
![]()
自定义基础监控模板
略…
结合 pyhton 脚本监控案例
kubernetes 集群状态监控脚本
1 | [root@kubernetes-master1 ~]# cat /usr/local/zabbix/data/k8s_monitor.py |
监控 MongodbDB 复制集状态
1 | #cat /usr/local/zabbix/data/mongodb_cluster_monitor.py |
监控 Redis 列表长度
1 | [root@redis ~]#cat /usr/local/zabbix/data/redis_llen.py |
监控 ELK 集群状态
1 | [root@elk-s1 ~]# vim /usr/local/zabbix/data/els_status.py |
监控 RabbitMQ 集群节点状态
1 | #cat /usr/local/zabbix/data/rabbit_cluster_monitor.py |
Zabbix 事件通知机制
出现故障报警的时候,可以通过不同方式通知管理员进行故障处理,尽快恢复业务
1 | # zabbix_server.conf |
报警的最核心就是把报警媒介配置好,包括它前后的部分

- 添加报警媒介(邮件、短信、微信)
- 将报警媒介添加到动作的操作中,这样通过动作,就将触发器和报警媒介关联起来了
- 将报警媒介添加到用户,这样,当有触发器报警,就会通过报警媒介通知到用户
邮件通知

短信通知

微信通知
略..,和短信通知差不多
Zabbix 自动化运维
批量部署 Agent
使用 agent,实现 agent 的自动化批量安装,可以通过源码或 apt 等方式安装
API
通过 zabbix web 进行的操作,都提供对应的 API,可以通过编程的方式实现
API 简介:https://www.zabbix.com/documentation/4.0/zh/manual/api
API 列表:https://www.zabbix.com/documentation/4.0/zh/manual/api/reference














