瑞迪斯告诉我"Failed opening .rdb for saving: Permission denied"



我在Debian服务器8.5上运行Redis服务器2.8.17。我使用Redis作为Django 1.8.4应用程序的会话存储。

我已经有几个月没有更改服务器上的软件配置了,一切都很好,直到一周前Django开始出现以下错误:

MISCONF Redis is configured to save RDB snapshots but is currently not able to persist to disk.  Commands that may modify the data set are disabled.  Please check Redis logs for details...

我查看了redis日志,发现这种情况大约每秒发生一次:

1 changes in 900 seconds.  Saving...
Background saving started by pid 22213
Failed opening .rdb for saving: Permission denied
Background saving error

我读过这两个SO问题1、2,但它们并没有帮助我找到问题所在。

ps显示用户"redis"正在运行服务器:

redis   26769   ...   /usr/bin/redis-server *.6379

我检查了我的配置文件中的redis文件名和路径:

grep ^dir /etc/redis/redis.conf =>
dir /var/lib/redis
grep ^dbfilename /etc =>
dbfilename dump.rdb

/var/lib/redis上的权限是755,它由redis:redis所有。/var/lib/redis/dump.rdb上的权限为644,它也由redis:redis所有。

我还在服务器进程上运行了strace:

ps -C redis-server  # pid = 26769
sudo strace -p 26769 -o /tmp/strace.out

但是当我检查输出时,我没有看到任何错误。特别是,我没有看到我所期望的"权限被拒绝"错误。

此外,/var/lib/redis不是NFS目录。

有人知道是什么原因造成的吗?我讨厌不得不停止使用Redis。我知道我可以运行命令"set stop writes on bgsave error yes",但这并不能解决问题。

现在这种情况每天都在发生,我唯一能阻止错误的方法就是重新启动Redis服务器。

谢谢。

我刚刚遇到了类似的问题。尽管我的配置文件是正确的,但当我在redis客户端中检查实际的dbfilename和dir时,它们是不正确的。

运行redis-cli,然后运行

CONFIG GET dbfilename应该返回类似的内容

1) "dbfilename"
2) "dump.rdb"

1( 只是键和2(值。类似地,运行CONFIG GET dir应该返回类似的内容

1) "dir"
2) "/var/lib/redis"

确认这些是正确的,如果不是,用CONFIG SET dir /correct/path 进行设置

希望这能有所帮助!

如果您已将Redis移动到新安装的卷:/mnt/data-01

sudo vim /etc/systemd/system/redis.service

Set ReadWriteDirectories=-/mnt/data-01

sudo mkdir /mnt/data-01/redis

在新的redis数据目录和rdb文件上设置chown和chmod
/var/lib/redis上的权限是755,它由redis:redis所有
/var/lib/redis/dump.rdb上的许可证是644,它由redis:redis 所有

redis运行时的交换机配置

$ redis-cli
127.0.0.1:6379> CONFIG SET dir /data/tmp
redis-cli 127.0.0.1:6379> CONFIG SET dbfilename temp.rdb
127.0.0.1:6379> BGSAVE
tail /var/log/redis/redis.cnf(验证已保存(

在Redis具有写入权限的目录中启动Redis服务器

上面的答案肯定会解决你的问题,但以下是实际情况:

存储rdb.dump文件的默认位置是./(表示当前目录(。您可以在redis.conf文件中对此进行验证。因此,启动redis服务器的目录将创建和更新dump.rdb文件。

由于您说您的redis服务器已经正常工作了一段时间,而这种情况刚刚开始发生,因此您似乎已经开始在redis没有创建dump.rdb文件的正确权限的目录中运行redis服务器。

更糟糕的是,redis可能也不允许您关闭服务器,直到它能够创建rdb文件以确保正确保存数据。

要解决此问题,必须使用redis-cli进入活动的redis客户端环境,更新dir密钥,并将其值设置为项目文件夹或任何非root用户有权保存的文件夹。然后运行BGSAVE以调用dump.rdb文件的创建。

CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE

(现在,如果需要将dump.rdb文件保存在启动服务器的目录中,则需要更改该目录的权限,以便redis可以对其进行写入。您可以搜索stackoverflow以了解如何做到这一点(。

您现在应该可以关闭redis服务器了。请注意,我们对路径进行了硬编码。硬编码很少是一种好的做法,我强烈建议从项目目录启动redis服务器并更改dir key back to

CONFIG SET dir "./"
BGSAVE

这样,当您需要另一个项目的redis时,转储文件将在当前项目的目录中创建,而不是在硬编码路径的项目目录中。

您可以通过进入redis-cli 来解决此问题

在终端中键入redis-cli

然后写config set stop-writes-on-bgsave-error no,它解决了我的问题。

希望它能解决您的问题

在redis 3.2之前,它附带了非常疯狂的默认值,向公众开放了端口。结合CONFIG SET指令,每个人都可以轻松地从外部更改您的redis配置。如果错误在一段时间后开始,可能有人更改了您的配置。

在您的本地机器上检查

telnet SERVER_IP REDIS_PORT

被拒绝。否则请检查您的配置,您应该有设置

bind 127.0.0.1

已启用。

根据运行redis的用户,您还应该检查入侵者造成的损坏。

最新更新