在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
当前回答
我知道这个线程稍微老一些,但当我早些时候得到这个错误时,这里是为我工作的,因为我知道我没有接近内存限制-两个答案都在上面找到。
希望这能在将来帮助到需要的人。
检查CHMOD目录…发现符号符号不一样。CHMOD目录文件夹到755 Dbfilename权限很好,不需要更改 重启redis-server 参考redis-server.log,发现该错误是访问被拒绝的结果。
再次-不确定DIR文件夹的权限是如何改变的,但我假设CHMOD回到755并重新启动redis-server,因为我之后能够ping到redis服务器。
另外,需要注意的是,redis确实拥有dbfilename和DIR文件夹的所有权。
其他回答
一个更永久的修复方法可能是查看/etc/redis/redis.conf中200-250行左右的rdb特性的设置,这不是redis 2中的一部分。x天。
值得注意的是
dir ./
可更改为
dir /home/someuser/redislogfiledirectory
或者您可以注释掉所有保存行,而不用担心持久性。(见/etc/redis/redis.conf中的注释)
还有,别忘了
service redis-server stop
service redis-server start
在我的情况下,它发生了,因为我刚刚安装了redis使用快速的方式。所以redis不是以根用户身份运行。 我可以按照他们快速入门指南中“更正确地安装Redis”部分的说明来解决这个问题。这样做之后,问题得到了解决,redis现在以根用户身份运行。来看看。
在我的情况下,这只是特权,我需要允许Redis接受传入的请求。
所以我重启了Redis服务通过Homebrew brew服务停止Redis和brew服务启动Redis和运行Redis服务器本地Redis -server。命令提示符要求我允许传入请求,然后它开始工作。
现在,Redis的写访问问题在官方的Redis docker容器中重新出现,给客户端这个错误消息。
来自官方Redis映像的Redis试图将.rdb文件写入containers /data文件夹中,这是相当不幸的,因为它是一个根目录拥有的文件夹,而且它也是一个非持久化的位置(如果容器/pod崩溃,写入那里的数据将消失)。
所以在一个小时的不活动后,如果你以非根用户运行你的redis容器(例如docker run -u 1007而不是默认的docker run -u 0),你会在你的服务器日志中得到一个非常详细的错误信息(参见docker logs redis):
1:M 29 Jun 2019 21:11:22.014 * 1 changes in 3600 seconds. Saving...
1:M 29 Jun 2019 21:11:22.015 * Background saving started by pid 499
499:C 29 Jun 2019 21:11:22.015 # Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied
1:M 29 Jun 2019 21:11:22.115 # Background saving error
所以你需要做的是将容器的/data文件夹映射到一个外部位置(非根用户,这里:1007,有写权限,比如主机上的/tmp),例如:
docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis
所以这是官方docker镜像的错误配置(应该写入/tmp而不是/data),产生了这个“定时炸弹”,你很可能只会在生产中遇到…在某个特别安静的假日周末过夜:/
此错误是由于BGSAVE失败导致的。在BGSAVE期间,Redis会fork一个子进程来将数据保存到磁盘上。虽然BGSAVE失败的确切原因可以从日志中检查(通常在linux机器上的/var/log/redis/redis-server.log),但很多时候bgive失败是因为fork不能分配内存。很多时候,由于操作系统的优化冲突,fork无法分配内存(尽管机器有足够的可用RAM)。
可以从Redis常见问题中阅读:
Redis background saving schema relies on the copy-on-write semantic of fork in modern operating systems: Redis forks (creates a child process) that is an exact copy of the parent. The child process dumps the DB on disk and finally exits. In theory the child should use as much memory as the parent being a copy, but actually thanks to the copy-on-write semantic implemented by most modern operating systems the parent and child process will share the common memory pages. A page will be duplicated only when it changes in the child or in the parent. Since in theory all the pages may change while the child process is saving, Linux can't tell in advance how much memory the child will take, so if the overcommit_memory setting is set to zero fork will fail unless there is as much free RAM as required to really duplicate all the parent memory pages, with the result that if you have a Redis dataset of 3 GB and just 2 GB of free memory it will fail. Setting overcommit_memory to 1 says Linux to relax and perform the fork in a more optimistic allocation fashion, and this is indeed what you want for Redis.
Redis不需要像操作系统认为的那样多的内存来写入磁盘,所以可能会预先导致fork失败。
要解决这个问题,您可以:
修改/etc/sysctl.conf,增加:
vm.overcommit_memory=1
然后重新启动sysctl:
在FreeBSD上:
sudo /etc/rc.d/sysctl reload
在Linux上:
sudo sysctl -p /etc/sysctl.conf