redis詳細監控(比官方腳本詳細)

redis詳細監控,優勢:

1.比官方腳本詳細(截止201810); 

2.採用shell實現zabbix自定義監控項,更加通用;

3.中文告警,易懂;

4. 支持自動發現同機同安裝目錄的所有redis,並創建監控項、觸發器和圖形


腳本內容:

#!/bin/bash
###################################
# date author note
# 2014/08/06 [email protected] pioneer
# 2015/06/30 [email protected] update
# 2018/04/13 [email protected] 增加密碼參數,增加大量必要監控項和中文註釋
# 2018/04/18 [email protected] 修改文件路徑等一系列bug
# 2018/09/21 [email protected] 修正redis4上面密碼不安全提示問題
#
# function for redis montior
#
# touch /opt/zabbix/bin/redis_monitor.sh; chmod +x /opt/zabbix/bin/redis_monitor.sh
#
# redis的zabbix配置:
# UserParameter=custom.redis.discovery,/opt/zabbix/bin/redis_monitor.sh discovery
# UserParameter=custom.redis.status[*],/opt/zabbix/bin/redis_monitor.sh $1 $2 $3
###################################


############# 配置部分 ##################
export HOST="127.0.0.1"
export PORT="$1"

# redis自定義安裝的目錄
export BASE_DIR=/opt/redis

# 如果無密碼,置空即可。或者直接從本地配置中獲取密碼。該配置這兒如果不配,下面會自動償試從本地配置中獲取
# export PASSWD="pass"

############# 配置結束 ##################

# 環境變量
export
export LC_ALL=C
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

############# PROGRAM ##############

if [ "$1" == "" ] || [ "$1" == "help" ]; then
    echo "\$1 Can not be empty, error, exit."
    exit
fi


# 發現規則
REDIS=""
if [ "$1" == "discovery" ];then
    for each in `find ${BASE_DIR} -name "redis*.conf" -type f|xargs grep '^port'|cut -d' ' -f2|sort|uniq`
    do
        REDIS=${REDIS}'"{#REDISPORT}":"'${each}'",'
    done

    echo '{"data": [{'${REDIS}'}]}' | sed 's/,/},{/g' | sed 's/,{}//'
    exit
fi


# 密碼判斷和獲取
if [ "$PASSWD" == "" ];then
    if [ "$1" == "6379" ] && [ -f ${BASE_DIR}/redis.conf ];then
        PASSWD=`grep -v "^#" ${BASE_DIR}/redis.conf | sed '/^$/d' | grep requirepass | awk '{ print $2; }'`
    else
        PASSWD=`grep -v "^#" ${BASE_DIR}/redis_$1.conf | sed '/^$/d' | grep requirepass | awk '{ print $2; }'`
    fi
fi
if [ "$PASSWD" != "" ];then
    pw_parameter="-a"
else
    pw_parameter=""
fi


# 定義命令路徑
export REDISCLI="${BASE_DIR}/bin/redis-cli"

if [ ! -f "$REDISCLI" ];then
    REDISCLI="${BASE_DIR}/src/redis-cli"
fi
REDISCONN="$REDISCLI -h $HOST -p $PORT $pw_parameter $PASSWD"


# 獲取監控值
if [[ $# == 2 ]];then
    case $2 in
        redis_ping)
            result=`$REDISCONN ping 2> /dev/null | grep -c PONG`
            echo $result
        ;;
        redis_version)
            result=`$REDISCONN info 2> /dev/null | grep -w "redis_version" | awk -F':' '{print $2}'`
            echo $result
        ;;
        uptime_in_seconds)
            # 自 Redis 服務器啓動以來,經過的秒數
            result=`$REDISCONN info 2> /dev/null | grep -w "uptime_in_seconds" | awk -F':' '{print $2}'`
            echo $result
        ;;
        uptime_in_days)
            # 自 Redis 服務器啓動以來,經過天數
            result=`$REDISCONN info 2> /dev/null | grep -w "uptime_in_days" | awk -F':' '{print $2}'`
            echo $result
        ;;
        connected_clients)
            # 已連接客戶端的數量(不包括通過從屬服務器連接的客戶端)
            result=`$REDISCONN info 2> /dev/null | grep -w "connected_clients" | awk -F':' '{print $2}'`
            echo $result
        ;;
        blocked_clients)
            # 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量
            result=`$REDISCONN info 2> /dev/null | grep -w "blocked_clients" | awk -F':' '{print $2}'`
            echo $result
        ;;
        used_memory)
            # 由 Redis分配器分配的內存總量,以字節(byte)爲單位
            result=`$REDISCONN info 2> /dev/null | grep -w "used_memory" | awk -F':' '{print $2}'`
            echo $result
        ;;
        used_memory_rss)
            # 從操作系統的角度,返回 Redis 已分配的內存總量(俗稱常駐集大小)。這個值和 top 、 ps等命令的輸出一致。
            result=`$REDISCONN info 2> /dev/null | grep -w "used_memory_rss" | awk -F':' '{print $2}'`
            echo $result
        ;;
        used_memory_peak)
            # Redis 的內存消耗峯值(以字節爲單位)
            result=`$REDISCONN info 2> /dev/null | grep -w "used_memory_peak" | awk -F':' '{print $2}'`
            echo $result
        ;;
        used_memory_lua)
            # Lua 引擎所使用的內存大小(以字節爲單位)
            result=`$REDISCONN info 2> /dev/null | grep -w "used_memory_lua" | awk -F':' '{print $2}'`
            echo $result
        ;;
        mem_fragmentation_ratio)
            # 內存碎片的比率,used_memory_rss 和 used_memory 之間的比率
            # 在理想情況下, used_memory_rss 的值應該只比 used_memory 稍微高一點兒。
            # 當 rss > used ,且兩者的值相差較大時,表示存在(內部或外部的)內存碎片。
            # 內存碎片的比率可以通過 mem_fragmentation_ratio 的值看出。
            # 當 used > rss 時,表示 Redis 的部分內存被操作系統換出到交換空間了,在這種情況下,操作可能會產生明顯的延遲。
            result=`$REDISCONN info 2> /dev/null | grep -w "mem_fragmentation_ratio" | awk -F':' '{print $2}'`
            echo $result
        ;;
        aof_current_size)
            # AOF 文件目前的大小
            result=`$REDISCONN info 2> /dev/null | grep -w "aof_current_size" | awk -F':' '{print $2}'`
            echo $result
        ;;
        aof_pending_bio_fsync)
            # 後臺 I/O 隊列裏面,等待執行的 fsync 調用數量。
            result=`$REDISCONN info 2> /dev/null | grep -w "aof_pending_bio_fsync" | awk -F':' '{print $2}'`
            echo $result
        ;;
        aof_last_rewrite_time_sec)
            # 最近一次創建 AOF 文件耗費的時長。
            result=`$REDISCONN info 2> /dev/null | grep -w "aof_last_rewrite_time_sec" | awk -F':' '{print $2}'`
            echo $result
        ;;
        aof_last_bgrewrite_status)
            # 一個標誌值,記錄了最近一次創建 AOF 文件的結果是成功還是失敗。
            result=`$REDISCONN info 2> /dev/null | grep -w "aof_last_bgrewrite_status" | awk -F':' '{print $2}' | grep -c ok`
            echo $result
        ;;
        aof_last_write_status)
            # 沒搞懂aof_last_bgrewrite_status和aof_last_write_status的區別
            result=`$REDISCONN info 2> /dev/null | grep -w "aof_last_write_status" | awk -F':' '{print $2}' | grep -c ok`
            echo $result
        ;;
        rdb_changes_since_last_save)
            # 距離最近一次成功創建持久化文件之後,經過了多少秒。
            result=`$REDISCONN info 2> /dev/null | grep -w "rdb_changes_since_last_save" | awk -F':' '{print $2}'`
            echo $result
        ;;
        rdb_last_save_time)
            # 最近一次成功創建 RDB 文件的 UNIX 時間戳。
            result=`$REDISCONN info 2> /dev/null | grep -w "rdb_last_save_time" | awk -F':' '{print $2}'`
            echo $result
        ;;
        rdb_last_bgsave_status)
            # 一個標誌值,記錄了最近一次創建 RDB 文件的結果是成功還是失敗。
            result=`$REDISCONN info 2> /dev/null | grep -w "rdb_last_bgsave_status" | awk -F':' '{print $2}' | grep -c ok`
            echo $result
        ;;
        rdb_last_bgsave_time_sec)
            # 記錄了最近一次創建 RDB 文件耗費的秒數。
            result=`$REDISCONN info 2> /dev/null | grep -w "rdb_last_bgsave_time_sec" | awk -F':' '{print $2}'`
            echo $result
        ;;
        instantaneous_ops_per_sec)
            # 服務器每秒鐘執行的命令數量。
            result=`$REDISCONN info 2> /dev/null | grep -w "instantaneous_ops_per_sec" | awk -F':' '{print $2}'`
            echo $result
        ;;
        rejected_connections)
            # 因爲最大客戶端數量限制而被拒絕的連接請求數量。
            result=`$REDISCONN info 2> /dev/null | grep -w "rejected_connections" | awk -F':' '{print $2}'`
            echo $result
        ;;
        expired_keys)
            # 因爲過期而被自動刪除的數據庫鍵數量。
            result=`$REDISCONN info 2> /dev/null | grep -w "expired_keys" | awk -F':' '{print $2}'`
            echo $result
        ;;
        evicted_keys)
            # 因爲最大內存容量限制而被驅逐(evict)的鍵數量。
            result=`$REDISCONN info 2> /dev/null | grep -w "evicted_keys" | awk -F':' '{print $2}'`
            echo $result
        ;;
        keyspace_hits_rate)
            # 鍵請求命中率
            i=`$REDISCONN info 2> /dev/null | grep -w "keyspace_hits" | awk -F':' '{print $2}' | tr -d "\r"`
            j=`$REDISCONN info 2> /dev/null | grep -w "keyspace_misses" | awk -F':' '{print $2}'| tr -d "\r"`
            result=$(($i*100/($i+$j)))
            echo $result
        ;;
        latest_fork_usec)
            # 最近一次 fork() 操作耗費的毫秒數。當 Redis 持久化數據到磁盤上時,它會進行一次 fork 操作。# 是毫秒還是微秒,應該是微秒吧
            result=`$REDISCONN info 2> /dev/null | grep -w "latest_fork_usec" | awk -F':' '{print $2}'`
            echo $result
        ;;
        master_link_down_since_seconds)
            # 主從服務器連接斷開了多少秒。
            result=`$REDISCONN info 2> /dev/null | grep -w "master_link_down_since_seconds" | awk -F':' '{print $2}'`
            echo $result
        ;;
        master_last_io_seconds_ago)
            # 主從服務器連接斷開了多少秒。
            result=`$REDISCONN info 2> /dev/null | grep -w "master_last_io_seconds_ago" | awk -F':' '{print $2}'`
            echo $result
        ;;
        master_link_status)
            # 複製連接當前的狀態, up 表示連接正常, down 表示連接斷開。
            result=`$REDISCONN info 2> /dev/null | grep -w "master_link_status" | awk -F':' '{print $2}' | grep -c up`
            echo $result
        ;;
        used_cpu_sys)
            # Redis 服務器耗費的系統 CPU 。
            result=`$REDISCONN info 2> /dev/null | grep -w "used_cpu_sys" | awk -F':' '{print $2}' | cut -d'.' -f 1`
            echo $result
        ;;
        used_cpu_user)
            # Redis 服務器耗費的用戶 CPU 。
            result=`$REDISCONN info 2> /dev/null | grep -w "used_cpu_user" | awk -F':' '{print $2}' | cut -d'.' -f 1`
            echo $result
        ;;
        used_cpu_sys_children)
            # 後臺進程耗費的系統 CPU 。
            result=`$REDISCONN info 2> /dev/null | grep -w "used_cpu_sys_children" | awk -F':' '{print $2}' | cut -d'.' -f 1`
            echo $result
        ;;
        used_cpu_user_children)
            # 後臺進程耗費的用戶 CPU 。
            result=`$REDISCONN info 2> /dev/null | grep -w "used_cpu_user_children" | awk -F':' '{print $2}' | cut -d'.' -f 1`
            echo $result
        ;;
        *)
            echo -e "\033[33mUsage: $0 PORT Parameter\033[0m" 
        ;;
    esac
elif [[ $# == 3 ]];then
    case $3 in
        keys)
            result=`$REDISCONN info 2> /dev/null | grep -w "$2" | grep -w "keys" | awk -F'=|,' '{print $2}'`
            echo $result
        ;;
        expires)
            result=`$REDISCONN info 2> /dev/null | grep -w "$2" | grep -w "keys" | awk -F'=|,' '{print $4}'`
            echo $result
        ;;
        avg_ttl)
            result=`$REDISCONN info 2> /dev/null | grep -w "$2" | grep -w "avg_ttl" | awk -F'=|,' '{print $6}'`
            echo $result
        ;;
        *)
            echo -e "\033[33mUsage: $0 PORT Parameter\033[0m" 
        ;;
    esac
fi



監控項展示(如果同機同目錄有多個redis配置並啓用,zabbix3會自動生成新的項控項):

redis-zabbix-mon-jkx.png


監控圖形展示(如果同機同目錄有多個redis配置並啓用,zabbix3會自動生成新的圖形):

redis-zabbix-mon.png


redis的zabbix監控模板xml下載:

http://down.51cto.com/data/2453193


原文:http://www.zhaoyanan.cn/redis-zabbix-mon.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章