内存不足 Redis 获取数据出错引发的雪崩分析

异常回顾

28 日凌晨机器警报拉响,某 Redis 服务出现“MISCONF Redis is configured to save RDB snapshots……”,接着活动服开始连续崩溃,大概十分钟之后,活动服正常拉起。

经过分析,发现机器由于内存不足,Redis 服务无法正常 dump,导致写入失败引发的连环错误。但是看服务的日志时,我们发现一些特别诡异的问题,从 Redis 中获取出来的数据数据格式和请求的根本的不匹配。熟悉 C++ 的小伙伴深知,这大概率是内存出错了。但是仔细看了看,毫无头绪,主要由于服务使用的是单线程的模型,请求数据时,返回的数据格式就是错误的

HSET 的时候,还会调用 EXPIRE 设置过期时间,调用了两次 redisAppendCommand但却只调用了一次 redisGetReply 命令,也即只获取了 hset 的返回,但是并未获取 expire 的返回这会导致后续的命令再调用 redisGetReply 时获取到是 expire 的返回,后续的命令就会连续错位。

[Read More]
Redis  Code