做爲最底層的技術人員,目前因爲有客戶在運維中遇到混合架構,公有云上使用了產品級別Redis數據庫,同時因爲業務在雲服務器和kubnets的容器內也有redis數據庫,所以對於這種混合模式數據庫的監控,進行簡單的分析總結,在此記錄筆記,在此拋磚引玉,也曾但願對各位有一點點益處。 redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,在原子化操做的基礎上,有具備數據持久化的功能,同時也支持主從同步和集羣搭建,支持發佈訂閱機制,大大提升了數據操做的擴展性和數據冗餘安全性。在目前SAAS不管是共有云仍是私有云,自建集羣,仍是docker容器,監控方式多樣化,針對不一樣的場景各類方式互補來更好的提供監控。html
2.1 雲平臺監控
目前對於SAAS產品級別數據庫產品,即開即用底層均依託於各雲廠商的多副本或集羣方式,來保障數據的安全性和服務的穩定性,但在目前的幾回雲故障中,咱們也要心懷對數據的敬畏之心,各方面多方式作好數據的備份,沒有絕對的安全,不管在多少個9的SLA面前,數據一旦發生不可挽回性丟失或損壞那將是百分之百的損失,數據無價。 所以須要作好數據備份:python
監控方式使用各公有云提供的數據庫監控,可是對於提供監控指標有可能不多,且不少雲廠商監控頻率爲5分,實時性不高,對此咱們可使用自定義監控來將數據上報給雲平臺來擴展自定義監控項,同時聯繫雲服務提供商是否能夠縮短監控頻率等。 可瞭解雲平臺自定義監控:阿里雲自定義監控 此處只舉了一個例子,各不一樣雲廠商若是具備自定義監控功能,那均可以相似的來進行操做。git
在此監控展現兩張表明性國內公有云廠商redis監控圖web
2.2 第三方監控工具
第三方成熟監控工具也不少,提供服務的如:redis
在此僅簡略介紹應用監控sql
監控寶的應用監控也較詳細 能夠參考以前的文章瞭解監控寶服務性能監控docker
2.3 開源監控工具
RedisLive是由python編寫的而且開源的圖形化監控工具,很是輕量級,核心服務部分只包含一個web服務和一個基於redis自帶的info命令以及monitor命令的監控服務,界面上只有一個基於BootStrap的web界面,很是簡潔明瞭。除此以外,它還支持多實例監控,切換方便,並且配置起來也很是容易。監控信息支持redis存儲和持久化存儲(sqlite)兩種方式。 操做方式能夠參考:RedisLive監控Redis服務數據庫
zabbix做爲運維人員總所周知的開源監控系統,其功能強大,監控方式多樣深受技術人員喜好,有不少公司對其進行二次開發來定製化本公司監控系統。api
本次爲客戶提供的也是SAAP雲平臺結合Zabbix私有監控來共同構建完整監控體系,優點互補且監控冗餘。緩存
A. 經過redis-cli命令的info
參數能夠獲取redis的詳細信息,利用自定義腳原本截取想要的參數進行監控,如下爲記錄的獲取的參數,還能夠經過redis參考指標獲取。
# Server #服務端信息
redis_version:3.2.10 #Redis版本
redis_git_sha1:00000000 #Git SHA1
redis_git_dirty:0 #Git dirty flag
redis_build_id:c8b45a0ec7dc67c6
redis_mode:standalone #redis運行的模式
os:Linux 3.10.0-514.26.2.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:1755
run_id:0ee1ada5aa030118000d991c39564e41d504a3a5 #服務器的隨機標識符(用於 Sentinel 和集羣
tcp_port:6379 #監聽端口
uptime_in_seconds:5095759 #運行時長(秒)
uptime_in_days:58 #運行時長
hz:10
lru_clock:7308631 #以分鐘爲單位進行自增的時鐘,用於 LRU 管理
executable:/usr/bin/redis-server
config_file:/etc/redis.conf
# Clients #客戶端信息
connected_clients:4 #已鏈接客戶端的數量
client_longest_output_list:0 # 當前鏈接的客戶端當中,最長的輸出列表
client_biggest_input_buf:0 #當前鏈接的客戶端當中,最大輸入緩存
blocked_clients:0 #list阻塞調用被阻塞的鏈接個數若是監控數據大於0,告警
# Memory # 內存信息
used_memory:1366580712 #Redis 分配器分配的內存總量,以字節(byte)爲單位
used_memory_human:1.27G #以人類可讀的格式返回 Redis 分配的內存總量
used_memory_rss:1593454592 ## Redis 分配的內存總量(包括內存碎片),以字節(byte)爲單位
used_memory_rss_human:1.48G ##以人類可讀的格式返回 Redis 分配的內存總量(包括內存碎片)
used_memory_peak:2856423024 #Redis 的內存消耗峯值(以字節爲單位)
used_memory_peak_human:2.66G #以人類可讀的格式返回 Redis 的內存消耗峯值
total_system_memory:16658460672 #系統內存總量(以字節爲單位)
total_system_memory_human:15.51G #人類客可讀格式redis的系統內存總量
used_memory_lua:37888 #Lua 引擎所使用的內存大小(以字節爲單位)
used_memory_lua_human:37.00K #以人類可讀方式返回Lua 引擎所使用的內存大小
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.17 #redis內存碎片率(used_memory_rss/used_memory),小於1,表示redis已使用swap分區,則告警
mem_allocator:jemalloc-3.6.0 #在編譯時指定的,Redis所使用的內存分配器。能夠是libc、jemalloc或者tcmalloc
# Persistence #RDB 和 AOF 的相關信息
loading:0 #一個標誌值,記錄了服務器是否正在載入持久化文件
rdb_changes_since_last_save:5270 ##距離最近一次成功建立持久化文件以後,通過了多少秒
rdb_bgsave_in_progress:0 #一個標誌值,記錄了服務器是否正在建立 RDB 文件
rdb_last_save_time:1534035237 ##最近一次成功建立 RDB 文件的 UNIX 時間戳
rdb_last_bgsave_status:ok ##一個標誌值,記錄了最近一次建立 RDB 文件的結果是成功仍是失敗
rdb_last_bgsave_time_sec:15 #記錄了最近一次建立 RDB 文件耗費的秒數
rdb_current_bgsave_time_sec:-1 #若是服務器正在建立 RDB 文件,那麼這個值記錄的就是當前的建立操做已經耗費的秒數
aof_enabled:0 #redis是否開啓了aof
aof_rewrite_in_progress:0 #一個標誌值,記錄了服務器是否正在建立 AOF 文件
aof_rewrite_scheduled:0 #一個標誌值,記錄了在 RDB 文件建立完畢以後,是否須要執行預定的 AOF 重寫操做
aof_last_rewrite_time_sec:-1 #最近一次建立 AOF 文件耗費的時長
aof_current_rewrite_time_sec:-1 #若是服務器正在建立 AOF 文件,那麼這個域記錄的就是當前的建立操做已經耗費的秒數
aof_last_bgrewrite_status:ok #一個標誌值,記錄了最近一次建立 AOF 文件的結果是成功仍是失敗
aof_last_write_status:ok #最後一次建立 AOF文件是否成功
# Stats
total_connections_received:14133 #服務器已接受的鏈接請求數量
total_commands_processed:7477479089 #服務器已執行的命令數量
instantaneous_ops_per_sec:271 #服務器每秒鐘執行的命令數量
total_net_input_bytes:599074234857 #redis網絡入口流量字節數
total_net_output_bytes:2484573994623 #redis網絡出口流量字節數
instantaneous_input_kbps:53.60 #redis網絡入口kbps
instantaneous_output_kbps:107.04 #redis網絡出口kbps
rejected_connections:0 #由於最大客戶端數量限制而被拒絕的鏈接請求數量
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:61703692 #由於過時而被自動刪除的數據庫鍵數量
evicted_keys:0 由於最大內存容量限制而被驅逐(evict)的鍵數量
keyspace_hits:5121978022 # 請求鍵被命中次數
keyspace_misses:68376478 # 請求鍵未被命中次數
pubsub_channels:0 #當前使用中的頻道數量
pubsub_patterns:0 #當前使用中的模式數量
latest_fork_usec:40503 最近一次fork阻塞的微秒數,最近一次Fork操做阻塞redis進程的耗時數,單位微秒。
migrate_cached_sockets:0
# Replication # 複製信息
role:master #角色
connected_slaves:0 #鏈接的slave數量
master_repl_offset:0 # master複製偏移量
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:169884.36 #Redis服務器耗費的系統CPU
used_cpu_user:85656.09 #Redis服務器耗費的用戶CPU
used_cpu_sys_children:43671.30 #子進程耗費的系統CPU
used_cpu_user_children:316353.91 #子進程耗費的用戶CPU
# Cluster
cluster_enabled:0 #是否啓用集羣
# Keyspace
db0:keys=2353841,expires=2204380,avg_ttl=929326076 #據庫的鍵數量、數據庫設置有過時時間的key的數量(這個值減小是正常的)
複製代碼
B. 對獲取的指標挑選想要監控的進行腳本截取
#!/bin/bash
# -------------------------------------------------------------------------------
REDIS_CLI_COMMAND="redis-cli"
REDIS_HOST="172.x.x.x"
REDIS_PORT="6379"
ARGS=1
if [ $# -ne "$ARGS" ];then
echo "Please input one arguement:"
fi
case $1 in
connected_clients)
result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "connected_clients" | awk -F':' '{print $2}'`
echo $result
;;
used_memory_rss)
result=`$REDIS_CLI_COMMAND -h $REDIS_HOST -p $REDIS_PORT -a 'password' info | grep -w "used_memory_rss" | awk -F':' '{print $2}' | awk -F'G' '{print $1}'`
echo $result
.... #此處能夠根據以上寫本身感興趣的監控項
esac
複製代碼
注意,若是多個主機監控,能夠將host做爲第二個參數進行傳入,也可分多個腳本,區分不一樣端口或密碼, C. 最後添加進zabbix server 主機的agent配置段
UnsafeUserParameters=1 #配置用戶可自定義腳本
UserParameter=Redis.Info_0.2[*],/etc/zabbix/script/redis/chk_redis.0.2.sh $1 #此處多實例,能夠根據後兩位ip地址進行數據區分
複製代碼