記一次混合監控的反思

1、背景

做爲最底層的技術人員,目前因爲有客戶在運維中遇到混合架構,公有云上使用了產品級別Redis數據庫,同時因爲業務在雲服務器和kubnets的容器內也有redis數據庫,所以對於這種混合模式數據庫的監控,進行簡單的分析總結,在此記錄筆記,在此拋磚引玉,也曾但願對各位有一點點益處。 redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,在原子化操做的基礎上,有具備數據持久化的功能,同時也支持主從同步和集羣搭建,支持發佈訂閱機制,大大提升了數據操做的擴展性和數據冗餘安全性。在目前SAAS不管是共有云仍是私有云,自建集羣,仍是docker容器,監控方式多樣化,針對不一樣的場景各類方式互補來更好的提供監控。html

2、監控方式

2.1 雲平臺監控

目前對於SAAS產品級別數據庫產品,即開即用底層均依託於各雲廠商的多副本或集羣方式,來保障數據的安全性和服務的穩定性,但在目前的幾回雲故障中,咱們也要心懷對數據的敬畏之心,各方面多方式作好數據的備份,沒有絕對的安全,不管在多少個9的SLA面前,數據一旦發生不可挽回性丟失或損壞那將是百分之百的損失,數據無價。 所以須要作好數據備份:python

  • 共有云產品備份策略,
  • 備份恢復驗證數據可用性
  • 跨可用區,異地災備
  • 多副本,主從備份
  • 本地或對象存儲歸檔備份等

監控方式使用各公有云提供的數據庫監控,可是對於提供監控指標有可能不多,且不少雲廠商監控頻率爲5分,實時性不高,對此咱們可使用自定義監控來將數據上報給雲平臺來擴展自定義監控項,同時聯繫雲服務提供商是否能夠縮短監控頻率等。 可瞭解雲平臺自定義監控:阿里雲自定義監控 此處只舉了一個例子,各不一樣雲廠商若是具備自定義監控功能,那均可以相似的來進行操做。git

在此監控展現兩張表明性國內公有云廠商redis監控圖web

  • 騰訊雲

  • 阿里雲

2.2 第三方監控工具

第三方成熟監控工具也不少,提供服務的如:redis

2.2.1 安暢網絡的SmartEye

在此僅簡略介紹應用監控sql

  • 服務監控類型豐富,經常使用應用及數據庫監控都有
  • 身處運維人員角度,提供完善齊全服務監控指標
  • 安裝方式很是方便,一條命令便可安裝部署
  • 監控模式多樣化,可直接安裝agent代理,或純內網proxy模式監控
  • 服務系統資源佔用極小
  • 監控頻率細粒度,1分鐘監控數據上報
  • 可自定義腳本橫向擴展指標或監控其餘應用業務等
  • 告警策略分級,告警方式可選性多 詳細信息能夠官網介紹瞭解詳情SmartEye

2.2.2 監控寶

監控寶的應用監控也較詳細 能夠參考以前的文章瞭解監控寶服務性能監控docker

2.3 開源監控工具

2.3.1 RedisLive

RedisLive是由python編寫的而且開源的圖形化監控工具,很是輕量級,核心服務部分只包含一個web服務和一個基於redis自帶的info命令以及monitor命令的監控服務,界面上只有一個基於BootStrap的web界面,很是簡潔明瞭。除此以外,它還支持多實例監控,切換方便,並且配置起來也很是容易。監控信息支持redis存儲和持久化存儲(sqlite)兩種方式。 操做方式能夠參考:RedisLive監控Redis服務數據庫

2.3.2 Zabbix監控

zabbix做爲運維人員總所周知的開源監控系統,其功能強大,監控方式多樣深受技術人員喜好,有不少公司對其進行二次開發來定製化本公司監控系統。api

本次爲客戶提供的也是SAAP雲平臺結合Zabbix私有監控來共同構建完整監控體系,優點互補且監控冗餘。緩存

  • 對於客戶SAAS產品Redis使用自帶雲產品監控配合自定義監控項能夠很好知足;
  • 對於客戶自建Redis和容器內跑的數據庫利用zabbix監控;
  • 雲主機的redis能夠利用在雲主機上安裝agent採集數據,被動發送給server監控 可是對於容器內,在內部安裝agent,對於目前已經整在運行的業務進行大規模在此部署顯得不是很是的方便,此時使用在zabbix server自定義腳原本實現監控。

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地址進行數據區分
複製代碼

3、總結

  • 目前對於平臺話的,儘可能用平臺化統一監控管理,如何內部有自定義那就更好了,能夠配合腳本多維度細粒度實現定製化監控,很是方便;
  • 對於例如客戶這種混合模式,平臺沒法知足能夠利用平臺基礎監控+私有化部署監控互補來知足絕大多數需求。
  • 對於想要既方便且功能強大的,由易於管理維護,smarteye能夠考慮,監控類型及指標全而完整,細粒度、高頻率、支持自定義、可私有化部署,成爲下一代監控的首選。
相關文章
相關標籤/搜索