zabbix总结
zabbix-server 10051
zabbix-agent 10050
zabbix-proxy 10051
1.监控项(模板):获取监控数据
#模板直接链接到新的主机
2.触发器:设置一个值 在非合理区间报警
3.动作:可以帮忙发送通知(告警)
#需要媒介(钉钉、邮箱、短信、电话、企业微信)
4.网络发现 (自动发现动作--添加主机--添加主机组--添加模板--添加监控项--执行远程命令-发送通知)
5.web场景(监测) 监控网站页面(下载速度--访问时间--访问状态码)
6.分布式监控 (server)通过(proxy) 监控其他需要被监控的节点
7.主动监控:(减轻server端压力)agent端主动向server请求与自己相关监控配置,主动将server配置的监控项的相关数据发送给server端
被动监控:server端向agent端请求获取监控项配置的相关数据,agent端响应,并将数据发送给server端
9.zabbix-proxy 减轻server端的压力 (代理程序)
#10.主机群组(对主机进行分类)
zabbix
官网www.zabbix.com
安装部署
# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
# yum clean all
# yum install zabbix-server-mysql zabbix-agent
# yum install centos-release-scl
vim /etc/yum.repos.d/zabbix.repo
[zabbix-frontend]
name=Zabbix Official Repository frontend - $basearch
baseurl=http://repo.zabbix.com/zabbix/5.0/rhel/7/$basearch/frontend
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-ZABBIX-A14FE591
# yum install zabbix-web-mysql-scl zabbix-nginx-conf-scl
安装mysql
清理环境
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
rm -rf /var/log/mysql*
yum -y erase mysql* mariadb* //卸载残留
下载yum源的rpm包
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
永久修改下载版本
yum -y install yum-utils //安装工具
yum-config-manager --disable mysql80-community //关闭8.0
yum-config-manager --enable mysql57-community //打开5.7
安装mysql
yum -y groupinstall "Development Tools"
yum -y install mysql-community-server
systemctl start mysqld //首次启动初始化mysql
修改密码策略
echo "validate-password=off" >> /etc/my.cnf
systemctl restart mysqld
修改密码
grep "password" /var/log/mysqld.log //日志中查找初始密码
mysqladmin -p'旧密码' password '0'
创建初始数据库
Make sure you have database server up and running.
在数据库主机上运行以下代码。
# mysql -uroot -ppassword
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;
导入初始架构和数据,系统将提示您输入新创建的密码。
# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
Disable log_bin_trust_function_creators option after importing database schema.
# mysql -uroot -ppasswordmysql> set global log_bin_trust_function_creators = 0;
mysql> quit;
为Zabbix server配置数据库
编辑配置文件
vim /etc/zabbix/zabbix_server.conf
DBPassword=password
为Zabbix前端配置PHP
编辑配置文件 /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf uncomment and set ‘listen’ and ‘server_name’ directives.
vim /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf
# listen 80;
# server_name example.com;
编辑配置文件 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf add nginx to listen.acl_users directive.
vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
listen.acl_users = apache,nginx
Then uncomment and set the right timezone for you.
; php_value[date.timezone] = Asia/Shanghai
修改zabbix的nginx文件
vim /etc/opt/rh/rh-nginx116/nginx/nginx.conf
将里面的server块删掉
启动Zabbix server和agent进程
启动Zabbix server和agent进程,并为它们设置开机自启:
# systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
# systemctl enable zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
浏览器访问ip
Configure DB connection页面
数据库
mysql所在服务器
port端口0==默认端口
name数据库姓名
user数据库用户名
password数据库密码
Zabbix server details页面
host:主机名字
port:zabbix的端口
name:与主机名一致
登录账户名密码
Admin
zabbix
查看日志
tailf /var/log/zabbix/zabbix_server.log
一、User parameters 用户参数
官方预定义监控项文档
1、介绍和用法
① 介绍
自定义用户参数,也就是自定义key
有时,你可能想要运行一个代理检查,而不是Zabbix的预定义
你可以编写一个命令来检索需要的数据,并将其包含在代理配置文件("UserParameter"配置参数)的用户参数中
② 用法格式 syntax
UserParameter=,
A user parameter also contains a key 一个用户参数也包含一个键
The key will be necessary when configuring an item 在配置监控项时,key是必需的
Note: Need to restart the agent 注意:需要重新启动agent 服务
2、用法展示
(1)修改agent 端的配置,设置用户参数
① free | awk ‘/^Mem/{print $3}’ 自己需要查找的参数的命令
② 修改配置文件,把查找参数的命令设为用户参数
cd /etc/zabbix/zabbix_agentd.d/
vim memory_usage.conf
UserParameter=memory.used,free | awk ‘/^Mem/{print $3}’
③ systemctl restart zabbix-agent.service 重启agent 服务
(2)在zabbix-server 端,查询
如果显示未找到命令 就先下载
yum list all | grep zabbix
yum install -y zabbix-get.x86_64
zabbix_get -s 192.168.30.7 -p 10050 -k “memory.used”
(3)在监控上,设置一个item监控项,使用这个用户参数
(4)查询graph 图形
3、用法升级
(1)修改agent 端的配置,设置用户参数
① 命令行查询参数的命令
② 修改配置文件,把查找参数的命令设为用户参数
UserParameter=memory.stats[*],cat /proc/meminfo | awk '/^$1/{print $$2}’
分析:$$2:表示不是前边调位置参数的$2 ,而是awk 的参数$2
注意:$1是调用前边的[*],位置参数,第一个参数
(2)在zabbix-server 端,查询使用这个用户参数的key
(3)在监控上,设置一个item监控项,使用这个用户参数
① 添加Memory Total 的item监控项,使用memory.stats[MemTotal] 的用户参数
在进程中定义倍数,规定单位
② clone 克隆Memory Total 创建Memory Free 的监控项
memory.stats[MemFree] 用户参数
③ 创建Memory Buffers 的item 监控项,使用 memory.stats[Buffers] 的key
(4)上面3个监控项的graph 图形
① memory total
② memory free
③ buffers
4、使用用户参数监控php-fpm 服务的状态
在agent 端:
(1)下载,设置php-fpm
① yum -y install php-fpm
② vim /etc/php-fpm.d/www.conf 打开php-fpm的状态页面
user = nginx
group = nginx
pm.status_path = /php-fpm-status #php-fpm 的状态监测页面
ping.path = /ping #ping 接口,存活状态是否ok
ping.response = pong #响应内容pong
③ systemctl start php-fpm 开启服务
(2)设置nginx ,设置代理php,和php-fpm的状态页面匹配
① vim /etc/nginx/nginx.conf
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~* /(php-fpm-status|ping) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
allow 127.0.0.1; #因为这个页面很重要,所有需加访问控制
deny all;
access_log off; #访问这个页面就不用记录日志了
}
② systemctl start nginx 开启nginx服务
(3)在agent 端,设置用户参数
① 查询 curl 192.168.30.7/php-fpm-status
② 设置
cd /etc/zabbix/zabbix_agentd.d/
vim php_status.conf
UserParameter=php-fpm.status[*],curl -s http://127.0.0.1/php-fpm-status | awk ‘/^$1/{print $$NF}’
分析:设置用户参数为php-fpm.stats[*], 1 为第一个参数; 1为第一个参数; 1为第一个参数;$NF为awk中的参数,倒数第一列
③ 重启服务
systemctl restart zabbix-agent
(4)在zabbix-server 端,查询使用这个用户参数的key
zabbix_get -s 192.168.30.7 -p 10050 -k “php-fpm.stats[idle]”
zabbix_get -s 192.168.30.7 -p 10050 -k “php-fpm.stats[active]”
zabbix_get -s 192.168.30.7 -p 10050 -k “php-fpm.stats[max active]”
(5)创建一个模板,在模板上创建4个item监控项,使用定义的用户参数
① 创建一个模板
② 在模板上配置items 监控项,使用刚定义的用户参数
fpm.stats[total processes]
③ 再clone克隆几个items监控项
fpm.stats[active processes]
④ fpm.stats[max active processes]
⑤ fpm.stats[idle processes]
(6)host主机链接模板
(7)查看graph 图形
① php-fpm total processes
② php-fpm active processes
③ php-fpm max active processes
④ php-fpm idle processes
(8)把模板导出,可以给别人使用
① 导出模板
最下面有导出
② 自己定义用户参数的文件,也不要忘记导出
/etc/zabbix/zabbix_agentd.d/php_status.conf
4)触发器(trigger)
① 简介
当我们的采集的值定义完了以后,就可以来定义触发器了。
我们触发器的定义是:界定某特定的item采集到的数据的非合理区间或非合理状态。通常为逻辑表达式。
逻辑表达式(阈值):通常用于定义数据的不合理区间,其结果如下:
OK
(不符合条件):正常状态 --> 较老的zabbix版本,其为FALSE;
PROBLEM
(符合条件):非正常状态 --> 较老的zabbix版本,其为TRUE;
一般,我们评定采样数值是否为合理区间的比较稳妥的方法是——根据最后N次的平均值来判定结果;这个最后N次通常有两种定义方式:
- 最近N分钟所得结果的平均值
- 最近N次所得结果的平均值
而且,我们的触发器存在可调用的函数:
nodata() #是否采集到数据,采集不到则为异常
last() #最近几次的平均值
date()
time()
now()
dayofmonth()
…
注:能用数值保存的就不要使用字符串
② 触发器表达式
基本的触发器表达式格式如下所示
{<server>:<key>.<function>(<parameter>)}<operator><constant>
server
:主机名称;key
:主机上关系的相应监控项的key;function
:评估采集到的数据是否在合理范围内时所使用的函数,其评估过程可以根据采取的数据、当前时间及其它因素进行;- 目前,触发器所支持的函数有avg、count、change、date、dayofweek、delta、diff、iregexp、last、max、min、nodata、now、sum等
parameter
:函数参数;大多数数值函数可以接受秒数为其参数,而如果在数值参数之前使用“#”做为前缀,则表示为最近几次的取值,如sum(300)表示300秒内所有取值之和,而sum(#10)则表示最近10次取值之和;- 此外,avg、count、last、min和max还支持使用第二个参数,用于完 成时间限定;例如,max(1h,7d)将返回一周之前的最大值;
表达式所支持的运算符及其功能如下图所示:
③ 定义一个触发器
我们可以查看一下rate of packets(in)
的值,并以其为标准确定我们的非正常的值:
图中我们可以看出,我们的最大值为36,最小值为23,平均值为30。这样的话,我们可以定义50以上的都是非正常的值,这里为了测试定义为30。
下面我们来定义一个触发器:
进入:配置 —> 主机 —> node1 —> 触发器 —> 创建触发器
我们的表达式可以直接点击右侧的添加,然后定义自己所需的内容,即可自动生成:
生成完毕后,我们就点击页面下方的添加,即成功定义了一个触发器,同时页面自动跳转:
然后我们去看一下我们刚刚定义了触发器的那个监控项:
我们可以看出,这个里面就有了一根线,就是我们刚刚定义的值,超过线的即为异常状态,看起来非常直观。
但是,现在即使超过了这根线,也仅仅会产生一个触发器事件而不会做其他任何事。因此,我们就需要去定义一个动作(action)。
④ 触发器的依赖关系
我们的触发器彼此之间可能会存在依赖关系的,一旦某一个触发器被触发了,那么依赖这个触发器的其余触发器都不需要再报警。 我们可以来试想一下这样的场景:
我们的多台主机是通过交换机的网络连接线来实现被监控的。如果交换机出了故障,我们的主机自然也无法继续被监控,如果此时,我们的所有主机统统报警……想想也是一件很可怕的事情。要解决这样的问题,就是定义触发器之间的依赖关系,当交换机挂掉,只它自己报警就可以了,其余的主机就不需要在报警了。这样,也更易于我们判断真正故障所在。
注意:目前zabbix不能够直接定义主机间的依赖关系,其依赖关系仅能通过触发器来定义。
我们来简单举一个例子,示范一下如何定义一个依赖关系,触发器可以有多级依赖关系,比如我们看下面的例子:
5)定义动作(action)
① 简介
我们需要去基于一个对应的事件为条件来指明该做什么事,一般就是执行远程命令或者发警报。
我们有一个告警升级的机制,所以,当发现问题的时候,我们一般是先执行一个远程操作命令,如果能够解决问题,就会发一个恢复操作的讯息给接收人,如果问题依然存在,则会执行发警报的操作,一般默认的警报接收人是当前系统中有的zabbix用户,所以当有人需要收到警报操作的话,我们则需要把它加入我们的定义之中。
其次,每一个用户也应该有一个接收告警信息的方式,即媒介,就像我们接收短信是需要有手机号的一样。
我们的每一个监控主机,能够传播告警信息的媒介有很多种,就算我们的每一种大的媒介,能够定义出来的实施媒介也有很多种。而对于一个媒介来说,每一个用户都有一个统一的或者不同的接收告警信息的端点,我们称之为目标地或者目的地。
综上,为了能够发告警信息,第一,我们要事先定义一个媒介,第二,还要定义这个媒介上用户接收消息的端点(当然,在用户上,我们也称之为用户的媒介)。
我们可以去看一下系统内建的媒介类型:
这里我们看到,系统已经集成了许多的报警媒介,我们来配置公网邮箱报警
测试成功后,就可以使用配置好的邮件报警媒介了
② 定义一个动作(action)
我们之前说过了,动作是在某些特定条件下触发的,比如,某个触发器被触发了,就会触发我们的动作。
现在,我们基于redis来定义一个动作。
首先,我们在agent端使用yum安装一下redis
:
[root@zabbix-slave1 ~]# yum install redis -y
修改一下配置文件:
[root@zabbix-slave1 ~]# vim /etc/redis.conf
bind 0.0.0.0 #不做任何认证操作
修改完成以后,我们启动服务,并检查端口:
[root@zabbix-slave1 ~]# systemctl start redis
[root@zabbix-slave1 ~]# ss -nutlp | grep redis
tcp LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=5250,fd=4))
接着,我们就可以去网站上来定义相关的操作了:
1.定义监控项
进入 配置 —> 主机 —> node1 —> 监控项(items)—> 创建监控项
填写完毕以后,我们点击下方的添加。
该监控项已成功添加。
我们可以去查看一下他的值:
检测中 —> 最新数据
2.定义触发器
定义好了监控项以后,我们亦可来定义一个触发器,当服务有问题的时候,我们才能及时知道:
进入 配置 —> 主机 —> node1 —> 触发器(trigger)—> 创建触发器
填写完毕以后,我们点击下方的添加。
该触发器已成功添加。
我们去查看一下:
监测中 —> 最新数据
我们来手动关闭redis服务来检测一下:
[root@zabbix-slave1 ~]# systemctl stop redis.service
进入 监测中 —> 问题
可以看到,现在已经显示的是问题了。并且有持续的时间,当我们的服务被打开,会转为已解决状态:
[root@zabbix-slave1 ~]# systemctl start redis.service
3.定义动作(action)
现在我们就可以去定义action了。
进入 配置 —> 动作 —> 创建动作(注意选择事件源为触发器)
我们可以进行操作添加:
我们可以看出,还需要在虚拟机上进行两项操作,一是修改sudo配置文件使zabbix用户能够临时拥有管理员权限;二是修改zabbix配置文件使其允许接收远程命令。我们进行如下操作:
[root@zabbix-slave1 ~]# visudo #相当于“vim /etc/sudoers”
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
zabbix ALL=(ALL) NOPASSWD: ALL #添加的一行,表示不需要输入密码
[root@zabbix-slave1 ~]# vim /etc/zabbix/zabbix_agentd.conf
EnableRemoteCommands=1 #允许接收远程命令 修改原有的值,不要在末尾追加
LogRemoteCommands=1 #把接收的远程命令记入日志
[root@zabbix-slave1 ~]# systemctl restart zabbix-agent.service
我们添加了第一步需要做的事情,也就是重启服务,如果重启不成功怎么办呢?我们就需要来添加第二步:
添加完成以后,我们可以看一下:
操作添加完了,如果服务自动恢复了,我们可以发送消息来提示:
至此,我们的动作设置完毕,可以点击添加了,添加完成会自动跳转至如下页面:
现在我们可以手动停止服务来进行测试:
[root@zabbix-slave1 ~]# systemctl stop redis.service
然后我们来到问题页面来查看,发现确实有问题,并且已经解决:
我们可以去查看是否收到邮件
也可以去agent端查看端口是否开启:
[root@zabbix-slave1 ~]# systemctl stop redis.service
[root@zabbix-slave1 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:6379 *:*
LISTEN 0 128 *:111 *:*
LISTEN 0 5 192.168.122.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:631 *:*
LISTEN 0 128 *:23000 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 *:10050 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
可以看出端口正常开启,我们的动作触发已经完成。
补充:我们也可以使用脚本来发送警报,我们的脚本存放路径在配置文件中可以找到,定义为:
AlterScriptsPath=/usr/lib/zabbix/alertscripts
接下来,我们来一波彻底一点的操作,我们来手动修改一下redis服务的监听端口,这样,我们就不能通过重启服务恢复了:
[root@zabbix-slave1 ~]# vim /etc/redis.conf
#port 6379
port 6380 #注释掉原来的端口,更换为新的端口
[root@zabbix-slave1 ~]# systemctl restart redis
然后,我们来网页查看一下状态:
进入 监测中 —> 问题,可以看到是报错的:
这样,在经过了重启服务以后还是没能把解决问题,就会发邮件告警:
我们再把服务端口改回来,然后重启服务。这样,等到问题自动解决了以后,我们会再次收到邮件:
这样,我们的动作设定已经全部测试完成。
6)zabbix可视化
① 简介
数据日积月累,如果我们想要更直观的了解到各项数据的情况,图形无疑是我们的最佳选择。
zabbix提示了众多的可视化工具提供直观展示,如graph、screen及map等。上文中我们也看到过一些简单的图形展示。
如果我们想要把多个相关的数据定义在同一张图上去查看,就需要去自定义图形了~
② 自定义图形(Graphs)
自定义图形中可以集中展示多个时间序列的数据流。支持“线状图(normal)”、“堆叠面积图(stacked)”、“饼图(pie)” 和“分离型饼图(exploded)”四种不同形式的图形。
具体的设置过程如下:
进入 配置 —> 主机 —> node1 —> 图形,选择右上角创建图形:
我们来看一看四种状态:
包括我们的主机都可以自定义,不过一般来说,线型是看的最清晰的,我们通常会使用这个。
我们也可以克隆一个packets来更改为bytes用~同样的,我们如果想添加别的内容,也都可以添加的。
我们一共添加了三个图形,我们可以在 监测中 —> 图形 来查看
③ 聚合图形(Screens)
我们创建的自定义图形也可以放在一个聚合图里显示,具体的设置方法如下:
进入 监测中 —> 聚合图形 —> 选择右上角创建聚合图形
我们还可以选择分享:
定义好了添加即可。
定义完成以后,我们需要编辑一下,来指定保存哪些图:
依次添加即可,添加完成之后是这样婶儿的~:
因为我们只有三张图,所以添加的有重复的,通常情况下是不需要这样的。
④ 幻灯片演示(Slide shows)
如果我们有多个聚合图形想要按顺序展示的话,我们就可以定义一个幻灯片。
具体步骤如下:
进入 监测中 —> 聚合图形 —> 右上角选择幻灯片演示 —> 创建幻灯片
然后我们打开即可。打开以后显示的是图片1,5s以后会自动切换为图片2。
这样就可以实现幻灯片演示,我们就不需要去手动切换了。
⑤ 定义拓扑图(Maps)
在拓扑图中,我们可以定义成一个复杂的网络连接图,我们可以使用一台主机来连接另一台主机,这样的话,我们就可以查看出到底是哪个链接出了问题。
我们就不来演示了,看一下过程即可:
进入 监测中 —> 拓扑图 —> 所有地图 —> Local network(默认就有的)
通过 Ping 和 Traceroute 就可以实验我们上述的功能。
7)模板
① 创建模板
之前我们说过,每一个主机的监控项都很多,我们一个一个的添加实在是太头疼了,更何况,可能不止一个主机。
但是我们可以把一个redis的监控项添加进一个模板里,这样更方便于我们以后的添加。
具体操作如下:
进入 配置 —> 模板 —> 选择右上角创建模板
填写完以后,我们点击下方的添加即可。
我们可以基于组过滤一下,就能看到我们刚刚定义的模板:
一样的,我们可以向里面添加应用集、监控项、触发器、图形等等,添加完成以后,后期我们再有主机需要添加就直接套用模板即可。
需要注意的一点是,我们现在添加的是模板,所以不会立即采用数据,只有链接到主机上以后,才会真正生效。
② 模板的导入与导出
我们也可以直接导入一个模板,在互联网上可以找到很多,导入的步骤如下:
同样的,我们创建好的模板也可以导出为文件:
我们任意选中一个准备好的模板,然后页面的最下方就有导出按钮:
因此,我们就可以非常方便的进行应用了~
③ 模板的应用
我们的软件已经创建了许多模板,我们可以使用一个模板来看看效果。
进入 配置 —> 主机 —> node1 —> 模板
我们就可以选择要添加的模板了:
到这里我们就可以点击更新了。一旦我们成功链接至模板,我们的主机数据就会更新了:
注意:1、一个主机可以链接多个模板,但尽量不要让一个指标被采样两次。
2、如果我们有多个主机,同时这些主机也在一个主机组里,这样的话,我们只需要在这个主机组里添加模板,就能够让在主机组里的所有主机进行同步
④ 移除模板链接
当我们一个主机的模板不想要用了,我们就可以移除模板链接,具体操作步骤如下:
进入 配置 —> 主机 —> node1 —> 模板
我们就可以把不需要的模板移除:
我们来删除掉试试看,移除并清理以后,我们点击更新。就会自动跳转至如下界面:
可以看出,我们的模板已经被移除了。
8)宏(macro)
官方内置宏
① 简介
宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式,而解释器或编译器在遇到宏时会自动进行这一模式替换。
类似地,zabbix基于宏保存预设文本模式,并且在调用时将其替换为其中的文本。
zabbix有许多内置的宏,如{HOST.NAME}、{HOST.IP}、{TRIGGER.DESCRIPTION}、{TRIGGER.NAME}、{TRIGGER.EVENTS.ACK}等。
详细信息请参考官方文档
② 级别
宏一共有三种级别,分别是全局宏、模板宏、主机宏。
不同级别的宏的适用范围也不一样。
全局宏也可以作用于所有的模板宏和主机宏,优先级最低。
模板宏则可以作用于所有使用该模板的主机,优先级排在中间。
主机宏则只对单个主机有效,优先级最高。
③ 类型
宏的类型分为系统内建的宏和用户自定义的宏。
为了更强的灵活性,zabbix还支持在全局、模板或主机级别使用用户自定义宏(user macro)。
系统内建的宏在使用的时候需要{MACRO}
的语法格式,用户自定义宏要使用{$MACRO}
这种特殊的语法格式。
宏可以应用在item keys和descriptions、trigger名称和表达式、主机接口IP/DNS及端口、discovery机制的SNMP协议的相关信息中……
宏的名称只能使用大写字母、数字及下划线。
进一步信息请参考官方文档。
④ 定义一个宏
如果我们想要在我们的监控项(items)上使用宏,我们就要先去定义一个宏,然后去创建监控项,直接引用定义好的宏即可。具体操作步骤如下:
1.定义全局宏
进入 管理 —> 一般 —> 右上角选择宏
这样,我们的全局宏就添加好了。
2.定义监控项,调用宏
进入 配置 —> 主机 —> 所有主机 —> 监控项 —> 右上角创建监控项
填写完成以后,点击添加。然后我们就可以看到这个调用宏的监控项已经添加成功:
我们可以来查看一下这个监控项现在的状态:
进入 监测中 —> 最新数据
如果我们把服务停掉。就会变成down
的状态:
[root@zabbix-slave1 ~]# systemctl stop redis
发现我们的监控项是可以正常使用的。
3.修改宏
如果我们把node1节点上的redis服务监听端口手动改掉的话,我们刚刚定义的监控项就不能正常使用了,这样的话,我们就需要去修改宏。
但是,这毕竟只是个例,所以我们不需要去修改全局宏,只用修改模板宏或者主机宏就可以了。
下面分别说一下,模板宏和主机宏的不同修改操作:
模板宏
模板宏的修改,我们需要进入:配置 —> 模板 —> redis stats(相应的模板) —> 宏
在这里点击添加就可以了。
主机宏
主机宏的修改,我们需要进入:配置 —> 主机 —> 所有主机 —> node1 —> 宏
在这里点击添加就可以了。
10)使用公网邮箱发送邮件
邮件系统简要介绍:
电子邮件系统包括两个组件:MUA(Mail User Agent,邮件用户代理)和MTA(Mail Transport Agent,邮件传送代理 postfix)MUA是邮件系统为用户提供的可以读写邮件的界面;而MTA是运行在底层,能够处理邮件的收发工作的程序。简单的说,用户可以 使用MUA写信、读信、而通过MTA收信、发信。Foxmail、Outlook、Webmail都属于MUA。
邮件的接收是MTA和MUA配合完成的。远程的MUA首先向远程MTA连接并验证发信人身份,然后由远程MTA向本地MTA发送邮件。接受者通过本 地MUA接收阅读邮件。邮件的发信也是MTA和MUA配合完成的,不过方向正好相反。本地MUA首先向本地的MTA连接并验证发信人身份,然后由本地 MTA向远程MTA发送邮件,再由远程的MUA读取邮件。
mail和mailx即为负责查看、编写邮件和向MTA发送邮件的MUA。mailx是mail的功能加强版。
sendmail即为负责邮件在网络上传输的MTA,将邮件从一个MTA传送至另一个MTA。
开干:
1.注册163邮箱
2.登陆网页邮箱设置客户端授权密码
安装MUA软件:mailx
[root@zabbix-master ~]# yum install -y mailx
[root@zabbix-master ~]# mail -V
12.5 7/5/10
[root@zabbix-master ~]# mailx -V
12.5 7/5/10
配置公网邮箱信息:
vim /etc/mail.rc 追加以下内容
set from=18612540627@163.com(邮箱地址)
set smtp=smtp.163.com(smtp服务器)
set smtp-auth-user=18612540627@163.com(用户名)
set smtp-auth-password=yanqiang20182018(邮箱密码-这里是授权码)
set smtp-auth=login
使用mailx发邮件的方式:
方式1:mailx -s “邮件标题” 收件箱Email < 包含正文的文件
方式2:cat 包含正文的文件 | mailx -s “邮件标题” 收件箱Email
方式3:echo “正文内容” | mailx -s “邮件标题” 收件箱Email
方式4:mailx -s “邮件标题” 收件箱Email,回车按CTRL+D发送
手动发送邮件测试:
mailx -v -s 'hello' '收件人@163.com'
手写邮件内容 (回车,然后ctrl+d正常结束)
EOT
Resolving host smtp.163.com … done.
Connecting to 123.125.50.135:smtp … connected.
220 163.com Anti-spam GT for Coremail System (163com[20141201])
EHLO localhost
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFHbOaIUCa0xDrUUUUj
250-STARTTLS
250 8BITMIME
AUTH LOGIN
334 dXNlcm5hbWU6
emhpZ3VvbGl1MTFAMTYzLmNvbQ==
334 UGFzc3dvcmQ6
bHpnODY3MTM1NzM5
235 Authentication successful
MAIL FROM:18612540627@163.com
250 Mail OK
RCPT TO:18612540627@163.com
250 Mail OK
DATA
354 End data with .
.
250 Mail OK queued as smtp5,D9GowAAnNd6vschZY_bxAA–.277S2 1506324911
QUIT
221 Bye
或者,将邮件内容放到一个文件中content.txt
# cat content.txt | mailx -v -s ‘hello’ ‘zhangsan@163.com’
手动使用mailx发送邮件测试结果:
zabbix添加邮件报警功能:
注:使用新的方式–利用公网邮件服务器发送报警,需要关闭postfix服务
配置 zabbix 的邮件报警功能需要以下三个角色的参与。
1、 示警媒体(Media)
2、 触发器(Triggers)
3、 动作(Action)
示警媒体:
指的是 zabbix 采用何种方式进行报警,目前 Zabbix 支持的示警媒体包括邮件、Jabber、短信。jabber是linux下一种即时通讯工具,可以和yahoo,icq等工具通信
触发器:
指的是当监控对象达到某个条件或条件集合的时候,触发 Zabbix 产生事件。
动作:
指的是 Zabbix 产生对应事件后,它通过示警媒体发送报警。
接下来,我们配置一个邮件报警功能的范例。效果是当 WEB 页面获取时间超过 3 秒,则触发报警,管理员将会收到一封 Zabbix 发出的报警邮件。
示警媒体的配置:
首先需要配置 Zabbix 的邮件功能。
点击 管理->报警媒介类型->创建媒体类型
然后在页面中填入你的报警媒介类型信息,例如下图所示:
注:脚本名称任意,存放于/usr/lib/zabbix/alertscripts (生产上的测试服放这:/usr/local/zabbix/share/zabbix/alertscripts)
名称:sendmail //名称任意
类型:脚本
脚本名称:sendmail.sh
脚本参数: //一定要写,否则可能发送不成功
{ALERT.SENDTO} //照填,收件人变量
{ALERT.SUBJECT} //照填,邮件主题变量,变量值来源于‘动作’中的‘默认接收人’
{ALERT.MESSAGE} //照填,邮件正文变量,变量值来源于‘动作’中的‘默认信息’
配置完成后,不要忘记点击存档,保存你的配置。
修改zabbix服务端配置文件&编写脚本:
指定脚本的存储路径:
[root@zabbix-master ~]# vim /etc/zabbix/zabbix_server.conf
[root@zabbix-master ~]# AlertScriptsPath=/usr/lib/zabbix/alertscripts
编写邮件脚本:
[root@zabbix-master ~]# cd /usr/lib/zabbix/alertscripts
[root@zabbix-master alertscripts]# vim sendmail.sh
#!/bin/sh
#export.UTF-8
echo "$3" | sed s/'\r'//g | mailx -s "$2" $1
修改权限:
chmod u+x sendmail.sh && chown zabbix.zabbix sendmail.sh
修改admin用户的报警媒介:
用户默认是没有设置报警媒介的,设置后就可以接收报警消息了。
接下来,设置接受报警用户的电子邮件
点击:管理->报警媒介类型->Admin->报警媒介->添加
触发器的配置:
接下来,点击配置->主机
我们给 agent-19 这台主机增加一个触发器。点击 agent-19 这一行中的“触发器”,然后再点击创建触发器。
该页各配置项含义如下:
名称:填入触发器的名字
表达式:用于配置触发器的触发条件,点击添加按钮有条件选项。
多重事件产生:如果选中,则问题如果持续多重的发生则每次都触发,否则只触发一次
点击表达式右侧的添加按钮:
再点击项目右侧的选择,选择我们之前配置过的“web.server.online.monitor”,并设置触发的阀值,如下图所示
Zabbix 会自动生成表达式。接下来根据情况选择事件的严重性。配置完毕后,点击存档保存。
动作的配置:
点击:配置->动作->事件源下拉菜单中选择触发器->创建动作
可以在内容中使用 Zabbix 内置宏,邮件发出时会自动将宏替换成对应的值。
名称:
任意写
默认接收人:
故障级别:{TRIGGER.STATUS}。服务器:【{HOSTNAME1} 】 发生:{TRIGGER.NAME} 故障!
注:默认接收人:相当于邮件的主题
默认信息:邮件的主题
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复邮件:
恢复主题:
服务器:【{HOSTNAME1}】故障已恢复。故障原因:{TRIGGER.NAME}
恢复信息:恢复邮件的正文。当故障恢复正常后也发邮件通知一下。
确认操作:
点击:操作->编辑:
发送间隔:60秒
步骤:发送10次发送到:admin用户
仅使用:sendmail方式发送
需要特别解释一下的是“步骤”部分的配置。所谓步骤是指报警可以有多个步骤,做不同的报警。例如,自从 1 到 3,就是指报警的步骤有三个。步骤持续时间就是一定时间后如果监控人员仍未响应报警就进入下一个报警步骤。
例如,发邮件给你报警,如果60 秒后你没响应,那就发 jabber 信息提醒你。如果 60 秒后还没响应,那就发短信给你。要是还没响应,就没有然后了。你可以形象的把它理解为 Zabbix 的一哭二闹三上吊。
到此,一个邮件报警功能就配置完毕了。如果你想立即看到结果,可以修改触发器的条件,将条件的阀值设置为 N>0.0003。你马上就会收到 Zabbix 发来的报警邮件了。
11) 企业微信报警
企业微信官网
登录到企业微信web界面中
创建应用
配置应用(记录所需要的参数)
部门ID
企业ID
创建报警媒介
创建用户
动作配置
服务端添加脚本
接下来就可以通过触发器来测试是否可以实现报警了
中文报警模板
默认接收人:
故障级别:{TRIGGER.STATUS}。服务器:【{HOSTNAME1} 】 发生:{TRIGGER.NAME} 故障!
注:默认接收人:相当于邮件的主题
默认信息:邮件的主题
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID :{EVENT.ID}
二、Network discovery 网络发现
1、介绍
(1)介绍
网络发现:zabbix server扫描指定网络范围内的主机;
网络发现是zabbix 最具特色的功能之一,它能够根据用户事先定义的规则自动添加监控的主机或服务等
优点:
加快Zabbix部署
简化管理
在快速变化的环境中使用Zabbix,而不需要过度管理
(2)发现方式:
ip地址范围;
可用服务(ftp, ssh, http, …)
zabbix_agent的响应;
snmp_agent的响应;
(3)网络发现通常包含两个阶段:discovery发现 和actions动作
① discovery:
Zabbix定期扫描网络发现规则中定义的IP范围;检查的频率对于每个规则都是可配置的
每个规则都有一组用于为IP范围执行的服务检查
由网络发现模块执行的服务和主机(IP)的每个检查都会生成一个发现事件
8种响应事件
② actions:网络发现中的事件可以触发action,从而自动执行指定的操作,把discvery events当作前提条件;
Sending notifications 发送通知
Adding/removing hosts 添加/删除主机
Enabling/disabling hosts 启用/禁用host
Adding hosts to a group 向组中添加主机
Removing hosts from a group 移除组中的主机
Linking hosts to/unlinking from a template 从模板链接主机或取消链接
Executing remote scripts 执行远程脚本
这些事件的配置还可以基于设备的类型、IP 、状态、上线/ 离线等进行配置
(4)网络发现:接口添加
网络发现中添加主机时会自动创建interface 接口
例如:
如果基于SNMP 检测成功,则会创建SNMP 接口
如果某服务同时响应给了agent 和SNMP ,则两种接口都会创建
如果同一种发现机制( 如agent) 返回了非唯一数据,则第一个接口被识别为默认,其它的为额外接口
即便是某主机开始时只有agent 接口,后来又通过snmp 发现了它,同样会为其添加额外的snmp 接口
不同的主机如果返回了相同的数据,则第一个主机将被添加,余下的主机会被当作第一个主机的额外接口
2、配置网络发现Network discovery
(1)准备一台可被扫描发现的主机
① 安装agent 段的包
[root@zabbix-slave3 ~]# yum -y install zabbix-agent zabbix-sender
② 设置agent 配置,可以把之前设置好的slave1的配置传过来
[root@zabbix-slave3 ~]# vim /etc/zabbix/zabbix_agentd.conf
Hostname=zabbix-agent3
Server=192.168.0.105
ServerActive=ho192.168.0.105
③ visudo 修改sudo的配置
#Defaults !visiblepw
zabbix ALL=(ALL) NOPASSWD: ALL
④ 开启服务
[root@zabbix-slave3 ~]# systemctl start zabbix-agent
(2)设置自动发现规则discovery
注释:
① key:zabbix_get -s 192.168.30.2 -p 10050 -k “system.hostname”
② 更新间隔:1h就好,不要扫描太过频繁,扫描整个网段,太废资源;这里为了实验,设为1m
(3)自动发现成功
(4)设置自动发现discovery 的动作action
a) 创建
b) 设置action动作
① 设置A条件,自动发现规则=test.net
② 设置B条件,自动发现状态=up
③ 要做什么操作
添加主机到监控
自动链接Template OS Linux 到此host
c) 配置action 完成,默认是disabled 停用的
d) 启用动作,查看效果
确实已经生效,添加主机成功,模板链接成功
(5)如果自己需要添加的主机已经扫描添加完成,就可以关闭网络扫描了,因为太耗资源
三、web监控
1、介绍
(1)介绍
① Web监控:监控指定的站点的资源下载速度,及页面响应时间,还有响应代码;
② 术语:
web Scenario: web场景(站点)
web page :web页面,一个场景有多个页面
內建key:要测一个页面,要测三个步骤(下边3个內建key)
③ 内建key:
web.test.in[Scenario,Step,bps]:传输速率
web.test.time[Scenario,Step]: 响应时长
web.test.rspcode[Scenario,Step]:响应码
2、创建设置web场景
(1)创建
(2)配置web 监测
① 点击步骤,设置web page web页面
a) 设置名为home page,URL为http://192.168.30.7/index.html 的web页面
b) 设置名为fpm status,URL为http://192.168.30.7/fpm-status 的web页面
c) 设置2个web页面成功
② 如果有特殊认证,也可以添加
3、查看测试
四、主动/被动 监控
1、介绍
(1)主动/被动介绍
被动检测:相对于agent而言;agent, server向agent请求获取配置的各监控项相关的数据,agent接收请求、获取数据并响应给server;
主动检测:相对于agent而言;agent(active),agent向server请求与自己相关监控项配置,主动地将server配置的监控项相关的数据发送给server;
主动监控能极大节约监控server 的资源。
(2)zabbix_sender发送数据:实现人工生成数据,发给server端
① zabbix server上的某主机上,直接定义Item时随便定义一个不与其它已有key冲突的key即可,即item type为"zabbix trapper";
② 用法选项:
zabbix_sender
-z zabbix_server_ip
-p zabbix_server_port
-s zabbix_agent_hostname
-k key
-o value 值
zabbix_get
-s zabbix_agent_ip
-p zabbix_agent_port
-k key
2、设置一个通过內建key发送数据的主动监控
(1)agent端所需要基本配置:
ServerActive=192.168.30.107 给哪个监控server 发送数据
Hostname=slave1.along.com 注意,这里的名字要与web页面中的主机名称配置相同,自己的主机名,假设主机定死了,不设置下一项
#HostnameItem= 如果自己的主机名易变动,这一项相当于key一样去匹配
注意:若后两项同时启用,下边一个选择生效
(2)设置一个主动监测
① 选择进程,每秒更改,
因为key:system.cpu.switches :上下文的数量进行切换,它返回一个整数值。为了监控效果,选择下一秒减上一秒的值作为监控
(3)已经有啦graph图形
3、设置一个通过命令zabbix_sender发送数据的主动监控
(1)配置一个zabbix traper(采集器) 的item 监控项
(2)agent 端手动发送数据
(3)监控到数据的变化
五、分布式监控
使用zabbix proxy进行分布式监控
1、配置数据库
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum clean all
yum install zabbix-proxy-mysql
mysql -uroot -p
password
mysql> create database zabbix_proxy character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by 'password';
mysql> grant all privileges on zabbix_proxy.* to zabbix@localhost;
mysql> set global log_bin_trust_function_creators = 1;
mysql> quit;
zcat /usr/share/doc/zabbix-proxy-mysql*/schema.sql.gz | mysql -uzabbix -p zabbix_proxy
mysql -uroot -p
password
mysql> set global log_bin_trust_function_creators = 0;
mysql> quit;
##Edit file /etc/zabbix/zabbix_proxy.conf
DBPassword=password
systemctl restart zabbix-proxy
systemctl enable zabbix-proxy
[root@zabbix-proxy ~]# vim /etc/yum.repos.d/mariadb.repo
#写入以下内容:
[mariadb]
name = MariaDB
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
# 安装
[root@zabbix-proxy ~]# yum install MariaDB-server MariaDB-client
# 修改配置文件
[root@zabbix-proxy ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve = ON #跳过主机名解析
innodb_file_per_table = ON #
innodb_buffer_pool_size = 256M #缓存池大小
max_connections = 2000 #最大连接数
log-bin = master-log #开启二进制日志
# 启动数据库
[root@zabbix-proxy ~]# systemctl restart mariadb
# 进入数据库进行数据初始化
MariaDB [(none)]> create database zabbix_proxy character set utf8 collate utf8_bin; # 创建数据库
MariaDB [(none)]> grant all on zabbix_proxy.* to 'zabbix'@'%' identified by 'zbxproxypass'; # 注意授权网段
MariaDB [(none)]> flush privileges; # 刷新授权
2、导入数据
[root@zabbix-proxy ~]# zcat /usr/share/doc/zabbix-proxy-mysql-5.0.31/schema.sql.gz | mysql -uzabbix -pzbxproxypass -h 代理端ip地址 zabbix_proxy
3、配置proxy端
配置proxy端:
[root@zabbix-proxy ~]# yum install -y https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
[root@zabbix-proxy ~]# yum install -y zabbix-proxy-mysql zabbix-get zabbix-sender
[root@zabbix-proxy ~]# vim /etc/zabbix/zabbix_proxy.conf
# 修改一下内容
ProxyMode=1 # 0为主动 1为被动
Server=服务端ip地址
SourceIP=发送采样信息的ip地址
Hostname=zbxproxy.along.com #主机名
ListenPort=10051 #proxy自己的监听端口
EnableRemoteCommands=1 #允许远程命令
LogRemoteCommands=1 #记录远程命令的日志
数据的配置
DBHost=数据库地址
DBName=zabbix_proxy
DBUser=zabbix
DBPassword=zbxproxypass
ConfigFrequency=30 #多长时间,去服务端拖一次有自己监控的操作配置;为了实验更快的生效,这里设置30秒,默认3600s
DataSenderFrequency=1 #每一秒向server 端发一次数据,发送频度
[root@zabbix-proxy ~]# systemctl start zabbix-proxy
4、配置客户端
[root@zabbix-agent ~]# vim /etc/zabbix/zabbix_agentd.conf
Server=server端地址,proxy端地址
ServerActive=server端地址,proxy端地址
5、web页面配置
注意,这里的代理程序名称,一定要与proxy配置文件中的Hostname相同
6、检查
观察之前配置的监控项是否依然可以接受数据
七、zabbix-server 监控自己,数据库,nginx
1、下载安装,配置agent
vim /etc/zabbix/zabbix_agentd.conf 配置agent
EnableRemoteCommands=1 允许远程命令
LogRemoteCommands=1 记录远程命令
Server=127.0.0.1
ServerActive=127.0.0.1
Hostname=server.along.com
2、自动生成Zabbix server 的主机
3、在主机中添加模板
4、启用Zabbix server
5、监控到数据
八、调优
1、调优
① Database:
历史数据不要保存太长时长;
尽量让数据缓存在数据库服务器的内存中;
② 触发器表达式:减少使用聚合函数 min(), max(), avg();尽量使用last(),nodata();
因为聚合函数,要运算
③ 数据收集:polling较慢(减少使用SNMP/agentlless/agent);尽量使用trapping(agent(active)主动监控);
④ 数据类型:文本型数据处理速度较慢;尽量少收集类型为文本 text或string类型的数据;多使用类型为numeric 数值型数据 的;
2、zabbix服务器的进程
(1) 服务器组件的数量;
StartPollers=60
StartPingers=10
...
StartDBSyncer=5
...
(2) 设定合理的缓存大小
CacheSize=8M
HistoryCacheSize=16M
HistoryIndexCacheSize=4M
TrendCacheSize=4M
ValueCacheSize=4M
(3) 数据库优化
分表:
history_*
trends*
events*
3、其它解决方案
grafana:展示
collectd:收集
influxdb:存储
grafana+collectd+influxdb
prometheus:
exporter:收集
alertmanager:
grafana:展示
3、数据清理
查看数据表大小语句
SELECT table_schema AS 'Database',
table_name AS 'Table',
round(((data_length + index_length) / 1024 / 1024), 2) 'Size in MB'
FROM information_schema.TABLES
WHERE table_schema = 'zabbix'
ORDER BY (data_length + index_length) DESC;
清理30天之前的数据
DELETE FROM history WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));
DELETE FROM history_uint WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));
清理整张表
TRUNCATE TABLE history;
TRUNCATE TABLE history_uint;
优化表
OPTIMIZE 是 MySQL 数据库中的一个命令,用于优化表的性能和空间利用。当表中进行大量数据插入、更新和删除操作时,表可能会产生空洞,导致表文件变得不连续,从而影响查询性能。OPTIMIZE TABLE 命令可以解决这个问题。
OPTIMIZE TABLE history;
OPTIMIZE TABLE history_uint;