使用rdbtools+MySQL对Redis进行内存占用分析

使用rdbtools+MySQL对Redis进行内存占用分析,第1张

线上某IM业务基于Redis作为持久化层实现,近期出现Redis内存告警,于是对线上Redis各Key内存占用进行分析,便于进行业务改造。

虽然Redis4.0以后提供了memory命令进行内存查询,但是对于存在大量业务key来说可能不够方便,只看统计结果又不够详细不好定位具体业务,选择使用rdbtools来进行分析。

运维提供了阿里云Redis自动备份文件 backupfile.rdb 。当然也可以自行到Redis目录下获取 dump.rdb 文件。

我这里使用的是linux环境,确保python及pip已经正确安装。

rdbtools项目地址: https://github.com/sripathikrishnan/redis-rdb-tools

rdbtools安装,以pip3为例:

rdbtools生成内存报告:(更多使用方法可以参考官方文档)

执行内存分析后CPU会跑满,耐心等待即可。我这里630M共计500万个key的rdb文件运行了接近10分钟。

执行完成后在当前目录文件生成了内存报告文件 memory.csv 。

由于生成的内存报告文件 memory.csv 可能很大,直接打开进行分析处理存在限制,将数据导入MySQL。

创建表:

此表字段与csv文件字段一一对应,然后将csv文件数据导入该表。

最后通过排序以及key的模糊查询等手段,即可完成Redis内存分析。

update类型的数据无法更新到目标库,通过追踪源码,发现同步源库的binlog日志中UPDATE类型的old参数为null,导致跳出更新程序,无法更新。

仔细检查了目标库的binlog是否开启,以及binlog的格式设置,以及binlog_row_image的设置,均满足官方要求。通过换服务器安装,换目标库等等的尝试发现都无果之后,走上了修改源码的道路。这里定位问题所在为源库MySQL的未知设置问题。

修改com.alibaba.otter.canal.client.adapter.rdb.service.RdbSyncService类中的update方法如下。

第一种方式对binlog中的old参数值不进行判断,直接对所有字段值进行update *** 作;

第二种方式兼容原有逻辑,如果有old参数值按照原有逻辑进行,如果没有按照上述第一种方式进行;


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/8493496.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-17
下一篇 2023-04-17

发表评论

登录后才能评论

评论列表(0条)

保存