我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解redis big key 排查思路

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解redis big key 排查思路

今天在秦晓辉的运维系统监控专栏交流群中,看到了几位朋友在讨论Redis big key 扫描的方案。不自觉的来了兴致,参与了讨论。
并且有一些比较奇特的思路。

定义big key

为了让对redis较为陌生的朋友不清楚big key的含义有一定的认知。我们先来定义一下Big Key。
一切因为大,而导致redis去执行命令,网络传输而导致慢的key,都可以称为Big Key。

  • 一个String的值特别大
  • 一个List的元素特别多
  • 一个Hash的元素特别多
  • List、Hash中某个元素特别大

都可以称为Big Key。

那具体,多大才算大呢?那其实要看你具体业务的容忍度了,并不是一个很严格的限制。

这是我在知乎上看到一个博主对Big Key 大小的定义:

  • 一个STRING类型的Key,它的值为5MB(数据过大)
  • 一个LIST类型的Key,它的列表数量为20000个(列表数量过多)
  • 一个ZSET类型的Key,它的成员数量为10000个(成员数量过多)
  • 一个HASH格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)

我个人认为他对这个值度量定义的门槛颇低了,我目前开发维护的系统中,对一个String的Key,认为超过100KB就开始算大,超过1MB是严禁发生的。

如何排查Big Key

那如何排查Big Key呢?何时排查Big Key呢?

一般情况下,我们应该在第一次上生产之前,对系统进行全面的各项测试,其中就应该包括Big Key 的排查。
其次,就是在生产运行中,也许我们测试不够全面、也许多次迭代下来会有新的Big Key,我们应该由监控系统进行扫描排查。

对于Big Key的排查来说,那应该就是把所有的Key,按照我们的阈值进行比对其占用的内存大小,判断其是否为Big Key。
而我们知道,对于Redis 这种高性能内存缓存来说,我们都尽量使用一个O(1)算法复杂度的命令来调用,性能最佳。
而全部Key进行扫描,显然是一个O(n)的复杂度,将会阻塞Redis 相当长的时间。

而群里的讨论点在于:在压测的过程中,对redis big key进行扫描,并且尽量不影响性能。

那让我们来看看传统的方案,以及个人的奇思妙想。

官方解决方案

在官方文档 Scanning for big keys中如下描述:

In this special mode, redis-cli works as a key space analyzer. It scans the dataset for big keys, but also provides information about the data types that the data set consists of. This mode is enabled with the --bigkeys option, and produces verbose output.

$ redis-cli --bigkeys
[00.00%] Biggest string found so far 'key-419' with 3 bytes
[05.14%] Biggest list   found so far 'mylist' with 100004 items
[35.77%] Biggest string found so far 'counter:__rand_int__' with 6 bytes
[73.91%] Biggest hash   found so far 'myobject' with 3 fields
-------- summary -------
Sampled 506 keys in the keyspace!
Total key length in bytes is 3452 (avg len 6.82)
Biggest string found 'counter:__rand_int__' has 6 bytes
Biggest   list found 'mylist' has 100004 items
Biggest   hash found 'myobject' has 3 fields
504 strings with 1403 bytes (99.60% of keys, avg size 2.78)
1 lists with 100004 items (00.20% of keys, avg size 100004.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
1 hashs with 3 fields (00.20% of keys, avg size 3.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

也就是使用redis-cli --bigkeys 命令进行扫描,并会按照strings、lists、sets、hashs、zsets统计。

The program uses the SCAN command, so it can be executed against a busy server without impacting the operations, however the -i option can be used in order to throttle the scanning process of the specified fraction of second for each SCAN command.

这个命令是通过SCAN指令进行实现的,并不是一次性直接对redis完成扫描,对于已经繁忙(处于)压测的服务器不会完全影响业务进行。
但是实际上,也会有一定的性能影响。这个方案,也是这位测开朋友在压测时采用的方案。

不过,他忽略了(当然,早期的客户端不一定支持这一参数)可以使用 -i 0.01参数可以更好的降低对redis服务器处理业务请求的影响。
-i 0.01代表着redis-cli这一客户端在每执行一次SCAN指令后,会暂停0.01秒的时间。
这一参数会导致big key 扫描本身耗时有一定增加,但是对redis服务器的压力就是降低许多,毕竟0.01秒对redis这种高性能的中间件来说,已经是一段不断的时间了。

所以,就目前来说,最方便也最稳妥的方式就是redis-cli --bigkeys -i 0.01

解析RDB文件并统计

RDB文件作为redis的一个全量持久化文件。通过下载并对他的解析统计Big Key,这对Redis服务器的资源则没有任何消耗,是十分合理的。
但是若是为了扫描Big Key,在压测环境下执行BGSAVE这样的持久化指令,其fork进程的过程也会产生一定的阻塞,在Redis对他的标记上,也是@slow的。
所以扫描一个已经产生的RDB文件是可取的,特意去持久化一次,理论上对Redis产生的阻塞也是不小的。那具体其耗时如何,也未进行实验验证。

而这样的一个工具:redis-rdb-tools 在github上也拥有4.8K的star,想必使用的用户也是不少的。
但是,我注意到了一点,这个工程最后一次提交在2020年。
而截止目前,redis在其后已经相继发布了redis 6、redis 7等更高的版本,并且对于RDB文件的格式,在redis 7.0 已经更新到了format 10。
这一“年久失修”的redis-rdb-tools 未必能够解析新版本的RDB文件。

网络统计

个人突发奇想,若是在网络层面上,通过抓包进行分析,对redis的TCP报文进行复制,然后使用Redis对应版本的RESP2、RESP3报文解析,不就可以分析这段时间内,客户端获取过的Big Key了吗?
这样对redis服务器的CPU等资源就没有什么消耗了。
当然,这个方案也有很明显的缺点,除了需要自行编写工具去分析以外,还存在很多分析不到的位置。
例如一个LRANGE指令,对指定key的list进行范围扫描并返回:

LRANGE key start stop 

它的复杂度是O(S+N),其中S的复杂度与列表的HEAD或者TAIL的距离有关,而N则是范围内元素的个数。
所以当S很大,而N很小的时候,返回给客户端的数据量,其实还是小的,而它可能是一个Big Key,但是我们这个方案是没有机会发现它了。

新增从节点

个人觉得这是一个很妙的方式,具有可行性,但是也比较浪费,意义不是十分大的方案。

我们可以在压测开始前,通过slave of 命令,将我们新起的一个redis节点作为压测节点的从节点。并且这个节点对应用不可见。
那么我们在这个节点上进行big key的统计,就对业务没有任何影响了。

总结

官方提供的方式:redis-cli --bigkeys -i 0.01 应该是处理运行中的 redis big key 扫描的最佳方案了,当然,我们尽量避免高峰期去执行。

到此这篇关于详解redis big key 排查思路的文章就介绍到这了,更多相关redis big key 排查内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解redis big key 排查思路

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解redis big key 排查思路

目录定义big key如何排查Big Key官方解决方案解析RDB文件并统计网络统计新增从节点总结今天在秦晓辉的运维系统监控专栏交流群中,看到了几位朋友在讨论Redis big key 扫描的方案。不自觉的来了兴致,参与了讨论。并且有一些比
2023-06-12

Redis中的Big Key问题:排查与解决思路

在本文中,我们将深入探索 Big Key 问题的源头,讨论它如何影响系统性能,并提供相应的解决策略。
RedisBigKey2024-11-30

Redis中的BigKey问题排查与解决思路详解

目录摘要Big Key问题介绍Big Key问题排查使用BIGKEYS命令Debug Objectmemory usageRedis-rdb-toolsBig Key问题解决思路分割大key对象压缩直接删除总结摘要Redis是一款性能强劲
2023-03-31

Redis中的BigKey问题:排查与解决思路

Big Key问题是Redis中常见的问题之一,但是通过合理的排查和解决思路,我们可以有效地避免这个问题。本文将向大家介绍如何排查和解决这个问题。
Redis数据库2024-11-30

Redis大Key问题如何排查?如何解决?

Redis 大 Key 问题会让 Redis 服务阻塞,无法响应其他命令,可能会导致客户端响应超时等问题。排查大 Key 问题可以使用 BIGKEYS、MEMORY USAGE、OBJECT 等命令。

NodeSass依赖问题排查思路解析

这篇文章主要为大家介绍了NodeSass依赖问题排查思路解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

详说TCP重传问题的排查思路与实践

导读本文总结自己工作过程中遇到的TCP重传问题的解决过程 ,侧重于大致的解决问题的思路与具体的实践,理论知识偏少,大家有兴趣的可以多查阅相关文章以便深入了解tcp的工作机制。关于TCP重传
2023-06-04

基于redis实现的点赞功能设计思路详解

前言 点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysql等。 直接写入Mysql 直接写
2022-06-04

arco design按需导入报错排查思路与解决方案解析

这篇文章主要为大家介绍了arco design 按需导入报错排查思路与解决方案解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-08

业务前端界面报错504排查思路和解决办法

本文只是提供一个自己在排查过程的思路方向,每个问题的情况和背景不一样,需要各自结合实际情况来调整。
前端界面5042024-12-01

Linux系统中CPU占用率较高问题排查思路与解决方法

前言 作为 linux 运维工程师,在日常工作中我们会遇到 Linux服务器上出现CPU负载达到100%居高不下的情况,如果CPU 持续跑高,则会影响业务系统的正常运行,带来企业损失。很多运维的同学遇到这种状况往往会不知所措,对于CPU过载
2022-06-04

微服务Spring Boot 整合Redis 阻塞队列实现异步秒杀下单思路详解

这篇文章主要介绍了微服务Spring Boot 整合Redis 阻塞队列实现异步秒杀下单,使用阻塞队列实现秒杀的优化,采用异步秒杀完成下单的优化,本文给大家分享详细步骤及实现思路,需要的朋友可以参考下
2022-11-13

mysql查询每小时数据和上小时数据的差值实现思路详解

一、前言 需求是获取某个时间范围内每小时数据和上小时数据的差值以及比率。本来以为会是一个很简单的sql,结果思考两分钟发现并不简单,网上也没找到参考的方案,那就只能自己慢慢分析了。 刚开始没思路,就去问DBA同学,结
2022-05-10

编程热搜

目录