zoukankan      html  css  js  c++  java
  • 记一次线上Zabbix对Redis监控实录

    前言:Redis作为缓存服务器我想大家都比较的熟悉,那么,如果想要更好的维护和监控,那么我们会对其redis服务器统一监控起来,如何监控呢?如果在生产环境一台服务器部署多个redis,这样就会出现多个端口,如何实施有效的监控呢?下面看下多给出的实录~

     [redis-agent端]

    主要用于接受redis性能参数

    # vim  /etc/zabbix/zabbix_agentd.d/redis_status 

    #!/bin/bash
    REDISCLI="/usr/local/redis/bin/redis-cli"
    HOST="127.0.0.1"
    PORT=($(sudo netstat -tpln | awk -F "[ :]+" '/redis/ && /0.0.0.0/ {print $5}'))
    PASS="xxxxxxx"
    
    if [[ $# == 1 ]];then
        case $1 in
            version)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info server | grep -w "redis_version" | awk -F':' '{print $2}'`
                echo $result
            ;;
            uptime)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info server | grep -w "uptime_in_seconds" | awk -F':' '{print $2}'`
                echo $result
            ;;
            connected_clients)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info clients | grep -w "connected_clients" | awk -F':' '{print $2}'`
                echo $result
            ;;
            blocked_clients)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info clients | grep -w "blocked_clients" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_memory)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info memory | grep -w "used_memory" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_memory_rss)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info memory | grep -w "used_memory_rss" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_memory_peak)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info memory | grep -w "used_memory_peak" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_memory_lua)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info memory | grep -w "used_memory_lua" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_cpu_sys)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info cpu | grep -w "used_cpu_sys" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_cpu_user)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info cpu | grep -w "used_cpu_user" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_cpu_sys_children)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info cpu | grep -w "used_cpu_sys_children" | awk -F':' '{print $2}'`
                echo $result
            ;;
            used_cpu_user_children)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info cpu | grep -w "used_cpu_user_children" | awk -F':' '{print $2}'`
                echo $result
            ;;
            rdb_last_bgsave_status)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info Persistence | grep -w "rdb_last_bgsave_status" | awk -F':' '{print $2}' | grep -c ok`
                echo $result
            ;;
            aof_last_bgrewrite_status)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info Persistence | grep -w "aof_last_bgrewrite_status" | awk -F':' '{print $2}' | grep -c ok`
                echo $result
            ;;
            aof_last_write_status)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info Persistence | grep -w "aof_last_write_status" | awk -F':' '{print $2}' | grep -c ok`
                echo $result
            ;;
            *)
                echo -e "33[33mUsage: $0 {connected_clients|blocked_clients|used_memory|used_memory_rss|used_memory_peak|used_memory_lua|used_cpu_sys|used_cpu_user|used_cpu_sys_children|used_cpu_user_children|rdb_last_bgsave_status|aof_last_bgrewrite_status|aof_last_write_status}33[0m"
            ;;
        esac
    elif [[ $# == 2 ]];then
        case $2 in
            keys)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info | grep -w "$1" | grep -w "keys" | awk -F'=|,' '{print $2}'`
                echo $result
            ;;
            expires)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info | grep -w "$1" | grep -w "keys" | awk -F'=|,' '{print $4}'`
                echo $result
            ;;
            avg_ttl)
                result=`$REDISCLI -h $HOST -a $PASS -p $PORT info | grep -w "$1" | grep -w "avg_ttl" | awk -F'=|,' '{print $6}'`
                echo $result
            ;;
            *)
                echo -e "33[33mUsage: $0 {db0 keys|db0 expires|db0 avg_ttl}33[0m" 
            ;;
        esac
    fi

    # chmod 755 -R /etc/zabbix/zabbix_agentd.d/redis_status 

    [root@lamp02-salve ~]# vim /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf

    UserParameter=Redis.Info[*],/etc/zabbix/zabbix_agentd.d/redis_status $1 $2
    UserParameter=Redus.Status,/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 ping | grep -c PONG

    [root@localhost ~]# vim /etc/sudoers

    Defaults:zabbix !requiretty
    zabbix ALL=(root) NOPASSWD:/bin/netstat

    zabbix-server端测试key值,下面所能监控redis性能参数

    监控指标详解:

    connected_clients    #已连接客户端的数量
    
    blocked_clients       #正在等待阻塞命令的客户端数量
    
    used_memory    #由redis分配器分配的内存总量
    
    used_memory_rss    #操作系统角度,redis返回的已分配的内存总量
    
    used_memory_peak    #redis内存消耗峰值
    
    used_memory_lua       #引擎所使用的内存大小
    
    used_cpu_sys          #redis服务器消耗的系统CPU
    
    used_cpu_user        #服务器消耗的用户CPU
    
    used_cpu_sys_children    #redis后台进程消耗的系统cpu
    
    used_cpu_user_children   #redis后台进程消耗的用户cpu
    
    rdb_last_bgsave_status       #关系数据库最后的bgsave状态
    
    aof_last_bgrewrite_status    #上次重写状态
    
    aof_last_write_status       #上次写入的状态

    [root@zabbix-server ~]# /usr/local/zabbix/bin/zabbix_get -s 192.168.2.158 -k Redis.Info[used_memory]   #随机选填一个性能参数,如redis用户内存使用情况,即可获取数值
    826528,

    zabbix-web端定义监控模板即可(在这里,具体监控模板就省略哈,如果想获取的话,可以添加博客QQ群号,在群中即可找我获取即可)

    Ps:下图是我对redis的所有该主机监控指标都进行堆叠整合~

    【案例需求二】

    近期,由于新上线一批redis重要业务以及集群,需要将redis端口统一监控起来,那么需要监控端口哪些状态呢?这里可以监控,端口的连接数,运行时间等等,

    我们都知道,redis可能会做多实例,每个机器上面的redis都存在这不同端口,这里可以编写自动发现redis端口,随后进行监控,在这里,我给出来脚本

    shell脚本获取redis端口

    #!/bin/bash
    #Script_name zabbix_discovery_redis.sh 
    #Auto bxy 2018年11月20日12:04:10
    redis() {
                port=($(sudo netstat -tpln | awk -F "[ :]+" '/redis/ && /0.0.0.0/ {print $5}'))
                printf '{
    '
                printf '	"data":[
    '
                   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 '	 {
    '
                              printf "			"{#REDISPORT}":"${port[${key}]}"},
    "
                         else [[ "${key}" -eq "((${#port[@]}-1))" ]]
                  socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
                              printf '	 {
    '
                              printf "			"{#REDISPORT}":"${port[${key}]}"}
    "
                           fi
                   done
                              printf '	 ]
    '
                              printf '}
    '
    }
    $1

    python脚本获取端口

    [root@lamp02-salve alterscripts]# cat redis_discovery.py 
    #!/usr/bin/env python
    import os
    import  json 
    t=os.popen("""sudo netstat -tlpn |grep redis|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=(',',':'))

    [root@localhost ~]# chmod 755 /etc/zabbix/zabbix_agentd.d/zabbix_discovery_redis.sh 

    [root@localhost ~]# vim  /etc/zabbix/zabbix_agentd.d/userparameter_redis.conf   #这个是shell脚本写入的key
    UserParameter=redis.discovery[*],/etc/zabbix/zabbix_agentd.d/zabbix_discovery_redis.sh $1
    UserParameter=redis_stats[*],(echo info; sleep 1) | telnet 192.168.37.137 $1 2>&1 |grep $2|cut -d : -f2

    允许zabbix用户无密码运行netstat

    [root@localhost ~]# vim /etc/sudoers  否则会无法检测端口

    Defaults:zabbix !requiretty
    zabbix ALL=(root) NOPASSWD:/bin/netstat

    Ps:在这里我们还是用python获取redis端口号吧,这样更加灵活,轻便~

    [root@lamp02-salve ~]# chmod 755 /etc/zabbix/alterscripts/redis_discovery.py    #py脚本呢写完之后,授权即可,直接执行,验证端口是否正常获取~,如果有多个端口,同样全部收集~

    [root@lamp02-salve ~]# vim /etc/zabbix/zabbix_agentd.d/redis_discovery_port.conf

    UserParameter=redis.discovery,/usr/bin/python /etc/zabbix/alterscripts/redis_discovery.py
    UserParameter=redis_stats[*],/usr/local/redis/bin/redis-cli -p $1 -h 127.0.0.1 info |grep -w $2|cut -d : -f2

    最后在zabbix server端验证是够能获取到redis端口~显然是没问题的

    Ps:如果在server端获取key值时,出现以下错误,那是因为Item由于各种原因返回时间会比较长,导致的,修改agent端timeout参数即可,如下所示

    Timeout=8

    另外还需要在sudo配置文件中修改一下参数,免密sudo获取redis密码验证

    Defaults !requiretty

    zabbix ALL=(ALL) NOPASSWD: ALL

     到此我们server端测试数据无问题。接下来在web界面配置了

     

    触发器类型添加

    ok!打完收工~

  • 相关阅读:
    【模板】可持久化线段树
    【模板】可持久化权值线段树(主席树)
    BZOJ 2456 Mode
    【模板】可持久化Treap
    BZOJ 1452 Count 【模板】二维树状数组
    高级线程之线程池
    STL优先队列重载
    单链表及简单应用
    2017 计蒜之道 初赛 第一场 A 阿里的新游戏
    2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)
  • 原文地址:https://www.cnblogs.com/bixiaoyu/p/9988693.html
Copyright © 2011-2022 走看看