技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议
摘要:如何定位分布式缓存数据库Redis大KEY问题,实操案例带你掌握优化方法。
【背景】
访问Redis 5.0 cluster集群出现OOM报错,报错信息为(error) OOM command not allowed when used memory > ‘maxmemory’,部分ECS应用程序无法向数据库写入,影响服务的正常使用。执行set t2 s2时,数据库报错OOM,如下图:

【拓扑】

环境信息:
Redis 5.0 cluster集群 4G内存
DCS网段:192.168.1.0/24
分片1:master 192.168.1.12 slave 192.168.1.37
分片2:master 192.168.1.10 slave 192.168.1.69
分片3:master 192.168.1.26 slave 192.168.1.134
【分析思路】

【详细步骤】
一、查看监控
查看Redis实例监控,显示Redis集群内存占用46.97%,无明显异常,结果如下图所示:

查看节点的内存监控。其中分片2中master节点192.168.1.10内存使用率达到100%,其余两个分片分内存使用率均在20%左右,结果如下图所示:

二、确认异常分片信息
通过上述监控信息可得知,该redis集群中的分片2中内存使用率达100%。有且仅有该分片内存异常。
三、大KEY分析
在线分析
① 工具分析:使用华为云管理控制台缓存分析-大Key分析工具。执行完成后,查看信息即可。结果如下图所示:(string类型保存top20,list/set/zset/hash类型保存top80)
具体使用方法参考以下链接:https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190808001.html

② 命令分析:使用redis-cli -h IP -p port –bigkeys命令,该工具会列出各个类型数据中大Key中的最大的那个key的信息。结果如下图所示:

如上图所示,可以得出该环境中string类型的大key为“nc_filed/_pk”,大小为13283byte,list、set、hash、zset类型的数据未发现大key。
离线方式
离线分析需要使用专门的rdb_bigkeys分析工具,对rdb文件进行分析。工具地址: https://github.com/weiyanwei412/rdb_bigkeys。具体步骤如下:
编译方法:
# yum install git go -y
# mkdir /home/gocode/
# cd /home/gocode/
# git clone https://github.com/weiyanwei412/rdb_bigkeys.git
# cd rdb_bigkeys
# go build
执行完成生成可执行文件rdb_bigkeys。
使用方法:
./rdb_bigkeys -bytes 1024 -file bigkeys.csv -sorted -threads 4 /home/redis/dump.rdb
参数说明:
-bytes 1024:筛选大于1024字节的key
-file bigkeys.csv:将结果保存到bigkeys.csv文件
-sorted:从大到小进行排序
-threads:使用的线程个数
/home/redis/dump.rdb:实际的rdb文件路径
生成文件样式如下所示:

每列分别为数据库编号,key类型,key名,key大小,元素数量,最大值元素名,元素大小,key过期时间。文档链接:https://www.cnblogs.com/yqzc/p/12425533.html
四、解决方案
导致本次OOM问题的根因为大KEY导致数据大小分布不均匀,某一个分片内存达到maxmemory,在进行数据写入的过程中,如果调度到该分片,则会产生OOM问题。将该分片的rdb文件导出一份,以便于后期针对大key做对应的优化。
临时方案:
为尽快回复业务,删除上有步骤中查询到的大KEY,执行操作如下:(非字符串的bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除)

长期方案:
通过对大KEY进行拆分,将一个大的KEY拆分为多个小的KEY, 变成value1,value2… valueN,打散分不到不同的分片中,避免因为数据倾斜导致的数据分布不均。

其他的类型的数据也可以按照相同的方式进行拆分重组,从而避免大KEY带来的影响。
五、 结果验证
查看分片监控,192.168.1.10内存使用率下降到24%,结果如下图所示:

执行set t2 s2,返回正常,登录集群,执行get命令,正常返回数据信息。结果如下所示,至此业务恢复正常。

【优化及建议】
1) 配置节点级别的内存利用率监控指标的告警。如果某个节点存在大key,这个节点比其他节点内存使用率高很多,会触发告警,便于用户发现潜在的大key。
2) 配置节点级别的入网最大带宽、出网最大带宽、CPU利用率监控指标的告警。如果某个节点存在热key,这个节点的带宽占用、CPU利用率都比其他节点高,该节点会容易触发告警,便于用户发现潜在热key。
3) string类型控制在10KB以内,hash、list、set、zset元素尽量不超过5000。
4) 定期通过大key、热key分析工具检查集群中是否存在大key问题,尽早识别风险。
点击关注,第一时间了解华为云新鲜技术~
摘要:如何定位分布式缓存数据库Redis大KEY问题,实操案例带你掌握优化方法。
【背景】
访问Redis 5.0 cluster集群出现OOM报错,报错信息为(error) OOM command not allowed when used memory > ‘maxmemory’,部分ECS应用程序无法向数据库写入,影响服务的正常使用。执行set t2 s2时,数据库报错OOM,如下图:

【拓扑】

环境信息:
Redis 5.0 cluster集群 4G内存
DCS网段:192.168.1.0/24
分片1:master 192.168.1.12 slave 192.168.1.37
分片2:master 192.168.1.10 slave 192.168.1.69
分片3:master 192.168.1.26 slave 192.168.1.134
【分析思路】

【详细步骤】
一、查看监控
查看Redis实例监控,显示Redis集群内存占用46.97%,无明显异常,结果如下图所示:

查看节点的内存监控。其中分片2中master节点192.168.1.10内存使用率达到100%,其余两个分片分内存使用率均在20%左右,结果如下图所示:

二、确认异常分片信息
通过上述监控信息可得知,该redis集群中的分片2中内存使用率达100%。有且仅有该分片内存异常。
三、大KEY分析
在线分析
① 工具分析:使用华为云管理控制台缓存分析-大Key分析工具。执行完成后,查看信息即可。结果如下图所示:(string类型保存top20,list/set/zset/hash类型保存top80)
具体使用方法参考以下链接:https://support.huaweicloud.com/usermanual-dcs/dcs-ug-190808001.html

② 命令分析:使用redis-cli -h IP -p port –bigkeys命令,该工具会列出各个类型数据中大Key中的最大的那个key的信息。结果如下图所示:

如上图所示,可以得出该环境中string类型的大key为“nc_filed/_pk”,大小为13283byte,list、set、hash、zset类型的数据未发现大key。
离线方式
离线分析需要使用专门的rdb_bigkeys分析工具,对rdb文件进行分析。工具地址: https://github.com/weiyanwei412/rdb_bigkeys。具体步骤如下:
编译方法:
# yum install git go -y
# mkdir /home/gocode/
# cd /home/gocode/
# git clone https://github.com/weiyanwei412/rdb_bigkeys.git
# cd rdb_bigkeys
# go build
执行完成生成可执行文件rdb_bigkeys。
使用方法:
./rdb_bigkeys -bytes 1024 -file bigkeys.csv -sorted -threads 4 /home/redis/dump.rdb
参数说明:
-bytes 1024:筛选大于1024字节的key
-file bigkeys.csv:将结果保存到bigkeys.csv文件
-sorted:从大到小进行排序
-threads:使用的线程个数
/home/redis/dump.rdb:实际的rdb文件路径
生成文件样式如下所示:

每列分别为数据库编号,key类型,key名,key大小,元素数量,最大值元素名,元素大小,key过期时间。文档链接:https://www.cnblogs.com/yqzc/p/12425533.html
四、解决方案
导致本次OOM问题的根因为大KEY导致数据大小分布不均匀,某一个分片内存达到maxmemory,在进行数据写入的过程中,如果调度到该分片,则会产生OOM问题。将该分片的rdb文件导出一份,以便于后期针对大key做对应的优化。
临时方案:
为尽快回复业务,删除上有步骤中查询到的大KEY,执行操作如下:(非字符串的bigkey,不要使用 del 删除,使用 hscan、sscan、zscan 方式渐进式删除)

长期方案:
通过对大KEY进行拆分,将一个大的KEY拆分为多个小的KEY, 变成value1,value2… valueN,打散分不到不同的分片中,避免因为数据倾斜导致的数据分布不均。

其他的类型的数据也可以按照相同的方式进行拆分重组,从而避免大KEY带来的影响。
五、 结果验证
查看分片监控,192.168.1.10内存使用率下降到24%,结果如下图所示:

执行set t2 s2,返回正常,登录集群,执行get命令,正常返回数据信息。结果如下所示,至此业务恢复正常。

【优化及建议】
1) 配置节点级别的内存利用率监控指标的告警。如果某个节点存在大key,这个节点比其他节点内存使用率高很多,会触发告警,便于用户发现潜在的大key。
2) 配置节点级别的入网最大带宽、出网最大带宽、CPU利用率监控指标的告警。如果某个节点存在热key,这个节点的带宽占用、CPU利用率都比其他节点高,该节点会容易触发告警,便于用户发现潜在热key。
3) string类型控制在10KB以内,hash、list、set、zset元素尽量不超过5000。
4) 定期通过大key、热key分析工具检查集群中是否存在大key问题,尽早识别风险。
点击关注,第一时间了解华为云新鲜技术~
技术解读丨分布式缓存数据库Redis大KEY问题定位及优化建议的更多相关文章
- 缓存数据库redis
什么是Redis? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命 ...
- Spring Cloud(7):事件驱动(Stream)分布式缓存(Redis)及消息队列(Kafka)
分布式缓存(Redis)及消息队列(Kafka) 设想一种情况,服务A频繁的调用服务B的数据,但是服务B的数据更新的并不频繁. 实际上,这种情况并不少见,大多数情况,用户的操作更多的是查询.如果我们缓 ...
- 缓存数据库-redis数据类型和操作(list)
转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...
- 深度评测丨 GaussDB(for Redis) 大 Key 操作的影响
本文分享自华为云社区<墨天轮评测:GaussDB(for Redis)大Key操作的影响>,作者: 高斯 Redis 官方博客. 在前一篇文章<墨天轮评测:GaussDB(for R ...
- .NET WebAPI 采用 IDistributedCache 实现分布式缓存过滤器 Redis 模式
分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...
- Redis大 key的发现与删除方法全解析
个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...
- Redis大key的发现与删除方法全解析
个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...
- Redis 大 key 问题总结
多大的 key 算大? 阿里云Redis 最佳实践中提到 合理的 Key 中 Value 的字节大小,推荐小于10 KB.过大的 Value 会引发数据倾斜.热点Key.实例流量或 CPU 性能被占满 ...
- Redis 大 key 问题 & 问题分析 & 解决方案
Redis 大 key 问题 & 问题分析 & 解决方案 Redis 什么是 Redis 大 key 单个key 存储的 value 很大 hash, set,zset,list 结构 ...
- 技术分享丨华为鲲鹏架构Redis知识二三事
摘要:华为云鲲鹏Redis,业界首个基于自研ARM-Based全栈整合的Redis云服务,支持双机热备的HA架构,提供单机.主备.Proxy集群.Cluster集群实例类型,满足高读写性能场景及弹性变 ...
随机推荐
- Kraft模式下Kafka脚本的使用
Kafka集群 版本:V3.5.1 名称 Node1 Node2 Node3 IP 172.29.145.157 172.29.145.182 172.29.145.183 (1)查看Kraft集群中 ...
- 推荐一款“自学编程”的宝藏网站!详解版~(在线编程练习,项目实战,免费Gpt等)
云端源想学习平台,一站式编程服务网站云端源想官网传送门 精品课程:由项目实战为导向的视频课程,知识点讲解配套编程练习,让初学者有方向有目标. 课程阶段:每门课程都分多个阶段进行,由浅入深,很适合零基础 ...
- 数据类型python
type()语句的用法 运行结果
- 运用chatGPT生成E-R图的prompt
根据以上内容,让我们定义用例 让我们为用例定义一个数据模型 更详细地描述数据模型或使用 Markdown 的表格格式 这种模型可以根据具体的用例进行扩展和修改,以满足需求分析和设计过程中的实际需要. ...
- 关于微信小程序中如何实现数据可视化-echarts动态渲染
移动端设备中,难免会涉及到数据的可视化展示.数据统计等等,本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染,实现数据可视化功能. 基础使用 首先在GitHub上下载echarts包 地址: ...
- 一行代码解决IE停用后无法继续使用IE弹窗功能的问题
微软在2023年2月14日通过Edge浏览器更新,彻底封死IE.Windows Update中没有记录.开始菜单中的IE以及桌面IE图标双击自动打开Edge,默认程序设置了IE也没有任何效果,仅能通过 ...
- 学会XPath,轻松抓取网页数据
一.定义 XPath(XML Path Language)是一种用于在 XML 文档中定位和选择节点的语言.XPath的选择功能非常强大,可以通过简单的路径选择语法,选取文档中的任意节点或节点集.学会 ...
- lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
-- create a class Animal={name = "no_name" , age=0 } function Animal:bark(voice) print(sel ...
- [cnn][julia]Flux实现卷积神经网络cnn预测手写MNIST
julia_Flux 1.导入Flux.jl和其他所需工具包 using Flux, MLDatasets, Statistics using Flux: onehotbatch, onecold, ...
- springMvc报错
这个报错困扰了我大概一天,主要是刚开始没抓到主要原因,是因为自己的项目结构出现了问题, 导致找不到应有的东西,另一方面就是maven的问题,将maven解决后这个就能用了. 具体解决在https:// ...