Redis故障整理-RedisOOM.md
细节分析
1. 当Redis出现OOM时,写入会报错,那么还能读数据吗?
2. Redis是有LRU的,从OOM出现到,执行lru成功,需要多长时间?
3. 当Redis发送驱逐时,监控上会有什么表现?
4. 当发生OOM错误时,Redis层面能否看到失败的连接数据?
5. 主从redis, 如果主redisOOM了,从redis上如何同步数据?
改进办法
背景概况
我们在生产环境有一组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