![08fd9df8755ef9bdbc552089e50d0687.png](https://i-blog.csdnimg.cn/blog_migrate/7c1319de0b7815016ff0fbb535888187.png)
ZABBIX自动发现Redis端口并监控
由于一台服务器开启许多Redis实例,如果一台一台的监控太耗费时间,也非常容器出错。这种费力不讨好的事情我们是坚决杜绝的,幸好ZABBIX有自动发现功能,今天我们就来用该功能来监控我们的Redis实例。
监控项
Redis的监控信息主要通过info
命令来获取,下面列举几个我们的监控项。
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: ##因为超过最大连接数被拒接的请求数量
上面只是列举了几个,如果需要更多的监控项可以通过info
命令获取。如下:
![821dfed7b38c100b0f2862ecede5fa82.png](https://i-blog.csdnimg.cn/blog_migrate/885828fd9802ff86bdbe970e1e5064a2.jpeg)
开发自动发现脚本
注:可以使用shell开发,也可以使用python开发。我这里附这两种语言脚本
Shell脚本
#!/bin/bash
# 自动发现Redis端口脚本
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 "ttt"{#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 "ttt"{#REDISPORT}":"${port[${key}]}"}n"
fi
done
printf 't ]n'
printf '}n'
Python脚本
#!/usr/bin/env python
import os
import json
t=os.popen("""sudo netstat -tlpn |grep redis-server|grep 0.0.0.0|awk '{print $4}'|awk -F: '{print $2}' """)
ports = []
for port in t.readlines():
r = os.path.basename(port.strip())
ports += [{'{#REDISPORT}':r}]
print json.dumps({'data':ports},sort_keys=True,indent=4,separators=(',',':'))
注:我这里直接监控的是Redis,所以上方两个脚本获取的直接是Redis的端口,你也可以将脚本内容改一下,比如服务名通过参数形式传递,那么该脚本就可以发现你想发现的服务端口了。
在被监控主机上配置
(1)、将上方的脚本其一拷贝到被监控主机上,比如我这里的10.2.42.16主机,主要命令如下
# 创建脚本存放路径
mkdir /etc/zabbix/scripts
# 在脚本存放路径下存放我们上面开发的脚本任一,我这里取名为discovery_redis.py
# 给脚本加执行权限
chmod +x discovery_redis.py
(2)、创建zabbix的key。在/etc/zabbix/zabbix_agentd.d/目录下创建配置文件,如下:
vim userparameter_disvocery_redis.conf
UserParameter=redis.discovery,/etc/zabbix/scripts/discovery_redis.py
UserParameter=redis.stats[*],/usr/local/redis-3.2.9/src/redis-cli -h 127.0.0.1 -p $1 info | grep -w $2 | cat -d : -f2
参数说明: 其中的格式为UserParameter=, :就是在web端添加监控脚本时的key值 :就是该key值对应的执行脚本,也就是脚本执行路径
(3)、修改zabbix_agentd.conf配置文件
# 添加配置目录
Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
# 允许自定义脚本
UnsafeUserParameters=1
(4)、增加sudo权限
之所以要增加sudo权限,是因为zabbix_agentd是zabbix用户启动的,默认不能执行netstat -p等命令,因此可以配置sudo解决,也可以使用chmod +s /bin/netstat进行解决。
# visudo
#Defaults requiretty # 注释掉
Defaults:zabbix !requiretty
zabbix ALL=(root) NOPASSWD:/bin/netstat
(5)、重启zabbix-agent,并在server端用zabbix_get测试
# 重启zabbix-agent
service zabbix-agent restart
# 在服务端用zabbix_get测试
zabbix_get -s 10.2.42.16 -p 10050 -k redis.discovery
zabbix_get -s 10.2.42.16 -p 10050 -k redis.stats[6383,expired_keys]
如果没有zabbix_get命令需要自己安装,由于我这里都是用的yum安装的,如果你也和我一样就用下面命令安装即可
yum install zabbix_get -y
到目前为止zabbix-agent端已经配置完毕,下面进行服务端配置。
服务端配置
服务端配置直接在WEB界面操作。
创建模板
![870f273262a93678efb0951586871fb8.png](https://i-blog.csdnimg.cn/blog_migrate/81eab2ee7bdf87c65fa3c37a8c154b9d.jpeg)
![5aadf6a7e1adff7829cb8b0787b07495.png](https://i-blog.csdnimg.cn/blog_migrate/363b9444447e58d9eae2fb3595516d95.jpeg)
创建应用集
配置>模板>选择刚才创建的模板
![afc00c032af945dcd056c3582b83d12a.png](https://i-blog.csdnimg.cn/blog_migrate/383b121cdb310e1f44d3a2df6c977a96.jpeg)
![110c8429ed9fce658206e086128deb88.png](https://i-blog.csdnimg.cn/blog_migrate/d166d2a0062121053865f8cde8884373.png)
创建自动发现规则
配置>模板>选择刚才创建的模板
![bb6496781d9a232120e588f411a258d2.png](https://i-blog.csdnimg.cn/blog_migrate/1c6abfaa3670131517f8d03f4d866c26.png)
![a217979fb5b9e8b1da22822936a62f19.png](https://i-blog.csdnimg.cn/blog_migrate/6c48c70e42aec88aa1c1ea5d48bb9375.jpeg)
配置过滤器(可选),我这里配置的主要原因是还有其他我不需要监控的集群
![4cd2d17c99598365379f572b2678e2c2.png](https://i-blog.csdnimg.cn/blog_migrate/1b3f0bd5b2d85640d8ecb9a4f4fe6b0b.png)
配置正则表达式
![77e0445ab40323edc5a5a32a4a24b179.png](https://i-blog.csdnimg.cn/blog_migrate/e70ae557eb1be8b8b02aaa6c11f55bc8.png)
![6a3feff36f80688c4a98f4b1a320f84d.png](https://i-blog.csdnimg.cn/blog_migrate/7835c946dacde74cbd7ec14dc1e92ac8.jpeg)
创建监控项
注意:这里要在模板中的自动发现规则处去添加监控项原型
![d70df48f07f1b8f8f1f0ffc8e8ed96e5.png](https://i-blog.csdnimg.cn/blog_migrate/9da77f17908b8cd24ba273318395b39f.png)
点击监控项原型,创建监控项原型
![8c7a84b913515f6cc892452b3bf8352d.png](https://i-blog.csdnimg.cn/blog_migrate/f4dfebbf5a5de20fbadea4c04cc05a87.jpeg)
上面是我添加的一些监控项原型,我只拿一个举例,其他配置相似。
![b5fa6974e6d8189f1d88bbd49b1314af.png](https://i-blog.csdnimg.cn/blog_migrate/abc9184b3ebc5a6890479f806c5bbbe4.jpeg)
其中键值处配置如下:
redis_stats[{#REDISPORT},evicted_keys]
说明:
- redis_stats:是我们在zabbix-agent端配置的key
- {#REDISPORT}:是我们自动发现脚本中定义的key,不要和上面的key混淆了。
- evicted_keys:是我们需要获取的监控项,这个参数是我们主要需要改的参数
创建图形原型
图形原型也需要在模板自动发现规则中配置,如下:
![7770ccb5c16f38b6090f4f52eafa5be4.png](https://i-blog.csdnimg.cn/blog_migrate/62801b266387e77072e2d17fa234336b.jpeg)
我这里只配置了三个图形,我这里只列举一个,如下:
![eb0a46bf88f0227556b6ac287a0844cd.png](https://i-blog.csdnimg.cn/blog_migrate/c8e47b994b0d3e4f00256427d653e6df.jpeg)
注意,这里添加监控项的时候要添加原型,也就是我上面箭头指的地方
创建触发器
这里依旧在模板自动发现规则中配置。
![14d437d915da82a76f314106700f2275.png](https://i-blog.csdnimg.cn/blog_migrate/15b53cc22eb52a11a555b096d52c87f2.jpeg)
我这里仅仅配置了两个,根据需要自行配置,那一个举例,如下:
![5e7e8af69673a366622491167072b1cd.png](https://i-blog.csdnimg.cn/blog_migrate/16fdb81a350afef76cc83d2cf613d510.jpeg)
到此服务端已经配置完成,下面将模板添加到我们的主机。
为主机添加模板
被添加模板的主机需要添加自动发现脚本和配置zabbix-agent端
![6a319d96b03b4f5d576139d238d2f028.png](https://i-blog.csdnimg.cn/blog_migrate/31245518bd14ed31af8d9b59752ba1f3.jpeg)
然后观察最新数据和图形。
![4dd6fe53985959e8fea6b2532763ed12.png](https://i-blog.csdnimg.cn/blog_migrate/55c9449c78cee51fe4f12ab5d880e3c3.jpeg)