Redis配置了在磁盘上保存 RDB 快照,但目前无法持久化到磁盘
查看spring boot日志,发现redis报错导致登录失败,redis又又又出问题了
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisSystemException: 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.] with root causeio.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 快照,但目前无法持久化到磁盘。Redis 因此禁用了所有可能修改数据的命令(因为 stop-writes-on-bgsave-error
选项设置为 yes
)。以下是解决此问题的步骤:
如果 Redis 是使用 Docker 部署在服务器中的,以下是针对 Docker 环境的解决方案:
1. 检查容器状态和日志
# 查看所有运行中的容器
docker ps# 查看 Redis 容器日志
docker logs <redis_container_name_or_id>
2. 检查磁盘空间
# 查看宿主机磁盘使用情况
df -h# 查看 Docker 磁盘使用情况
docker system df
3. 进入 Redis 容器执行命令
# 进入 Redis 容器
docker exec -it <redis_container_name_or_id> /bin/bash# 在容器内执行 Redis CLI
redis-cli# 在 Redis CLI 中临时关闭写保护
127.0.0.1:6379> CONFIG SET stop-writes-on-bgsave-error no# 检查配置
127.0.0.1:6379> CONFIG GET dir
127.0.0.1:6379> CONFIG GET dbfilename
4. 清理 Docker 资源
# 删除所有未使用的容器、网络、镜像(悬空)
docker system prune# 删除所有未使用的卷
docker volume prune# 删除所有未使用的镜像(包括被引用的)
docker system prune -a
5. 增加 Redis 容器的存储空间
如果使用 Docker 卷:
# 创建新卷
docker volume create redis_data_new# 运行临时容器迁移数据
docker run --rm -it \-v redis_data_old:/from \-v redis_data_new:/to \alpine ash -c "cd /from && cp -av . /to"
6. 修改持久化配置(推荐)
编辑你的 docker-compose.yml
或启动命令:
services:redis:image: redis:latestcommand: - --save "" # 禁用 RDB 持久化- --appendonly yes # 启用 AOF 持久化(可选)volumes:- redis_data:/dataports:- "6379:6379"
或者临时禁用持久化:
docker run -d --name redis \redis:latest \redis-server --save "" --appendonly no
7. 解决权限问题
# 检查卷权限
docker inspect <redis_container_name_or_id> | grep "Source"# 修复宿主机目录权限
sudo chown -R 1000:1000 /path/to/redis/data
8. 增加内存限制(如果需要)
在 docker-compose.yml
中:
services:redis:image: redis:latestdeploy:resources:limits:memory: 2Gsysctls:- vm.overcommit_memory=1
9. 备份和恢复数据
# 创建备份
docker exec <redis_container_name_or_id> redis-cli SAVE# 复制 RDB 文件
docker cp <redis_container_name_or_id>:/data/dump.rdb ./backup.rdb
10. 重启 Redis 容器
docker restart <redis_container_name_or_id>
永久解决方案建议:
-
监控磁盘空间:设置磁盘空间监控告警
-
调整持久化策略:
-
使用 AOF 代替 RDB
-
减少 RDB 保存频率
-
-
定期维护:
# 设置定时清理任务 0 2 * * * docker system prune -af
-
使用云存储:将数据目录挂载到云存储卷
验证修复是否成功:
# 在应用容器中测试写入
docker exec -it <app_container_name_or_id> sh
# 在容器内执行 Redis 写入测试
redis-cli SET testkey "hello"
EXIT
这些步骤应该能解决 Redis 在 Docker 中的持久化问题。如果问题仍然存在,请检查宿主机系统日志(/var/log/syslog
或 journalctl -u docker.service
)获取更多信息。