摘要:如何定位分布式缓存数据库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.c...

② 命令剖析:应用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/weiyanwei4...。具体步骤如下:

编译办法:

yum install git go -y

mkdir /home/gocode/

cd /home/gocode/

git clone https://github.com/weiyanwei4...

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/...

四、解决方案

导致本次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问题,尽早辨认危险。

点击关注,第一工夫理解华为云陈腐技术~