最新消息:

Redis故障整理-RedisOOM

IT技术 ipcpu 476浏览 0评论

Redis故障整理-RedisOOM.md

toc

背景概况

我们在生产环境有一组Redis Cluster,3台Master节点,3台Slave节点。
由于Redis Slave上面基本没啥量,所以我们的redis_exporter仅在3台Master节点上安装了。
大家可能猜到了,就是在Redis Master和Slave切换以后,我们没有及时发现,所以我们看到其中1台Redis节点内存使用率一直是97%-98%左右,挺长时间的也没有在意。直到某天,开发同学反馈,Redis报错了

OOM command not allowed when used memory > 'maxmemory'

登录服务器查看,我们发现,那个98%内存的节点一直是Slave节点,而真正的Master节点并没有安装redis_exporter,也没有监控数据。

细节分析

流程上和思想上的问题就不多说了,我们来具体分析下一些细节:

1. 当Redis出现OOM时,写入会报错,那么还能读数据吗?

读数据正常,写数据报错。

2. Redis是有LRU的,从OOM出现到,执行lru成功,需要多长时间?

RedisOOM后,接受到任何一个命令都会判断 used memory > maxmemory, 如果符合条件,启动LRU策略。
当驱逐策略为volatile-lru,但是redis内存中所有的key都没有设置过期时间,那么redis会一直处在报错中,直到手工删除一些数据。

3. 当Redis发送驱逐时,监控上会有什么表现?

当发生redis发生驱逐时,master节点会有evict行为通过rate(redis_evicted_keys_total)可以监控到,slave节点会存在大量DEL操作行为,通过 rate(redis_commands_duration_seconds_total{cmd="del"}[1m]) 指标可以监控到,此时master节点并不会出现DEL操作行为。

4. 当发生OOM错误时,Redis层面能否看到失败的连接数据?

不能。只能从evictkey数量增长和内存使用率上来判断。

5. 主从redis, 如果主redisOOM了,从redis上如何同步数据?

主RedisOOM,就不能写入了,会发生驱逐,驱逐后,从Redis节点会删除对应的被驱逐的KEY。
如果从节点maxmemory >= 主节点maxmemory,从节点不会优先启动驱逐。

改进办法

所有的Redis节点都要安装redis_exporter 。Redis主从随时都会切换。
主从切换以后,redis_cluster_my_epoch 会自动加1。这可以作为主从切换的判断依据。

转载请注明:IPCPU-网络之路 » Redis故障整理-RedisOOM

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址