线上某个Redis集群业务反馈写入不进去,读取正常,奇怪,该集群最近没有做过任何变更,内存使用率也没有满,简单连上发现确实只能读,不可写,于是查看redis log,发现一段疑问信息
|
|
调查发现
Redis做RDB持久化需要fork出一个子进程,向系统申请内存失败,
由于stop-writes-on-bgsave-error配置的是yes,
即表示RDB持久化失败会拒绝业务写入操作,从而使得业务写入失败。
将默认配置stop-writes-on-bgsave-error 设置为no,业务恢复正常。(这样只是当redis写硬盘快照出错时,可以让用户继续做更新操作,但是写硬盘仍然是失败的。)
彻底解决方式
|
|
在什么条件下,linux会发现内存不足呢?
|
|
为什么RDB持久化之前没有问题,今天突然才出现这个问题?
由于redis服务内存使用最近突然增长,因此之前没有出现RDB失败的情况,通过分析RDB文件,某类KEY最近激增导致。
改进点
- 这是旧的Redis集群,改成aof方式
- 将所有redis配置stop-writes-on-bgsave-error调整为no
- 检查线上redis服务器vm.overcommit_memory配置
- 增加redis不可写监控