一、监控场景

我们现在的REDIS是在三台服务器上,每台服务器部署运行了两个REDIS实例的伪集群,应用端口不统一,如果挨个端口添加监控项是非常耗费时间的,这时候我们可以使用zabbix的自动发现机制,配置独立的监控模板,只需把需要监控的主机关联上模板就可以实现自动发现REDIS端口并添加相应 的监控项和触发器。

二、监控项
redis_version               ##redis的版本
role                        ##在主从复制中,充当的角色。如果没有主从复制,单点的,它充当的角色也是master
master_link_status          ##复制连接当前的状态,up表示连接正常,down表示连接断开
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:       ##因为超过最大连接数被拒接的请求数量

上面只列出了我这里配置时增加的监控项,如果需要添加其他的监控项,可以在redis中使用INFO命令获取

三、监控脚本配置
(一)、自动发现

自动发现REDIS端口

vim disk_discovery.sh

#!/bin/bash
# 自动发现Redis端口脚本
port=(`netstat -tpln | awk -F "[ :]+" '/redis/ && /0.0.0.0/ {print $5}' |grep '^[^1]'`)
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'
(二)、监控脚本

获取监控项的数据

vim  redis_monitor.sh

#!/bin/bash
redis_status(){
        R_PORT=$1
        R_COMMAND=$2
        (echo -en "INFO \r\n") | ncat 127.0.0.1 "$R_PORT" > /tmp/redis_"$R_PORT".tmp
        REDIS_STAT_VALUE=$(grep ""$R_COMMAND":" /tmp/redis_"$R_PORT".tmp | cut -d ':' -f2)
        echo $REDIS_STAT_VALUE
}
help(){
        echo "${0} + redis_status + PORT + COMMAND"
}
main(){
        case $1 in
                redis_status)
                        redis_status $2 $3
                                ;;
                *)
                        help
                                ;;
        esac
}
main $1 $2 $3
四、配置监控节点(被监控机)
(一)上传监控脚本到被监控机

脚本上传在自己定义的目录

给脚本添加执行权限
chmod +x redis_monitor.sh
chmod +x disk_discovery.sh

注意: 需要给zabbix用户添加 netstat 命令执行权限,否则会报错:

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)

添加权限

which netstat
cd /usr/bin/
chmod u+s netstat

修改zabbix_agentd.conf 配置

Include=/etc/zabbix/zabbix_agentd.d/*.conf ##默认已开启

新增配置文件

vim disvocery_redis.conf
添加以下内容

UserParameter=redis.discovery,/opt/zabbix-sh/discovery_redis.sh
UserParameter=redis_status[*],/opt/zabbix-sh/redis_monitor.sh "$1" "$2" "$3"

重启zabbix_agent

pkill -9 zabbix_agent
/usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
(二)、配置验证

在zabbix_server 端使用zabbix_get 进行测试

zabbix_get -s 192.168.1.113 -p 10050 -k redis.discovery

{
	"data":[
	 {
			"{#REDISPORT}":"6391"},
	 {
			"{#REDISPORT}":"6392"}
	 ]
}

zabbix_get -s 192.168.1.113 -p 10050 -k redis_status["redis_status","6390","connected_clients"]
6
五、服务端配置
(一)创建模板

Configuration — Templates

zabbix监控redis哨兵 zabbix监控redis集群_zabbix


zabbix监控redis哨兵 zabbix监控redis集群_zabbix_02

(二)、创建应用集

Configuration — Templates 选择创建的模板

创建一个redis应用集

zabbix监控redis哨兵 zabbix监控redis集群_缓存_03

(三)、创建自动发现规则

zabbix监控redis哨兵 zabbix监控redis集群_缓存_04

(四)、创建监控项(根据自己的监控需要配置监控项)

注意:这里所有的监控项全部要在模板中的自动发现规则处去添加监控项原型

其他监控指标和这里类似,只需要修改name和key中的 “blocked_clients”

zabbix监控redis哨兵 zabbix监控redis集群_redis_05


key值配置格式如下:

redis_status["redis_status","{#REDISPORT}","blocked_clients"]
key值格式说明:

redis_stats:是我们在zabbix-agent端配置的key
{#REDISPORT}:是我们自动发现脚本中定义的key,不要和上面的key混淆了。
evicted_keys:是我们需要获取的监控项,这个参数是我们主要需要改的参数

可以根据自己的需要,配置告警触发器,这里和监控项一样,也要在的模板中的自动发现规则处进行配置,否则无效

zabbix监控redis哨兵 zabbix监控redis集群_zabbix_06