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

Redis Bgsave 失败分析

IT那活儿 2024-07-18
314

点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!   




事件背景



某周一早晨10点,收到开发侧反馈后端服务接口报错,周一早上请求比较多,最近也没有更新程序,使用redis存储一些数据,并发请求的时候发生RDB快照失败。



事件分析



2.1 报错现象分析

页面报错详情:
客户端报错:
Error in execution; nested exception is 
io.lettuce.core.RedisCommandExecutionException: MISCONF
Redis is configured to save RDB snapshots, but it is
currently not able to persist on disk. Commands that may
modify the data set are disabled, because this instance is 
configured to report errors during writes if RDB
snapshotting fails (stop-writes-on-bgsave-error option).
Please check the Redis logs for details about the RDB error.}

微服务告警时段日志:

redis 服务相应时段日志:

发现RDB快照失败。
2.2 可能原因
快照文件当前登录用户无写权限。
//拥有写权限。
磁盘空间不足。
//磁盘空间充足。
因为bgsave需要fork一个子进程,若不足以fork子进程的话也会报错。
//发现内存不足。

bgsave方法为什么会失败呢?(思考)

在BGSAVE时,Redis会fork一个子进程,把数据保存到硬盘上。可以通过查看日志来获取BGSAVE失败的原因,大多数时候BGSAVE失败的原因是fork进程分配不到内存。更多时候,fork进程分配不到内存是因为跟操作系统的优化相冲突,即使操作系统有足够的内存。

采用 Redis 建议的配置是为了在极端情况下 Linux 可以挤出来一些内存供 Redis 备份,但是更建议优先配置好 maxmemory ,给机器留 20%~30% 的空闲内存。




优化方案



3.1 系统优化层面

  • #vm.overcommit_memory = 1,直接放行。

  • # vm.overcommit_memory = 0:则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap,决定是否放行。

3.2 主机配置层面
考虑到主机内存不足,目前占用率达95%,建议扩容内存规格。

设置方法:

  • 临时:通过命令修改,立即生效。重启后会失效;
    sysctl vm.overcommit_memory=1
  • 永久:再将改动写入系统配置文件,使其永久有效;
    echo "vm.overcommit_memory=1" >> etc/sysctl.conf
    sysctl -p  使其生效
3.3 停止Redis
ps aux | grep redis
kill -9 PID (redis 进程号)
3.4 启动redis
redis-server /app1/opt/redis/conf/redis-6379.conf
redis-server /app1/opt/redis/conf/redis-6380.conf

观察微服务日志、Redis 服务端日志是否恢复。
至此,告警已恢复,业务恢复正常。

END


本文作者:张佳鑫(上海新炬中北团队)

本文来源:“IT那活儿”公众号

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

评论