一、问题描述
根据实际生产运维监控数据,观察Redis服务器的内存占用超过70%以上,直接发出预警信息,详细情况如下图所示
top相关进程信息如下
二、解决分析
1.基本定位问题,由于redis的rdb持久化引起,观察rdb-bgsave进程,每分钟一次,那为什么会如此频繁的进行rdb持久化呢?
2.查看集群更新数据量
3.单台机器每分钟有15万以上的更新量,3台master那就有50W的更新量,根据数据更新场景判断没有这么大更新量
(而redis默认配置rdb持久化触发条件:1分钟内超过1万次数据更新、5分钟超过10条数据更新、15分钟超过1条数据更新,相关文章参考“关于Redis的RDB及AOF两种不同存储方式及redis.conf相关配置说明”)
4.拷贝下dump文件(两个,间隔一分钟拷一下,这样可以做key对比),使用rdb-tools,分析内存key,命令如下
rdb -c memor \dump\dump1.rdb > \dump\memory1.csv@b@rdb -c memor \dump\dump2.rdb > \dump\memory2.csv
5.打开文件,发现大量E:开头的string,和开发沟通,有个场景会定时导一个2G大小的数据文件到redis,不论有没有改动,都会导进去,造成redis更改频繁,引起rdb频繁持久化
6.具体解决方案:a.关闭或调大持久化、b.业务系统调整,只导有变化的数据。