暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redis内存占用过大问题排查与解决

后端Q 2024-06-21
7

在分布式系统中,Redis因其高性能和丰富的数据结构特性,被广泛用作缓存和消息中间件。然而,随着业务数据量的不断增长和Redis集群的扩展,内存占用问题逐渐成为运维和开发团队必须面对的挑战。本文将记录一次线上Redis内存占用过大问题的排查与解决过程,旨在为后续类似问题提供参考。

一、问题背景

某日,测试同事反馈测试环境的web系统无法登录,同时发现其他子系统也存在各类使用问题。经过初步排查,我们发现Redis集群存在宕机现象,并且有两个节点的内存占用异常高。

二、排查过程

  1. 查看系统日志首先,我们查看了服务器日志,发现与Redis相关的报错信息,初步判断Redis集群存在问题。

  2. 检查Redis节点状态由于Redis部署的是集群模式,我们登录到各个节点,通过top
    指令检查CPU和内存占用情况,发现有两个节点的内存占用率高达15G。

  3. 详细查询节点状态为了进一步确认问题,我们使用redis-cli -p <端口> INFO
    指令查询了这两个异常节点的详细状态,确认内存占用确实异常。

  4. 定位内存占用原因我们怀疑可能是产生了大量的key没有及时清理,或者某几个key的值异常大。通过bigkeys
    指令查询,发现jms_log_list
    这个key占用了近10G的内存。

  5. 分析key对应数据进一步查询jms_log_list
    这个key的数据,发现它是一个list类型的数据,用作临时队列。结合业务代码分析,我们发现该队列的消费者服务没有正常运行,导致数据累积。

  6. 服务状态检查到服务器上查看消费者服务的状态,发现服务并没有运行。经调查,是由于上周末测试服务器机房断电后,启动服务时遗漏了该消费者服务。

三、解决方案

  1. 临时措施为了快速恢复服务,我们首先关闭了一个从节点,释放主节点的内存压力。同时启动消费者服务,并临时增加消费者节点数以加快数据处理速度。待主节点消费完成后,再启动从节点进行数据同步。

  2. 长期优化

    • 完善监控与报警机制:加强对Redis集群的监控,设置内存使用阈值报警,及时发现并处理问题。
    • 优化消费者服务:对消费者服务的启动脚本进行检查和优化,确保服务能够正常启动并稳定运行。
    • 定期清理过期数据:对Redis中的过期数据进行定期清理,避免数据累积导致的内存占用过大问题。
    • 考虑水平扩展:如果数据量持续增长,可以考虑对Redis集群进行水平扩展,增加节点数量以提高处理能力。

四、总结

本次Redis内存占用过大问题的排查与解决过程,让我们深刻认识到在分布式系统中,任何一个环节的疏忽都可能导致整个系统的故障。因此,我们需要建立完善的监控和报警机制,及时发现并处理问题。同时,对于关键服务,还需要确保服务能够稳定、可靠地运行。通过本次问题的处理,我们也积累了一定的经验,为后续类似问题的解决提供了参考。


文章转载自后端Q,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论