当前位置:首页 > 问答 > 正文

怎么快速抓取和监控Redis里那些频繁读写的数据变化情况

要快速抓取和监控Redis里那些频繁读写的数据变化情况,可以不用太复杂的工具,主要思路就是利用Redis自带的一些功能和外部的一些简单方法结合起来,下面具体说说怎么做。

怎么快速抓取和监控Redis里那些频繁读写的数据变化情况

最直接的一个方法是去看Redis的命令统计信息,Redis自己会记录所有执行过的命令的调用次数,你可以在Redis的命令行里用INFO commandstats这个命令(来源:Redis官方文档INFO命令说明),执行之后,它会返回一个列表,告诉你每个命令(比如GETSETHGETHSET等等)被调用了多少次,所有命令消耗的总时间,以及每个命令平均每次消耗的时间,这个信息非常有用,你可以每隔一段时间(比如一分钟)就执行一次这个命令,然后把结果记录下来,通过对比两次记录之间的数值变化,你就能很快地知道在过去的一分钟里,哪些类型的命令被调用得最频繁,比如你发现HGETALL命令的调用次数飙升,那就说明可能有很多操作在频繁地读取大的哈希表,这可能会成为性能瓶颈,这个方法的好处是简单、原生,不需要改动现有的代码,能给你一个宏观上的热点命令视图,缺点是它只能看到命令的类型,不知道具体是哪个键(Key)被频繁访问,而且这个统计是累计的,从Redis启动开始算起,需要你自己做差值计算来获取时间段内的数据。

怎么快速抓取和监控Redis里那些频繁读写的数据变化情况

如果你想监控到具体是哪些键被频繁访问,也就是找到“热点Key”,那么上面这个方法就不够了,这时候可以用到Redis的另一个功能:高级键空间通知(来源:Redis官方文档Keyspace Notifications),这个功能默认是关闭的,你需要先在Redis的配置文件redis.conf里找到notify-keyspace-events这个配置项,然后把它设置成AKEA表示所有类型的键空间事件,K表示键空间通知,E表示键事件通知,简单理解就是,打开这个开关后,每当有键被访问(读)、被修改(写)、被删除时,Redis都会往一个特殊的频道(Channel)里发布一条消息,你的监控程序可以像一个订阅者一样,订阅这个频道,然后就能实时收到这些操作事件了,这样,你就能精确地知道是哪个键在什么时候被什么命令操作了,你可以写一个简单的脚本,使用SUBSCRIBE命令来订阅这些事件,然后对事件进行计数,在五分钟内,如果一个键被访问的次数超过了你设定的阈值(比如1000次),你就可以把它标记为热点Key,并发出警报,这种方法非常精准和实时,但缺点是对Redis服务器的性能有一定影响,因为它会额外消耗CPU资源来生成和发布事件消息,在写操作极其频繁的环境下需要谨慎评估,它会产生大量的消息,你的订阅程序要有能力处理这些消息流。

怎么快速抓取和监控Redis里那些频繁读写的数据变化情况

除了Redis自身的功能,还可以通过在应用程序代码里“埋点”的方式来监控,也就是说,在你的业务代码中,每当要执行Redis操作之前,先记录一下当前时间戳和要操作的键名,操作完成后再记录一次时间戳,然后把这些信息发送到一个集中的日志系统或者一个临时的存储地方(比如一个消息队列或者另一个Redis实例)(来源:常见的应用性能监控APM实践),这样做的好处是灵活性最高,你不仅可以记录键名,还可以记录操作来源(比如是哪个用户ID触发的)、操作耗时等非常详细的上下文信息,你可以根据自己的业务逻辑来定义什么是“频繁”,比如针对某个特定前缀的键,或者只监控写操作等,缺点是需要修改应用程序代码,对代码有侵入性,如果项目很大,改起来会比较麻烦,而且如果记录日志的逻辑写得不好,反而可能增加应用的延迟。

对于监控到的数据变化情况,光抓取还不够,还需要有分析和展示的环节,一个很实用的方法是,无论你用的是上面哪种方式抓取数据,都可以把统计结果(比如每分钟每个命令的调用次数、或者每个热点Key的访问频率)写入到一个时间序列数据库里,比如InfluxDB或者Prometheus(来源:流行的监控系统架构),这些数据库专门为存储和查询时间序列数据(就是带时间戳的数据点)而设计,再配合Grafana这样的可视化工具,你就可以轻松地创建出漂亮的监控仪表盘,在仪表盘上,你可以看到热点Key访问频率的趋势图,哪个键最热的排行榜,以及设置报警规则,比如当某个Key的QPS(每秒查询率)突然超过5000时,自动给你发短信或者发邮件告警,这套组合拳(Redis监控 -> 时间序列数据库 -> 可视化仪表盘)是业界非常成熟和常见的做法,能让你对Redis内部的动态一目了然。

还有一些现成的工具可以帮你简化这个过程,比如RedisInsight(来源:Redis官方可视化工具),它是一个图形化的管理工具,里面就包含了慢日志查询和基本的内存、键值分析功能,可以帮你直观地查看哪些键占用了大量内存,虽然实时监控热点Key的功能可能不如自己定制的强大,但对于初步排查问题非常方便,像淘宝开源的redis-full-check等工具,虽然主要用于数据校验,但也体现了通过扫描键空间来分析数据的思路。

快速抓取和监控Redis热点数据,核心是组合使用几种方法:用INFO commandstats看宏观命令频率;用键空间通知精准定位热点Key;在应用层埋点获取更丰富的上下文信息,然后把收集到的数据用时序数据库存储,用Grafana等工具展示和报警,根据你对精度、性能和实施成本的要求,选择一种或几种方法结合使用,就能有效地掌握Redis中数据的动态变化。