zoukankan      html  css  js  c++  java
  • zabbix示例之监控Redis状态

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

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

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

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

    1.1 客户端的配置

    自动发现脚本编写:

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

    Bash
    #!/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 '{
    '
       printf '	"data":[
    '
       for((i=0;i<${Redis_Site_Num};i++))
       {
          if [ `expr $i + 1 ` != ${Redis_Site_Num} ];then  
             printf "	{"{#SITENAME}":"${Redis_Site_parameter[$i]}"},
    "
          else
             printf "	{"{#SITENAME}":"${Redis_Site_parameter[$i]}"}
    "
          fi
       }
       printf '	]
    '
       printf '}
    '
    }
    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取值

    Bash
    #!/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

    Bash
    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传递给下面的脚本

    Bash
    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参数的脚本

    Bash
    {
            "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传参也可以

    Bash
    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

    Bash
    #!/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 

    Bash
    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]   #取值是可以的,有浮点数

    Bash
    2.26

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

    Bash
    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做过滤取值

  • 相关阅读:
    【原创】C#零基础学习笔记010-数据流技术
    【原创】C#零基础学习笔记009-异常处理
    【原创】C#零基础学习笔记008-C#集合处理
    【原创】C#零基础学习笔记007-面向对象的特性
    【原创】C#零基础学习笔记006-面向对象编程基础
    【原创】C#零基础学习笔记005-字符串和日期
    【原创】C#零基础学习笔记004-数组
    session
    最简朴的 session 来实现 登录验证
    cookies session 代码例子
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/13217694.html
Copyright © 2011-2022 走看看