1. 程式人生 > >Redis叢集監控方法

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服務不可用告警。

實現方法:

  1. 週期檢查一個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判斷叢集服務是否正常的方法。