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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM