柴少的官方网站 技术在学习中进步,水平在分享中升华

zabbix示例之监控Redis状态(九)

监控redis也是通过info信息来监控redis的状态:https://blog.51niux.com/?id=130    #此链接里面有info信息各参数的意思

一、 zabbix监控单实例redis(通过自动发现的方式)

#这种方式呢也是不太推荐的一种方式,虽然比较省事,但是在出图上面就有点麻烦了,这里脚本格式就不写的那么严谨了。

1.1 客户端的配置

自动发现脚本编写:

# cat /etc/zabbix/scripts/redis_parameter   #自动发现redis脚本参数的脚本

#!/bin/bash
/usr/local/bin/redis-cli -p 3000 -a  redis66cs "info">/home/zabbix/tmp/info.txt
cat /tmp/info.txt |grep -v "^#"|awk -F ":" {'print $1'}|grep -v [[:space:]] >/home/zabbix/tmp/info_parameter
Redis_parameter_discovery () {
   Redis_Site=`cat /home/zabbix/tmp/info_parameter`
   Redis_Site_Num=`echo ${Redis_Site}|awk {'print NF'}`
   Redis_Site_parameter=($Redis_Site)
   printf '{\n'
   printf '\t"data":[\n'
   for((i=0;i<${Redis_Site_Num};i++))
   {
      if [ `expr $i + 1 ` != ${Redis_Site_Num} ];then  
         printf "\t{\"{#SITENAME}\":\"${Redis_Site_parameter[$i]}\"},\n"
      else
         printf "\t{\"{#SITENAME}\":\"${Redis_Site_parameter[$i]}\"}\n"
      fi
   }
   printf '\t]\n'
   printf '}\n'
}
case "$1" in
redis_parameter_discovery)
   Redis_parameter_discovery
;;
*)
echo "Usage:$0 redis_parameter_discovery"
;;
esac

#这是是根据之前写的硬盘自动发现。网卡自动发现的脚本改的,这种就是将redis的info信息里面左边的参数名都提取出来输出为json格式。

创建上面脚本对应的目录和文件:

#mkdir /home/zabbix/tmp

#touch /home/zabbix/tmp/info.txt

#touch /home/zabbix/tmp/info_parameter

#chown -R zabbix:zabbix /home/zabbix

#chmod 777 /home/zabbix/tmp/{info.txt,info_parameter}

编写redis的info取值的脚本:

# cat /etc/zabbix/scripts/redis_info.sh   #这个脚本就是根据自动发现传过来的info的参数名进行grep取值

#!/bin/bash
/usr/local/bin/redis-cli -p 3000 -a  redis66cs "info">/home/zabbix/tmp/info.txt
Redis_Site=`cat /home/zabbix/tmp/info_parameter`
Redis_info_value=$(grep "$1"\: /home/zabbix/tmp/info.txt|awk -F ":" {'print $NF'})
echo $Redis_info_value

#注意这里一定grep 一定要是"$1"\:这种以:结尾,比如:used_memory:和  used_memory_human:,会精确匹配而非模糊匹配

编写自定义的key:

# cat /etc/zabbix/zabbix_agentd.conf.d/redis_parameter_discovery.conf   #redis.parameter.discovery就是我们自定义的key

UserParameter=redis.parameter.discovery,/etc/zabbix/scripts/redis_parameter redis_parameter_discovery

#redis.parameter.discovery这个key的作用就是调用redis_parameter这个脚本,将redis的所有info的参数名提取出来。

# cat /etc/zabbix/zabbix_agentd.conf.d/redis_info_value.conf   #通过上面自动发现提取出来的参数名作为$1传递给下面的脚本

UserParameter=redis.info.value[*],/etc/zabbix/scripts/redis_info.sh $1

给对应的脚本授权:

#chown -R zabbix:zabbix /etc/zabbix/*

#chmod +x  zabbix:zabbix /etc/zabbix/scripts/*

重启客户端服务:

#/etc/init.d/zabbix/zabbix_agentd restart

博文来自:www.51niux.com

1.2 zabbix_proxy代理的操作

#/usr/local/zabbix/bin/zabbix_get -s 192.168.14.56 -k redis.parameter.discovery  #测试redis的自动发现info参数的脚本

{
        "data":[
        {"{#SITENAME}":"redis_version"},
        {"{#SITENAME}":"redis_git_sha1"},
        {"{#SITENAME}":"redis_git_dirty"},
        {"{#SITENAME}":"redis_build_id"},
        {"{#SITENAME}":"redis_mode"},
        {"{#SITENAME}":"os"},
        {"{#SITENAME}":"arch_bits"},
        {"{#SITENAME}":"multiplexing_api"},
        {"{#SITENAME}":"gcc_version"},
        {"{#SITENAME}":"process_id"},
        {"{#SITENAME}":"run_id"},
        {"{#SITENAME}":"tcp_port"},
        {"{#SITENAME}":"uptime_in_seconds"},
        {"{#SITENAME}":"uptime_in_days"},
        {"{#SITENAME}":"hz"},
        {"{#SITENAME}":"lru_clock"},
        {"{#SITENAME}":"executable"},
        {"{#SITENAME}":"config_file"},
        {"{#SITENAME}":"connected_clients"},
        {"{#SITENAME}":"client_longest_output_list"},
        {"{#SITENAME}":"client_biggest_input_buf"},
        {"{#SITENAME}":"blocked_clients"},
        {"{#SITENAME}":"used_memory"},
        {"{#SITENAME}":"used_memory_human"},
        {"{#SITENAME}":"used_memory_rss"},
        {"{#SITENAME}":"used_memory_rss_human"},
        {"{#SITENAME}":"used_memory_peak"},
        {"{#SITENAME}":"used_memory_peak_human"},
        {"{#SITENAME}":"total_system_memory"},
        {"{#SITENAME}":"total_system_memory_human"},
        {"{#SITENAME}":"used_memory_lua"},
        {"{#SITENAME}":"used_memory_lua_human"},
        {"{#SITENAME}":"maxmemory"},
        {"{#SITENAME}":"maxmemory_human"},
        {"{#SITENAME}":"maxmemory_policy"},
        {"{#SITENAME}":"mem_fragmentation_ratio"},
        {"{#SITENAME}":"mem_allocator"},
        {"{#SITENAME}":"loading"},
        {"{#SITENAME}":"rdb_changes_since_last_save"},
        {"{#SITENAME}":"rdb_bgsave_in_progress"},
        {"{#SITENAME}":"rdb_last_save_time"},
        {"{#SITENAME}":"rdb_last_bgsave_status"},
        {"{#SITENAME}":"rdb_last_bgsave_time_sec"},
        {"{#SITENAME}":"rdb_current_bgsave_time_sec"},
        {"{#SITENAME}":"aof_enabled"},
        {"{#SITENAME}":"aof_rewrite_in_progress"},
        {"{#SITENAME}":"aof_rewrite_scheduled"},
        {"{#SITENAME}":"aof_last_rewrite_time_sec"},
        {"{#SITENAME}":"aof_current_rewrite_time_sec"},
        {"{#SITENAME}":"aof_last_bgrewrite_status"},
        {"{#SITENAME}":"aof_last_write_status"},
        {"{#SITENAME}":"total_connections_received"},
        {"{#SITENAME}":"total_commands_processed"},
        {"{#SITENAME}":"instantaneous_ops_per_sec"},
        {"{#SITENAME}":"total_net_input_bytes"},
        {"{#SITENAME}":"total_net_output_bytes"},
        {"{#SITENAME}":"instantaneous_input_kbps"},
        {"{#SITENAME}":"instantaneous_output_kbps"},
        {"{#SITENAME}":"rejected_connections"},
        {"{#SITENAME}":"sync_full"},
        {"{#SITENAME}":"sync_partial_ok"},
        {"{#SITENAME}":"sync_partial_err"},
        {"{#SITENAME}":"expired_keys"},
        {"{#SITENAME}":"evicted_keys"},
        {"{#SITENAME}":"keyspace_hits"},
        {"{#SITENAME}":"keyspace_misses"},
        {"{#SITENAME}":"pubsub_channels"},
        {"{#SITENAME}":"pubsub_patterns"},
        {"{#SITENAME}":"latest_fork_usec"},
        {"{#SITENAME}":"migrate_cached_sockets"},
        {"{#SITENAME}":"role"},
        {"{#SITENAME}":"connected_slaves"},
        {"{#SITENAME}":"master_repl_offset"},
        {"{#SITENAME}":"repl_backlog_active"},
        {"{#SITENAME}":"repl_backlog_size"},
        {"{#SITENAME}":"repl_backlog_first_byte_offset"},
        {"{#SITENAME}":"repl_backlog_histlen"},
        {"{#SITENAME}":"used_cpu_sys"},
        {"{#SITENAME}":"used_cpu_user"},
        {"{#SITENAME}":"used_cpu_sys_children"},
        {"{#SITENAME}":"used_cpu_user_children"},
        {"{#SITENAME}":"cluster_enabled"}
        ]
}

#redis的Info信息总共有82个参数,用上面的自定义key已经都取出来了。

# /usr/local/zabbix/bin/zabbix_get -s 192.168.14.56 -k redis.info.value[used_memory]  #测试redis.info.value传参也可以

821512

1.3 zabbix服务端Web操作

创建redis模板:

image.png

#先创建redis的模板。

image.png

#然后创建Redis的应用集。

image.png

#添加一个自动发现的规则,将redis的Info信息里面的所有参数名都发现出来。

image.png

选择主机添加模板:

#上面已经将一个简单的Redis模板创建完成了,现在找一个主机进行添加吧。

image.png

image.png

#点击此主机的自动发现,如果最后边的状态有红色的叹号,说明哪里会有问题,鼠标移动到叹号哪里也会有提示

image.png

#点击此主机的监控项选择Redis应用集,可以看到我们设置的自动发现规则里面的监控项原型生效了。一共两页82行。

博文来自:www.51niux.com

检查是否有数据:

#查看最新数据,选择主机以及应用集,查看是否能采集到数据。

image.png

#从上图可以看到我们已经可以对redis的info信息的每一项参数进行数据采集了.

image.png

1.4 小结

好的上面这种利用自动发现方式来获取redis信息的方式已经展示完了,当然因为是一个简单示例还有可以改进的地方。

它的优势就是可以根据客户端的情况灵活的传递参数,而非向上一篇TCP连接状态那样,在Web端要定义监控项和图形。

它不好的地方呢就是信息太多太杂,很多信息并非DBA关心的,也就是没用的数据,跟直接在redis哪里执行info一个鸟样,另外呢全是历史记录,没图啊,没图你搞个毛啊,看不出走势啊,没图咋分析问题啊。

二、zabbix监控redis单实例(常用方法)

2.1 客户端的操作

编写获取redis的value值的脚本:

$ cat /etc/zabbix/scripts/redis_info_value.sh

#!/bin/bash
Info_Parameter="$1"
Redis_Port="20000"
Redis_Host="127.0.0.1"
Redis_Passwd="redis48cs"
Info_file="/home/zabbix/tmp/info.txt"
/usr/local/bin/redis-cli -h 127.0.0.1 -p 20000 -a redis48cs  "info" >$Info_file
Info_Values(){
   INFO_VALUE=$(grep "$Info_Parameter"\: $Info_file|awk -F ":" {'print $NF'})
   echo "$INFO_VALUE"
}
Info_Values $1

创建上面脚本对应的目录和文件:

#mkdir /home/zabbix/tmp

#touch /home/zabbix/tmp/info.txt

#chown -R zabbix:zabbix /home/zabbix

#chmod 777 /home/zabbix/tmp/info.txt

编写自定义的key:

$ cat /etc/zabbix/zabbix_agentd.conf.d/redis_info_value.conf 

UserParameter=redis.info.value[*],/bin/bash /etc/zabbix/scripts/redis_info_value.sh "$1"

给对应的脚本授权:

#chown -R zabbix:zabbix /etc/zabbix/*

#chmod +x  zabbix:zabbix /etc/zabbix/scripts/*

重启客户端服务:

#/etc/init.d/zabbix/zabbix_agentd restart

1.2 zabbix_proxy代理的操作

# /usr/local/zabbix/bin/zabbix_get -s 192.168.14.55 -k redis.info.value[used_cpu_user]   #取值是可以的,有浮点数

2.26

# /usr/local/zabbix/bin/zabbix_get -s 192.168.14.55 -k redis.info.value[maxmemory_human]  #有字符型

8.00G

1.3 zabbix服务端Web操作

创建redis模板:

image.png

#创建一个Redis的模板,然后创建一个Redis的应用集,这个就不说了。

创建监控项:

#首先info里面的好多信息是没用的,另外好多参数是将上面的参数转换成可读的形式,例如,used_memory_peak和used_memory_peak_human,显然我们就要前面的就可以了,因为你用后面是一个字符型,你客户端还要写脚本再转回成字节类型,所以类似于这种就直接在服务器取字节的形式然后转换就行了。如下图:

image.png

#然后又得又不是整数型,是浮点数的类型,如果你选择成整数类型的话,又获取不到值,如下图:

image.png

#像这种CPU就不需要转换了,因为本身你也不可能有太多的CPU占用。

image.png

#最后监控项就做成了这样子,左边呢根据$1可以显示参数的名称,右边呢可以根据键值取出对应的数字。

redis_info_value_templates.xml

#然后找个redis的主机关联一下。

查看最后的效果:

image.png

image.png

1.4 小结

#上面是一个简单的小例子,也没有做图形也没有做触发器,生产中呢可以根据自己的需求,跟DBA或者使用Redis的人进行沟通,他们比较关心那些方面,就将那些监控起来,然后做图形做触发器之类的,像我们的DBA呢就比较关心内存是否达到上限啊,复制是否运行正常啊,是不是有大查询导致服务挂掉了啊之类的。

#然后呢,redis不像别的数据库服务,还能针对不同的用户设置不同的权限,redis就一个密码验证,那么好多时候呢你监控用户是执行不了redis-cli命令的,对redis的监控呢,不如让DBA写个定时任务,定时的导出info信息一份到一个公共区域的文件里面去,可以加上时间戳,然后zabbix去分析这个对应时间戳的文件,将info监控项对应的值取出来交给proxy端。

三、zabbix监控redis多实例(自动发现)

#这个以后有机会再写吧,先留个坑,网上也很多博客写这个。

#一个服务器上面redis可能是多实例,端口呢也可能不一样,也就是多实例起多个非固定的端口。

#我是这么想的啊,首先利用自动发现,最上面不是写了个自动发现info参数的脚本嘛,得改成自动发现本地有哪些redis端口。

#然后呢一般多实例呢都是在同一个根目录下面,然后不同的业务目录下面的redis.conf文件里面定义了,现在一般还是有密码的,咱们也就别去跟DBA要密码了,redis挺重要的服务人家也不见得愿意给你或者让你操作redis,不如就让人家每分钟导出一份数据来写到公共区域,然后以(redis.conf所在的上级目录来开头_端口_时间戳.txt),类似于这种形式的记录文件命名,这样我们是哪个业务的redis知道了,是哪个端口知道了,然后其中对应的info信息也知道了,是不是最新的info信息也知道了。

#然后服务端怎么取啊,前面记录了一个网卡的自动发现功能,用哪个意思就OK了,两种方式,比如我上面不是监控了八项嘛,把这八项写成八个自定义的key,[自动发现的端口,业务名称],然后监控项名称取$2,然后自定义的那些key呢要端口$1去对应的端口文件里面去取值,这样就都OK啦。另一种方式就是还是像上面似得定义一个自定义的key,然后客户端的脚本就需要复杂点了,[info参数名称,redis的端口号,业务名称],这样客户端的脚本文件根据传递过来的$2去找对应的info记录文件,然后根据$1做过滤取值


作者:忙碌的柴少 分类:zabbix 浏览:6072 评论:0
留言列表
发表评论
来宾的头像