背景:

周一回来上班,在使用codis进行数据操作时,遇到错误提示:

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

Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。

原因有以下三种情况:

1. 强制关闭Redis快照导致不能持久化。

2. 磁盘满了也会报这个错误

3. 发生此错误是由于BGSAVE失败。在BGSAVE期间,Redis派生一个子进程以将数据保存在磁盘上。这个错误可以从日志中检查BGSAVE失败的确切原因(通常在linux计算机上/var/log/redis/redis-server.log ),但是很多时候BGAVE失败是因为fork无法分配内存。也有可能是,由于OS的优化存在冲突,导致fork无法分配内存(尽管计算机具有足够的可用RAM)。(大部分情况是该错误)。

文档:https://redis.io/topics/admin

If you are using Redis in a very write-heavy application, while saving an RDB file on disk or rewriting the AOF log Redis may use up to 2 times the memory normally used. The additional memory used is proportional to the number of memory pages modified by writes during the saving process, so it is often proportional to the number of keys (or aggregate types items) touched during this time. Make sure to size your memory accordingly.

中文意思:

如果要在写入量很大的应用程序中使用Redis,在磁盘上保存RDB文件或重写AOF日志时,Redis可能使用的内存最多是使用的内存的2倍。使用的额外内存与保存过程中通过写入修改的内存页面数量成正比,因此通常与这段时间内触摸的键(或聚合类型项)的数量成比例。确保相应地调整内存大小。

简单说明:

比如服务器目前是8g内存,其他进程占用内存为1g,redis占用内存为5g,剩余可用内存为2g,

当redis触发bgsave时,那么就会触发 Can't save in background: fork: Cannot allocate memory。因为redis在bgsave时会fork一个进程时,由于系统剩余内存不足5g,就触发错误。

查看日志文件:

cd /var/lib/redis_7021
tail -n 10 redis_7021.log

临时解决方案:

运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。

这个作用是:停止保存快照,没有实际解决问题。

root@ubuntu# ./redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK
127.0.0.1:6379> lpush myColour "red"
(integer) 1

第二种解决方法:

  1.  先查看每一台codis所在服务器的日志文件,找到出错的机器

  2. 尽量释放机器的内存,如果是由于内存不足问题,那么先使用save命令保存数据,然后拆分数据到另外一台服务器上。

  3. 检查硬盘是否空间不够导致。

总结:

  1.  使用redis的服务器建议剩余空间尽量保持45%左右,如果超过这个值那么就需要扩容服务器,或者是将数据进行转移。

  2. 不同版本的redis之间,rdb文件不能共用。

参考文档:

https://redis.io/topics/admin

https://stackoverflow.com/questions/14958799/choosing-redis-maxmemory-size-and-bgsave-memory-usage

本文地址: http://www.chenxm.cc/article/799.html
版权声明: 本文为原创文章,版权归  陈新明  所有,欢迎分享本文,转载请保留出处!
上一篇: django 基本常用命令,创建新App及其常用命令
下一篇: linux 查看文件的行数
发表评论

还没有留言,还不快点抢沙发?