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配置並啓用,zabbix3會自動生成新的圖形):
redis的zabbix監控模板xml下載:
http://down.51cto.com/data/2453193
原文:http://www.zhaoyanan.cn/redis-zabbix-mon.html