03.07 面試官:如何用zabbix實現redis緩存服務監控?

概述

今天主要介紹下怎麼通過zabbix去監控redis。

Zabbix-server通過agent監控中配置文件調用shell腳本。Redis中提供redis-cli 命令使用info可以獲得redis大部分信息。在使用shell命令獲取到需要的信息。


一、監控原理

要獲得Redis的當前情況,使用info命令即可。具體用法:#redis-cli -h 127.0.0.1 -p 6379 -a redis_passwd info [參數] 。

針對不同的參數就會看到具體的數字,如果沒有帶參數,那麼就會把默認情況寫出來,如果帶上all參數,那麼就會把所有情況都寫出來。比如:#redis-cli -h 127.0.0.1 -p 6379 -a redis_passwd info server,就會看到redis關於server的一些數據。

  • info查看到信息
    redis-cli -h IP -p 端口 -a 密碼 info
<code># Server 服務器信息
redis_version:3.2.1 #版本號
redis_git_sha1:00000000 #Git SHA1
redis_git_dirty:0 #Git dirty flag
redis_build_id:3ea7e649f97792bd
redis_mode:standalone #redis模式
os:Linux 3.10.0-514.el7.x86_64 x86_64 #內核版本
arch_bits:64
multiplexing_api:epoll #Redis 所使用的事件處理機制
gcc_version:4.8.5 #GCC版本
process_id:6946 #進程id
run_id:e15a5c178ef674e23d01689c2acfa64f8452ac71
tcp_port:6379
uptime_in_seconds:9406523 #運行時間(s)

uptime_in_days:108 #運行天數
hz:10
lru_clock:5120936 #以分鐘為單位進行自增的時鐘,用於 LRU 管理
executable:/data/redis-3.2.1/src/./redis-server
config_file:/data/redis-3.2.1/redis.conf #配置文件

# Clients 客戶端連接信息
connected_clients:59 #已連接客戶端的數量(不包括通過從屬服務器連接的客戶端)
client_longest_output_list:0 #當前連接的客戶端當中,最長的輸出列表
client_biggest_input_buf:0 #當前連接的客戶端當中,最大輸入緩存
blocked_clients:16 #正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量

# Memory
#在理想情況下, used_memory_rss 的值應該只比 used_memory 稍微高一點兒。
#當 rss > used ,且兩者的值相差較大時,表示存在(內部或外部的)內存碎片。
#內存碎片的比率可以通過 mem_fragmentation_ratio 的值看出。
#當 used > rss 時,表示 Redis 的部分內存被操作系統換出到交換空間了,在這種情況下,操作可能會產生明顯的延遲。
used_memory:10205728 #Redis分配的內存總量,以字節(byte)為單位
used_memory_human:9.73M #上面的數字加上了單位
used_memory_rss:19922944 #Redis分配的內存總量(包括內存碎片)
used_memory_rss_human:19.00M
used_memory_peak:48473056 #Redis 的內存消耗峰值(以字節為單位)
used_memory_peak_human:46.23M

total_system_memory:1929211904 #系統內存
total_system_memory_human:1.80G
used_memory_lua:37888 #Lua 引擎所使用的內存大小(以字節為單位)
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.95 #內存碎片比率,即used_memory_rss 和 used_memory 之間的比率
mem_allocator:jemalloc-4.0.3 #在編譯時指定的,Redis所使用的內存分配器。可以是libc、jemalloc或者tcmalloc。

# Persistence 持久化
loading:0
rdb_changes_since_last_save:298 #上次保存數據庫之後,執行命令的次數
rdb_bgsave_in_progress:0 #後臺進行中的 save 操作的數量
rdb_last_save_time:1582179177 #最後一次成功保存的時間點,以 UNIX 時間戳格式顯示
rdb_last_bgsave_status:ok #最後一次保存的狀態
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0 #redis是否開啟了aof
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats 統計信息
total_connections_received:4248700 #運行以來連接過的客戶端的總數量
total_commands_processed:58743583 #運行以來執行過的命令的總數量
instantaneous_ops_per_sec:0 #服務器每秒鐘執行的命令數量
total_net_input_bytes:5493734837
total_net_output_bytes:58816466856
instantaneous_input_kbps:0.00

instantaneous_output_kbps:0.00
rejected_connections:0 #因為最大客戶端數量限制而被拒絕的連接請求數量
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:587477 #運行以來過期的 key 的數量
evicted_keys:0 #運行以來刪除過的key的數量
keyspace_hits:7847227 #命中key的次數
keyspace_misses:1334579 #沒命中key的次數
pubsub_channels:0 #目前被訂閱的頻道數量
pubsub_patterns:36 #目前被訂閱的模式數量
latest_fork_usec:836 #最近一次 fork() 操作耗費的微秒數
migrate_cached_sockets:0

# Replication 主/從複製信息
role:master #當前實例的角色master還是slave
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:5993.97 #Redis服務器耗費的系統CPU
used_cpu_user:4488.61 #Redis服務器耗費的用戶CPU
used_cpu_sys_children:179.18 #子進程耗費的系統CPU
used_cpu_user_children:1032.41 #子進程耗費的用戶CPU

# Cluster 是否使用集群
cluster_enabled:0

# Keyspace
db4:keys=6182,expires=140,avg_ttl=5097639 #各個數據庫的key的數量,以及帶有生存期的 key的數量/<code>

根據以上信息使用shell命令可以獲取自己想要檢測的信息。如果監控,可以關注以下:

1)內存使用

如果 Redis 使用的內存超出了可用的物理內存大小,那麼 Redis 很可能系統會被殺掉。針對這一點,你可以通過 info 命令對 used_memory 和 used_memory_peak 進行監控,為使用內存量設定閥值,並設定相應的報警機制。當然,報警只是手段,重要的是你得預先計劃好,當內存使用量過大後,你應該做些什麼,是清除一些沒用的冷數據,還是把 Redis 遷移到更強大的機器上去。

2)持久化

如果因為你的機器或 Redis 本身的問題導致 Redis 崩潰了,那麼你唯一的救命稻草可能就是 dump 出來的rdb文件了,所以,對 Redis dump 文件進行監控也是很重要的。可以通過對rdb_last_save_time 進行監控,瞭解最近一次 dump 數據操作的時間,還可以通過對rdb_changes_since_last_save進行監控來獲得如果這時候出現故障,會丟失(即已改變)多少數據。

3)Keys

通過獲取Keyspace中的結果得到各個數據庫中key的數量

4)QPS

即每分鐘執行的命令個數,即:(total_commands_processed2-total_commands_processed1)/span,為了實時得到QPS,可以設定腳本在後臺運行,記錄過去幾分鐘的total_commands_processed。在計算QPS時,利用過去的信息和當前的信息得出QPS的估計值。



二、zabbix客戶端配置

1、部署zabbix_agent

<code> rpm -ivh zabbix-agent-4.2.6-1.el7.x86_64.rpm/<code>

2、修改zabbix_agent配置文件

<code># vi /etc/zabbix/zabbix_agentd.conf
=============================================================================================
UnsafeUserParameters=1
# 把這個值改為1,因為自動發現的腳本中有一些特殊字符,被認為是不安全的因素,1表示允許這些字符存在
# 如果不改,後期在Server端就會報錯,原因就在這裡
=============================================================================================
# vi /etc/zabbix/zabbix_agentd.d/redis.conf
=============================================================================================
UserParameter=redis_ping,/etc/zabbix/zabbix_agentd.d/redis_check.sh
UserParameter=redis_status[*],/etc/zabbix/zabbix_agentd.d/redis_status.sh $1 $2
=============================================================================================/<code>


3、redis存活腳本(/etc/zabbix/zabbix_agentd.d/redis_check.sh)

環境變量:echo "export PATH=$PATH:/usr/local/redis-3.2.1/src" >> /etc/profile

用於判斷redis服務器連接是否存活

<code>#!/bin/bash
#copyright by hwb
REDISCLI="/data/redis-3.2.1/src/redis-cli"
HOST=`ifconfig | grep inet|grep -v 127.0.0.1 |grep -v inet6 | awk '{print $2}'`
#PORT=($(netstat -tpln | awk -F "[ :]+" '/redis/ && /0.0.0.0/ {print $5}'))
PORT="6379"
PASS="xxx"
STATUS_redis=$($REDISCLI -h $HOST -a $PASS -p $PORT ping)
if [ "$STATUS_redis" == 'PONG' ];then
echo '1'
else
echo '0'
fi/<code>


4、redis狀態腳本

主要命令:redis-cli -h IP -p 端口 -a 密碼 info |grep xxx |awk xxx

<code>#! /bin/bash
#copyright by hwb
#根據自己的安裝情況填寫命令位置主機ip和端口
REDISCLI="/data/redis-3.2.1/src/redis-cli"
HOST=`ifconfig | grep inet|grep -v 127.0.0.1 |grep -v inet6 | awk '{print $2}'`
#PORT=($(netstat -tpln | awk -F "[ :]+" '/redis/ && /0.0.0.0/ {print $5}'))
PORT="6379"
PASS="xxxx"

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
;;
mode)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info server | grep -w "redis_mode" | awk -F':' '{print $2}'`
echo $result
;;
multiplexing_api)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info server | grep -w "multiplexing_api" | 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
;;
mem_ratio)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info memory | grep -w "mem_fragmentation_ratio" | awk -F':' '{print $2}'`
echo $result
;;
aof)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info persistence | grep -w "aof_enabled" | awk -F':' '{print $2}'`
echo $result
;;
total_connections)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info stats | grep -w "total_connections_received" | awk -F':' '{print $2}'`

echo $result
;;
total_commands)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info stats | grep -w "total_commands_processed" | awk -F':' '{print $2}'`
echo $result
;;
expired_keys)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info stats | grep -w "expired_keys" | awk -F':' '{print $2}'`
echo $result
;;
keyspace_hits)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info stats | grep -w "keyspace_hits" | awk -F':' '{print $2}'`
echo $result
;;
keyspace_misses)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info stats | grep -w "keyspace_misses" | awk -F':' '{print $2}'`
echo $result
;;
role)
result=`$REDISCLI -h $HOST -a $PASS -p $PORT info replication | grep -w "role" | 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_us
er_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/<code>


5、修改/etc/sudoers文件

<code>## Allow root to run any commands anywhere
root ALL=(ALL) ALL
zabbix ALL=(ALL) NOPASSWD:ALL #這個是新增
Defaults:zabbix !requiretty #這個是新增/<code>


6、授權並啟動zabbix_agent

<code>chown -R zabbix:zabbix /etc/zabbix
chmod -R 755 /etc/zabbix
systemctl start zabbix-agent
systemctl enable zabbix-agent
systemctl status zabbix-agent/<code>


7、測試key

zabbix_get -s xxx -p 10050 -k redis_status[version]

面試官:如何用zabbix實現redis緩存服務監控?



三、web界面配置-監控項管理

1、redis基本信息

<code>--redis狀態
類型:zabbix 客戶端
鍵值:redis_ping
信息類型:數字
單位:
--redis版本
類型:zabbix 客戶端
鍵值:redis_status[version]
信息類型:字符
更新間隔:1h
--redis模式
類型:zabbix 客戶端
鍵值:redis_status[mode]
信息類型:字符
更新間隔:1h
--redis運行時間
類型:zabbix 客戶端
鍵值:redis_status[uptime]
信息類型:浮點數
單位:uptime
更新間隔:30s
--redis事件處理機制
類型:zabbix 客戶端
鍵值:redis_status[multiplexing_api]
信息類型:字符
更新間隔:1h/<code>


2、redis客戶端連接信息

<code>--已連接客戶端的數量
類型:zabbix 客戶端
鍵值:redis_status[connected_clients]
信息類型:數字
單位:
--正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端數量
類型:zabbix 客戶端
鍵值:redis_status[blocked_clients]
信息類型:數字
單位:/<code>

3、redis內存信息

<code>--Redis分配的內存總量
類型:zabbix 客戶端
鍵值:redis_status[used_memory]
信息類型:浮點數
單位:B
--Redis分配的內存總量(包括內存碎片)
類型:zabbix 客戶端
鍵值:redis_status[used_memory_rss]
信息類型:浮點數
單位:B
--Redis 的內存消耗峰值
類型:zabbix 客戶端
鍵值:redis_status[used_memory_peak]
信息類型:浮點數
單位:B
--Lua 引擎所使用的內存大小

類型:zabbix 客戶端
鍵值:redis_status[used_memory_lua]
信息類型:浮點數
單位:B
--redis內存碎片比率
類型:zabbix 客戶端
鍵值:redis_status[mem_ratio]
信息類型:浮點數
單位:%/<code>

4、redis持久化信息

<code>--redis是否開啟aof
類型:zabbix 客戶端
鍵值:redis_status[aof]
信息類型:數字
單位:
更新間隔:1h
--rdb最後一次保存的狀態
類型:zabbix 客戶端
鍵值:redis_status[rdb_last_bgsave_status]
信息類型:字符
更新間隔:1m
--aof最後一次bgrewrite的狀態
類型:zabbix 客戶端
鍵值:redis_status[aof_last_bgrewrite_status]
信息類型:字符
更新間隔:1m
--aof最後一次寫的狀態
類型:zabbix 客戶端
鍵值:redis_status[aof_last_write_status]
信息類型:字符
更新間隔:1m/<code>

5、redis主/從複製信息

<code>--實例角色
類型:zabbix 客戶端
鍵值:redis_status[role]
信息類型:字符
更新間隔:1h/<code>

6、redis統計信息

<code>--運行以來執行過的命令的總數量
類型:zabbix 客戶端
鍵值:redis_status[total_commands]
信息類型:數字
單位:
更新間隔:30s
--運行以來過期的key的數量
類型:zabbix 客戶端
鍵值:redis_status[expired_keys]
信息類型:數字
單位:
更新間隔:30s
--運行以來連接過的客戶端的總數量
類型:zabbix 客戶端
鍵值:redis_status[total_connections]
信息類型:數字
單位:
更新間隔:30s
--命中key的次數
類型:zabbix 客戶端
鍵值:redis_status[keyspace_hits]
信息類型:數字
單位:

更新間隔:30s
--沒命中key的次數
類型:zabbix 客戶端
鍵值:redis_status[keyspace_misses]
信息類型:數字
單位:
更新間隔:30s/<code>



四、web界面配置-觸發器管理

<code>名稱:{HOST.NAME} Redis  is not running
嚴重性:嚴重
表達式:{redis:redis_ping.avg(3m)}=0/<code>
面試官:如何用zabbix實現redis緩存服務監控?



覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~


面試官:如何用zabbix實現redis緩存服務監控?


分享到:


相關文章: