簡(jiǎn)述
上篇文章介紹了如何搭建 prometheus 監(jiān)控體系,監(jiān)控 linux 服務(wù)器,這篇文章跟大家介紹如何監(jiān)控 redis,以及我們要關(guān)注的指標(biāo)都有哪些
監(jiān)控 redis 需要關(guān)注什么指標(biāo)
在《聊聊監(jiān)控》這篇文章,介紹了 google 提出的監(jiān)控四個(gè)黃金指標(biāo)(沒(méi)看過(guò)的朋友可以看看這篇文章),下面我們就分別通過(guò)延遲
、流量
、錯(cuò)誤
、飽和度
四方面,來(lái)看看對(duì)應(yīng)到 redis 中,我們要監(jiān)控哪些數(shù)據(jù)指標(biāo)(metrics)
延遲
redis-cli 提供了--latency
命令,可以很方面的讓我們獲取到 redis 執(zhí)行命令的延遲,其原理是用 redis-cli 連接到 redis-server 上,然后不斷發(fā)送ping
命令,統(tǒng)計(jì)ping
命令的耗時(shí)
> redis-cli --latency -h 127.0.0.1 -p 6379
min: 0, max: 1, avg: 0.13 (412 samples)
可以看到這里的延遲是0.13ms
,因?yàn)槲沂窃?redis-server 所在機(jī)器執(zhí)行的--latency
命令,下面看看我在另外一臺(tái)機(jī)器執(zhí)行--latnecy
命令的結(jié)果
> redis-cli -h 192.168.57.140 -p 6379 --latency
min: 0, max: 3, avg: 1.21 (199 samples)
可以看到,現(xiàn)在的延遲為1.21ms
,證明有大概1.08ms
花費(fèi)在了網(wǎng)絡(luò) I/O 上
到這里可能有些人會(huì)說(shuō),ping 命令很簡(jiǎn)單,是不是不能反饋出真實(shí)的命令執(zhí)行延遲呢?其實(shí),我們都知道,redis 是單線程模型的,如果有一條命令執(zhí)行的慢,那么其后面的命令都得等著,所以我們是可以使用 ping 命令的執(zhí)行耗時(shí)來(lái)作為 redis 命令執(zhí)行耗時(shí)的指標(biāo)的
--latency
命令只能知道 redis 在什么時(shí)間點(diǎn)延遲比較高,并不知道延遲高是什么原因造成的,或者說(shuō)不知道是哪條命令執(zhí)行比較耗時(shí),導(dǎo)致 redis 延遲高。跟 MySQL 一樣,redis 也提供了慢查詢的功能,使用slowlog get [count]
可以查看最近執(zhí)行的慢查詢命令(慢查詢時(shí)間通過(guò)slowlog-log-slower-than
配置指定)
127.0.0.1:6379> SLOWLOG get 1
1) 1) (integer) 47
2) (integer) 1668743666
3) (integer) 13168
4) 1) "hset"
2) "/idents/Default"
3) "tt-fc-dev01.nj"
4) "1668743666"
5) "127.0.0.1:43172"
6) ""
流量
在 redis 的流量監(jiān)控中,我們一般關(guān)注的是 redis 每秒的請(qǐng)求數(shù)(即執(zhí)行了多少次操作)、每秒接受跟返回的數(shù)據(jù)量。這些指標(biāo)在都可以通過(guò)info all
命令獲取
> redis-cli -h 127.0.0.1 -p 6379 info all | grep instantaneous
instantaneous_ops_per_sec:0
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
-
instantaneous_ops_per_sec
: 每秒執(zhí)行了多少次操作 -
instantaneous_input_kbps
: 每秒接受多少 KiB 的數(shù)據(jù) -
instantaneous_output_kbps
: 每秒返回多少 KiB 的數(shù)據(jù)
如果將 redis 作為緩存使用的話,還要關(guān)注緩存的命中率,同樣的,可以使用info all
命令查詢
> redis-cli -h 127.0.0.1 -p 6379 info all | grep keyspace
keyspace_hits:0
keyspace_misses:1
-
keyspace_hits
: 自 redis 啟動(dòng)以來(lái),查詢命令的命中數(shù)量 -
keyspace_misses
: 自 redis 啟動(dòng)以來(lái),未命中的數(shù)量
有了這兩個(gè)指標(biāo),就可以通過(guò)keyspace_hits / (keyspace_hits + keyspace_misses)
計(jì)算出緩存的命中率
錯(cuò)誤
因?yàn)?redis 都是內(nèi)存操作,基本不會(huì)出現(xiàn)什么錯(cuò)誤,有錯(cuò)誤的話一般是命令寫(xiě)錯(cuò)導(dǎo)致的,這一般在開(kāi)發(fā)的時(shí)候就解決了,所以不用對(duì)錯(cuò)誤做什么特殊的監(jiān)控
飽和度
飽和度指的是 redis 有多“滿”,在 redis 中有兩個(gè)數(shù)據(jù)可以反映出 redis 究竟有多“滿”,一個(gè)是內(nèi)存使用率
,另外一個(gè)是內(nèi)存的碎片率
內(nèi)存使用率
可以通過(guò)info memory
命令查看
> info memory
# Memory
used_memory:1227384
used_memory_human:1.17M
used_memory_rss:4308992
used_memory_rss_human:4.11M
...
maxmemory:134217728
maxmemory_human:128.00M
...
mem_fragmentation_ratio:3.51
...
-
used_memory
: 使用了多少內(nèi)存 -
used_memory_rss
: 操作系統(tǒng)分配了多少內(nèi)存給 redis -
mem_fragmentation_ratio
: 即內(nèi)存碎片率,根據(jù)use_memory_rss/use_memory
計(jì)算得出,正常來(lái)講,操作系統(tǒng)在分配內(nèi)存的時(shí)候,有最小分配單位的限制(不同操作系統(tǒng)不一樣,有 8byte、16byte 等),所以內(nèi)存碎片率稍大于 1 是正常的,如果內(nèi)存碎片率過(guò)高,可能就需要考慮對(duì)內(nèi)存碎片進(jìn)行清理了
redis-exporter 安裝使用
redis 本身不通過(guò) prometheus 協(xié)議暴露自身的各種數(shù)據(jù)指標(biāo),與node-exporter
一樣,我們可以運(yùn)行通過(guò)redis-exporter
,將 redis 的指標(biāo)暴露給 pormetheus
redis-exporter
下載地址:https://Github.com/oliver006/redis_exporter/releases,目前最新的版本是 1.52.0
$ wget https://github.com/oliver006/redis_exporter/releases/download/v1.52.0/redis_exporter-v1.52.0.linux-amd64.tar.gz
$ tar -zxvf redis_exporter-v1.52.0.linux-amd64.tar.gz
$ mv redis_exporter-v1.52.0
$ cd redis_exporter-v1.52.0
$ ./redis_exporter &
redis-exporter
暴露的端口是9121
,可以通過(guò)訪問(wèn) 9121 查看采集的所有指標(biāo)
prometheus 配置
在 prometheus 配置文件中加入如下配置
- job_name: 'redis-exporter'
static_configs:
- targets: ['localhost:9121']
向 prometheus 發(fā)送 HUP 信號(hào),讓 prometheus 重新讀取配置文件
$ kill -HUP `pidof prometheus`
prometheus 與 grafana 的安裝,在我上篇文章有講,還不清楚怎么搭建的同學(xué)可以翻閱我上篇文章——《如何搭建 Linux 服務(wù)器監(jiān)控系統(tǒng)》
grafana 配置
redis 控制面板,我這里用的是11835
這個(gè)面板,一樣通過(guò) dashboard ID 的方式導(dǎo)入
監(jiān)控面板如下
可以看到,面板除了展示了我們上面所講到的指標(biāo)外(如內(nèi)存使用率、緩存命中數(shù)等),還展示了客戶端連接數(shù)、redis 正常運(yùn)行時(shí)間等
另外需要注意的是:如果你像下面一樣不展示內(nèi)存使用率的話
可能是讀取不到redis_memory_max_bytes
指標(biāo),那是因?yàn)闆](méi)配置 redis 的最大內(nèi)存,可以在 redis 配置文件中添加maxmemory
配置,或者使用config rewrite
命令進(jìn)行修改
127.0.0.1:6379> config set maxmemory 128mb
OK
127.0.0.1:6379> config rewrite
8110:M 07 Aug 2023 09:21:53.983 # CONFIG REWRITE executed with success.
OK
總結(jié)
本篇文章講了 redis 監(jiān)控需要關(guān)注的指標(biāo)。并通過(guò)redis-exporter
的方式,將 redis 的監(jiān)控納入到 prometheus 體系中來(lái),如果覺(jué)得我的文章對(duì)你有幫助的話,可以點(diǎn)個(gè)關(guān)注或者在看哦,你的支持是我寫(xiě)作的動(dòng)力