如何监控 Redis

简述

上篇文章介绍了如何搭建 prometheus 监控体系,监控 linux 服务器,这篇文章跟大家介绍如何监控 redis,以及我们要关注的指标都有哪些

监控 redis 需要关注什么指标

《聊聊监控》这篇文章,介绍了 google 提出的监控四个黄金指标(没看过的朋友可以看看这篇文章),下面我们就分别通过延迟流量错误饱和度四方面,来看看对应到 redis 中,我们要监控哪些数据指标(metrics)

延迟

redis-cli 提供了--latency命令,可以很方面的让我们获取到 redis 执行命令的延迟,其原理是用 redis-cli 连接到 redis-server 上,然后不断发送ping命令,统计ping命令的耗时

> redis-cli --latency -h 127.0.0.1 -p 6379
min: 0, max: 1, avg: 0.13 (412 samples)

可以看到这里的延迟是0.13ms,因为我是在 redis-server 所在机器执行的--latency命令,下面看看我在另外一台机器执行--latnecy命令的结果

> redis-cli -h 192.168.57.140 -p 6379 --latency
min: 0, max: 3, avg: 1.21 (199 samples)

可以看到,现在的延迟为1.21ms,证明有大概1.08ms花费在了网络 I/O 上

到这里可能有些人会说,ping 命令很简单,是不是不能反馈出真实的命令执行延迟呢?其实,我们都知道,redis 是单线程模型的,如果有一条命令执行的慢,那么其后面的命令都得等着,所以我们是可以使用 ping 命令的执行耗时来作为 redis 命令执行耗时的指标的

--latency命令只能知道 redis 在什么时间点延迟比较高,并不知道延迟高是什么原因造成的,或者说不知道是哪条命令执行比较耗时,导致 redis 延迟高。跟 mysql 一样,redis 也提供了慢查询的功能,使用slowlog get [count]可以查看最近执行的慢查询命令(慢查询时间通过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 的流量监控中,我们一般关注的是 redis 每秒的请求数(即执行了多少次操作)、每秒接受跟返回的数据量。这些指标在都可以通过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: 每秒执行了多少次操作
  • instantaneous_input_kbps: 每秒接受多少 KiB 的数据
  • instantaneous_output_kbps: 每秒返回多少 KiB 的数据

如果将 redis 作为缓存使用的话,还要关注缓存的命中率,同样的,可以使用info all命令查询

> redis-cli -h 127.0.0.1 -p 6379 info all | grep keyspace
keyspace_hits:0
keyspace_misses:1
  • keyspace_hits: 自 redis 启动以来,查询命令的命中数量
  • keyspace_misses: 自 redis 启动以来,未命中的数量

有了这两个指标,就可以通过keyspace_hits / (keyspace_hits + keyspace_misses)计算出缓存的命中率

错误

因为 redis 都是内存操作,基本不会出现什么错误,有错误的话一般是命令写错导致的,这一般在开发的时候就解决了,所以不用对错误做什么特殊的监控

饱和度

饱和度指的是 redis 有多“满”,在 redis 中有两个数据可以反映出 redis 究竟有多“满”,一个是内存使用率,另外一个是内存的碎片率

内存使用率可以通过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: 使用了多少内存
  • used_memory_rss: 操作系统分配了多少内存给 redis
  • mem_fragmentation_ratio: 即内存碎片率,根据use_memory_rss/use_memory计算得出,正常来讲,操作系统在分配内存的时候,有最小分配单位的限制(不同操作系统不一样,有 8byte、16byte 等),所以内存碎片率稍大于 1 是正常的,如果内存碎片率过高,可能就需要考虑对内存碎片进行清理了

redis-exporter 安装使用

redis 本身不通过 prometheus 协议暴露自身的各种数据指标,与node-exporter一样,我们可以运行通过redis-exporter,将 redis 的指标暴露给 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,可以通过访问 9121 查看采集的所有指标图片

prometheus 配置

在 prometheus 配置文件中加入如下配置

- job_name: 'redis-exporter'
    static_configs:
      - targets: ['localhost:9121']

向 prometheus 发送 HUP 信号,让 prometheus 重新读取配置文件

$ kill -HUP `pidof prometheus`

prometheus 与 grafana 的安装,在我上篇文章有讲,还不清楚怎么搭建的同学可以翻阅我上篇文章——《如何搭建 Linux 服务器监控系统》

grafana 配置

redis 控制面板,我这里用的是11835这个面板,一样通过 dashboard ID 的方式导入图片

监控面板如下图片

可以看到,面板除了展示了我们上面所讲到的指标外(如内存使用率、缓存命中数等),还展示了客户端连接数、redis 正常运行时间等

另外需要注意的是:如果你像下面一样不展示内存使用率的话

图片

可能是读取不到redis_memory_max_bytes指标,那是因为没配置 redis 的最大内存,可以在 redis 配置文件中添加maxmemory配置,或者使用config rewrite命令进行修改

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

总结

本篇文章讲了 redis 监控需要关注的指标。并通过redis-exporter的方式,将 redis 的监控纳入到 prometheus 体系中来,如果觉得我的文章对你有帮助的话,可以点个关注或者在看哦,你的支持是我写作的动力。

 

作者|huangxy

posted @ 2023-08-21 08:45  古道轻风  阅读(489)  评论(0编辑  收藏  举报