1. 程式人生 > >記一次線上Zabbix對Redis監控實錄

記一次線上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 "\033[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}\033[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 "\033[33mUsage: $0 {db0 keys|db0 expires|db0 avg_ttl}\033[0m" ;; esac fi

 

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

[[email protected] ~]# 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

[[email protected] ~]# 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       #上次寫入的狀態

[[email protected] ~]# /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 '{\n'
            printf '\t"data":[\n'
               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 '\t {\n'
                          printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"},\n"
                     else [[ "${key}" -eq "((${#port[@]}-1))" ]]
              socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $10}'|cut -d ' ' -f 1`
                          printf '\t {\n'
                          printf "\t\t\t\"{#REDISPORT}\":\"${port[${key}]}\"}\n"
                       fi
               done
                          printf '\t ]\n'
                          printf '}\n'
}
$1

python指令碼獲取埠

[[email protected]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=(',',':'))

[[email protected] ~]# chmod 755 /etc/zabbix/zabbix_agentd.d/zabbix_discovery_redis.sh 

[[email protected] ~]# 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

[[email protected] ~]# vim /etc/sudoers  否則會無法檢測埠

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

Ps:在這裡我們還是用python獲取redis埠號吧,這樣更加靈活,輕便~

[[email protected] ~]# chmod 755 /etc/zabbix/alterscripts/redis_discovery.py    #py指令碼呢寫完之後,授權即可,直接執行,驗證埠是否正常獲取~,如果有多個埠,同樣全部收集~

[[email protected] ~]# 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!打完收工~