摘要:如何定位分布式缓存数据库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问题定位及优化建议的更多相关文章

  1. 缓存数据库redis

    什么是Redis? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命 ...

  2. Spring Cloud(7):事件驱动(Stream)分布式缓存(Redis)及消息队列(Kafka)

    分布式缓存(Redis)及消息队列(Kafka) 设想一种情况,服务A频繁的调用服务B的数据,但是服务B的数据更新的并不频繁. 实际上,这种情况并不少见,大多数情况,用户的操作更多的是查询.如果我们缓 ...

  3. 缓存数据库-redis数据类型和操作(list)

    转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部( ...

  4. 深度评测丨 GaussDB(for Redis) 大 Key 操作的影响

    本文分享自华为云社区<墨天轮评测:GaussDB(for Redis)大Key操作的影响>,作者: 高斯 Redis 官方博客. 在前一篇文章<墨天轮评测:GaussDB(for R ...

  5. .NET WebAPI 采用 IDistributedCache 实现分布式缓存过滤器 Redis 模式

    分布式缓存是由多个应用服务器共享的缓存,通常作为访问它的应用服务器的外部服务进行维护. 分布式缓存可以提高 ASP.NET Core 应用的性能和可伸缩性,尤其是当应用由云服务或服务器场托管时. 与其 ...

  6. Redis大 key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...

  7. Redis大key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...

  8. Redis 大 key 问题总结

    多大的 key 算大? 阿里云Redis 最佳实践中提到 合理的 Key 中 Value 的字节大小,推荐小于10 KB.过大的 Value 会引发数据倾斜.热点Key.实例流量或 CPU 性能被占满 ...

  9. Redis 大 key 问题 & 问题分析 & 解决方案

    Redis 大 key 问题 & 问题分析 & 解决方案 Redis 什么是 Redis 大 key 单个key 存储的 value 很大 hash, set,zset,list 结构 ...

  10. 技术分享丨华为鲲鹏架构Redis知识二三事

    摘要:华为云鲲鹏Redis,业界首个基于自研ARM-Based全栈整合的Redis云服务,支持双机热备的HA架构,提供单机.主备.Proxy集群.Cluster集群实例类型,满足高读写性能场景及弹性变 ...

随机推荐

  1. 2023-10-18:用go语言,给定一个数组arr,长度为n,表示有0~n-1号设备, arr[i]表示i号设备的型号,型号的种类从0~k-1,一共k种型号, 给定一个k*k的矩阵map,来表示型号

    2023-10-18:用go语言,给定一个数组arr,长度为n,表示有0~n-1号设备, arr[i]表示i号设备的型号,型号的种类从0~k-1,一共k种型号, 给定一个k*k的矩阵map,来表示型号 ...

  2. 9.26 多校联测 Day 5 总结

    虽然比赛还没打完,但是因为又罚坐了,提前把总结写出来吧() 看 T1,构造了一会发现大概就是把 b 序列放在 a 的最后面,前面位置填几个数. 先码了暴力,再码正解.但求出来的方案显然不是同一种/fn ...

  3. YXの每日挂分记录

    7.11 T1 不开两倍数组 100->60. 7.18 T2 dp+矩乘 转移不判边界 100->10. 7.20 T2 人类智慧 1e6 n log n 100->10,求前 5 ...

  4. 红瞳瞳CRUD Avue各参数作用

    常用的两个avue文档: avue 开发文档: https://www.bookstack.cn/read/avue-2.x/3c22e1c01099c1f1.md   avue开发指南:https: ...

  5. QT(8)-QSpinBox

    QSpinBox 1 介绍 QSpinBox 是 Qt 中的一种数字输入控件,支持整数和浮点数输入.它允许用户通过上下箭头或键盘输入来选择数字.您可以设置最小值.最大值和步长,以限制用户输入的范围.Q ...

  6. Spring ---三种注入方式

    循环依赖这个问题,按理说我们在日常的程序设计中应该避免,其实这个本来也是能够避免的.不过由于总总原因,我们可能还是会遇到一些循环依赖的问题,特别是在面试的过程中,面试考察循环依赖,主要是想考察候选人对 ...

  7. 夯实JAVA基本之一 —— 泛型详解(1):基本使用(转)

    一.引入1.泛型是什么首先告诉大家ArrayList就是泛型.那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码:ArrayList<String> strList = ne ...

  8. JAVA类的加载(2) ——按需加载(延迟加载)

    1.例1: 1 /* 2 按需加载:当你不去实例化Cat时,Cat相关类都不会被加载,即按需加载(需要时加载) 3 1.先加载父类 4 2.初始化类 5 3.类只加载一次(暂且这么认为)--缓存 6 ...

  9. [Python急救站课程]绘制蜡笔小新图案

    可爱的蜡笔小新想要吗?画起来 import turtle as t '''设置''' t.setup(800, 500) # 创建画布并使其位于屏幕中心 t.pensize(2) # 画笔粗细 t.c ...

  10. webpack 从 v4 升级到 v5

    准备工作 Node.js 至少升级到 v10.13.x 以上. 其它 修改 webpack.config.js 配置,以及部分老的 webpack 插件要更新. 参考 中文版 从 v4 升级到 v5 ...