Zabbix自动发现并监控redis性能

一、引言

很多人在工作中一般喜欢把Redis、Memcached、MongoDB等数据库按照实例的方式对外提供服务。一般都是一台高配的服务器上开启多个实例给每个业务使用。如果一台服务器有几个实例,那如果集群呢,如果要监控,你得手动添加到什么时候,而且可能会出现手敲的错误,导致诸多的不顺利,因此就用到了这个自动发现功能。

二、监控采集依据

类似吞吐量,缓存的查询次数,命中率之类的

三、主要通过info命令进行采集

1
2
3
4
5
6
7
8
9
10
11
uptime_in_days				##redis启动的天数
connected_clients ##redis连接的客户端数
blocked_clients: ##正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
used_memory_peak_human: ##reids所用内存的高峰期
used_memory: ##redis运行起来使用的内存数
expired_keys: ##过期的key数量
evicted_keys: ##删除过期的key数量
keyspace_misses: ##没命中的key数量
keyspace_hits: ##命中的key数量
connected_slaves: ##已连接的从服务器数
rejected_connections: ##因为超过最大连接数被拒接的请求数量

四、安装telnet

1
yum -y install telnet

五、在被监控端上编写自动发现脚本

1、创建zabbix脚本存放目录
1
mkdir -p /etc/zabbix/scripts
2、编写自动发现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
vim /etc/zabbix/scripts/redis_discovery.sh

#!/bin/bash
############################################################
# $Name: redis_discovery.sh
# $Function: REDIS DISCOVERY
# $Author: Mr.nong
# $organization: nongziyi.xin
# $Create Date: 2018/1/29
# $Description: Monitor REDIS DISCOVERY
############################################################

port=(`sudo netstat -tpln | awk -F "[ :]+" '/redis/ && /0.0.0.0/ {print $5}'`)
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"},\n"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
printf '\t {\n'
printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
3、给予脚本执行权限
1
chmod +x /etc/zabbix/scripts/redis_discovery.sh
4、允许zabbix用户无密码运行netstat
1
2
3
4
vim /etc/sudoers

#Defaults requiretty #注释掉
zabbix ALL=(root) NOPASSWD:/bin/netstat #添加
5、编辑zabbix_agentd的配置文件支持自定义脚本
1
2
3
vim /etc/zabbix/zabbix_agentd.conf

UnsafeUserParameters=1
6、编辑zabbix_agentd的配置文件添加zabbix配置文件目录
1
2
3
vim /etc/zabbix/zabbix_agentd.conf

Include=/etc/zabbix/zabbix_agentd.conf.d/
7、创建key文件
1
2
3
4
vim /etc/zabbix/zabbix_agentd.conf.d/redis_status.conf

UserParameter=redis.discovery[*],/etc/zabbix/scripts/redis_discovery.sh $1
UserParameter=redis.status[*],(echo info; sleep 1) | telnet 127.0.0.1 $1 2>&1 |grep $2|cut -d : -f2
1
2
3
4
5
参数说明:
其中的格式为UserParameter=<key>,<command>

<key>:就是在web端添加监控脚本时的key值
<command>:就是该key值对应的执行脚本,也就是脚本执行路径
8、重启zabbix_agentd服务
1
service zabbix_agentd restart
9、在zabbix server端进行测试
1
2
/a01/apps/zabbix/bin/zabbix_get -s 192.168.10.29 -p10050 -k"redis.discovery"
/a01/apps/zabbix/bin/zabbix_get -s 192.168.10.29 -p10050 -k"redis.status[6379,expired_keys:]"

PgZ2KU.png

10、到zabbix web前端创建模板
  • “配置”——“模板”——“创建模板”

PgZT8x.png

11、创建应用集
  • “配置”——“模板”——“选中模板”——应用集”——“创建应用集”

PgZLrD.png

12、创建自动发现规则
  • “配置”——“模板”——“选中模板”——“自动发现规则”——“创建自动发现规则”

PgZxIA.png

  • 上图中的“数据更新间隔(秒)”实际生产环境最好调整为3600,原因是如果设置时间过短,比如你设置60s,一个是服务器的压力大,一个是如果你检测的端口突然当掉了,还没有来的急报警,主机通 过json来获取不到这个信息,就认为没有这个端口,模板里会自动关闭这个监控项的内容(默认保留30天,然后自动删除),这样报警功能就基本没有了,所 以还是发现的间隔时间长一些比较好。这里我为了实验效果,改为30秒。
13、创建监控项原型(键值[]中的数值必须大写,否则会报错如下)
1
Cannot create item: item with the same key “diskio.x.[[xxxxxx]] already exists
  • 一个一个创建即可,这里只截图一个作为参考

PgepGt.png

  • 创建完成

PgeCxf.png

14、创建图形原型(名称后边要带哪个磁盘的动态名称,否则会报错如下)
1
zabbix3 Cannot create graph: graph with the same name "Disk IO" already exists

PgeFsS.png

PgeEZQ.png

15、查看是否获取到数据
  • “监测中”——“最新数据”——“过滤器”——“应用”

PgenGq.png

1
Received value [809.05K] is not suitable for value type [Numeric (unsigned)] and data type [Decimal]
  • 报错了,大概意思是获取到的值不能为“数字”,那既然这样,我们去修改一下如下

PgelsU.png

  • 修改完成之后查看一下

PgeJo9.png

16、查看我们创建的图形

PgeURx.png

博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%