Redis叢集監控方法
1. 技術領域
提供一種Redis叢集中各Redis節點的監控處理方法,能夠採集Redis節點的資源資訊、效能指標資料,叢集內多個Redis節點服務執行狀態監控。實現告警監控資訊、資源和效能指標的採集與分析的監控方法。
2. 背景技術
2.1 Redis簡介
Redis 是一種開源的記憶體中key-value資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。它支援多種型別的資料結構,如字串(strings), 雜湊(hashes), 列表(lists), 集合(sets),有序集合(sorted sets)與範圍查詢。Redis也可以被看成是一個數據結構伺服器。Redis的所有資料都是儲存在記憶體中,然後不定期的通過非同步方式儲存到磁碟上。
Redis可使用一個或多個Redis哨兵(Sentinel),和Redis的主節點(Master)、 多個從節點(Slave)組成一個叢集。Sentinel來檢測Redis的Master節點是否執行正常,並在Master節點發生故障時,將 Master的Slave提升為Master,並在老的Master重新加入到Sentinel的群集之後,會被重新配置,作為新Master的Slave。基於Redis的 Sentinel可實現叢集的高可用管理功能。
2.2 Redis 監控方法
Redis 監控最直接的方法就是在裝有Redis的伺服器上使用Redis服務提供的 INFO 命令,只需要執行下面一條命令:
./redis-cli -p 埠號info
會返回一個Redis節點的Server、Clients、Memory、Persistence、Stats、Replication、CPU、Keyspace 8個部分的結果資訊。從INFO返回結果中得到相關資訊,就可以達到監控一個Redis節點的目的。
如下結果返回的是一個Redis的Master節點的資訊:
# Server
redis_version:2.8.8 # Redis 的版本
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:bf5d1747be5380f
redis_mode:standalone
os:Linux 2.6.32-220.7.1.el6.x86_64 x86_64
arch_bits:64
gcc_version:4.4.7 #gcc版本
process_id:49324 # 當前 Redis 伺服器程序id
run_id:bbd7b17efcf108fdde285d8987e50392f6a38f48
tcp_port:6379
uptime_in_seconds:1739082 # 執行時間(秒)
uptime_in_days:20 # 執行時間(天)
# Clients
connected_clients:1 #連線的客戶端數量
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:821848 #Redis分配的記憶體總量
used_memory_human:802.59K
used_memory_rss:85532672 #Redis分配的記憶體總量(包括記憶體碎片)
used_memory_peak:178987632
used_memory_peak_human:170.70M #Redis所用記憶體的高峰值
used_memory_lua:33792
mem_fragmentation_ratio:104.07 #記憶體碎片比率
mem_allocator:tcmalloc-2.0
# Persistence
loading:0
rdb_changes_since_last_save:0 #上次儲存資料庫之後,執行命令的次數
rdb_bgsave_in_progress:0 #後臺進行中的 save 操作的數量
rdb_last_save_time:1410848500 #最後一次成功儲存時間點
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:5705 #執行以來連線過的客戶端的總數量
total_commands_processed:204013 #執行以來執行過的命令的總數量
instantaneous_ops_per_sec:0
rejected_connections:0
expired_keys:34401 #執行以來過期的 key 的數量
evicted_keys:0 #執行以來刪除過的key的數量
keyspace_hits:2129 #命中key 的次數
keyspace_misses:3148 #沒命中key 的次數
# Replication
role:master #當前例項的角色master還是slave
connected_slaves:0
master_repl_offset:0
# CPU
used_cpu_sys:1551.61
used_cpu_user:1083.37
used_cpu_sys_children:2.52
used_cpu_user_children:16.79
# Keyspace
db0:keys=3,expires=0,avg_ttl=0 #各個資料庫key 的數量,以及帶有生存期的 key 的數量
以上字串就是這個Redis節點帶有固定格式的一些欄位屬性和值。
同樣通過INFO命令,對一個Sentinel節點返回的資訊如下:
# Sentinel
sentinel_masters:3
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=common, status=ok,address=192.168.95.111:56379,slaves=1,sentinels=3
master1:name=resource1,status=ok,address=192.168.95.112:56379,slaves=1,sentinels=3
master2:name=resource2,status=ok,address=192.168.95.113:56379,slaves=1,sentinels=3
由返回資訊可得知這個Sentinel目前管理了3個Master,並分別給出了Master的IP和埠,每個Master各有一個Slave。
3.技術方案描述
3.1 要解決的技術問題
通過在Redis伺服器上執行INFO命令可以得到當前Redis節點的結果資訊,但需要手工執行命令,結果資訊可讀性不強,不直觀,不能達到自動監控的目的。 理想監控方案是在公司目前的監控產品中,整合Redis的叢集監控方案,能夠週期性、不間斷的自動採集Redis各節點的資料資訊,實時上報Redis節點的監控指標和狀態,和Redis叢集的服務狀態資訊。
3.2 整體思路
Redis的Sentinel作為Redis的高可用方案,可以實現Redis的Mater和Slave之間高可用和故障自動切換。以公司某監控產品環境中的用到的Redis為例,為公共資料部署一組Redis,包括一個Master和一個Slave。為資源資料部署兩組Redis,每組內同樣包括一個Master和一個Slave。這樣通過6個Redis(Master/Slave)節點形成一個Redis叢集服務方案。
為了方便說明Redis叢集,本次在三臺伺服器進行Redis叢集的安裝,其中每臺伺服器上各部署一個Master和Slave,考慮到防止裝置宕機導致的高可用問題,不同伺服器的Master和Slave形成Master/Slave關係。另外每臺伺服器上要各部署一個Sentinel,做為Redis的管理節點,實時監測Master和Slave的主備狀態與切換, 如果Master所在的伺服器宕機,Slave也能繼續接替Master工作。
實際部署形成的Redis主備節點叢集方案如下, Slave節點通過藍色箭頭指向Master節點做表示:
3.3 實現方案
3.3.1 採用Java直接連線Redis節點取INFO資訊
採用Java開發,在開發工程中引用開發包jedis-2.7.2.jar,進行程式碼開發。連線一個Redis節點的關鍵程式碼如下,例如連線一個IP是192.168.180.61,埠是56380的Redis節點:
Jedis jedis = new Jedis (“192.168.180.61”, 56380);
String info = jedis.info ();
如果這個IP和埠的Redis節點正常,則返回的info字串,就可得到這個節點的所有資訊,與在Redis伺服器上通過INFO命令取節點資訊是同樣效果。
3.3.2採集Redis節點方法
通過Sentinel節點採集,可採集Sentinel管理的Master節點資訊。在確定了一個Sentinel節點的IP和埠的情況下,先採這個Sentinel節點的資訊,可得到這個Sentinel管理的Master節點的IP和埠,有了多個Master節點的IP和埠,可再針對這些IP和埠進行採集。
例如採一個Sentinel節點,得到目前這個Sentinel管理的3個Master的IP和埠,再依次採用這3個Master的IP和埠的Redis資訊,得到該Master的Slave節點資訊。
如下圖例展示了通過一個Sentinel可採到所有節點的過程:
這樣至少通過一個Sentinel節點的IP和埠,就能把這個叢集服務中的所有Master和Slave節點資訊採集到,包括這個Sentinel節點本身。其它的Sentinel節點再分別通過IP和埠採集。
如下圖展示是的當前這個名為Redis180的服務, 各個Redis節點的一個展示頁面效果。
3.3.3從INFO字串提取關鍵配置資訊和效能指標
通過取一個Redis節點的INFO字串資訊中,是格式固定的字串,通過提取關鍵指標值,將指標值進行分析處理,可做為Redis節點的資源配置資訊或效能指標值。例如記憶體部分的欄位資訊:
used_memory: 4809536 #Redis使用的記憶體
used_memory_peak: 6589592 #Redis所用記憶體的高峰值
這兩個指標給出的是當前這個Redis節點使用的記憶體量與高峰值的位元組數。通過一個Redis節點的IP與埠,做為資源的唯一標識,把這兩個指標資料歸屬到這個Redis資源上。資料在入庫後,可通過介面檢視這兩個指標的展示情況:
3.3.4一個服務中通過Sentinel判斷服務狀態
部署了多個Redis節點,包括多個Master,Slave,Sentinel節點成一個叢集,通過Sentinel來管理各節點的執行狀態。 Sentinel能夠監控所管理的Master或Slave節點的執行狀態和角色,所以可以通過Sentinel來判斷一個Redis叢集服務的執行狀態。
判斷一個叢集服務方法:如果服務中所有的Sentinel節點無法取回INFO資訊,則認為這個服務狀態是異常的,並上報Redis服務不可用告警。
實現方法:
- 週期檢查一個Redis服務中的所有Sentinel的IP和埠, 如果服務中的每個Sentinel的IP和埠都不能返回INFO資訊,則認為這個服務異常不可用,並上傳Redis服務狀態異常不可用的告警。
2. 如果是單個Sentinel節點不能返回INFO資訊,則上傳這個Sentinel節點狀態異常告警。
3. 當檢查到所有Sentinel節點的IP和埠都可採,都能返回INFO資訊,是認為Redis服務已正常,上傳Redis服務恢復正常的恢復告警。
4.本方案相對於現有方案的有益效果或者優點
實現了一種視覺化的實時監控Redis叢集中節點資訊和服務執行狀態的監控方法。
通過一個Sentinel節點就能一次性採集發現這個Sentinel管理的所有Redis節點資訊。
為一組部署了Sentinel節點的Redis叢集確定了一種通過多個Sentinel判斷叢集服務是否正常的方法。