redis:RDB快照失败问题排查与处理

来源:互联网 发布:麻瓜编程 编辑:程序博客网 时间:2024/06/18 06:55

redis快照问题错误信息如下:

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使用info命令查看,会发现最后一次快照失败的信息
rdb_last_bgsave_status:err

原因可能2种
1.磁盘满了
2.内存不足

结合日志查看,是内存不足的原因
这里写图片描述

处理方法:
1.进入redis临时关闭配置(如果需要,要再redis.conf上写上该配置,不然下次重启redis配置会失效)
config set stop-writes-on-bgsave-error no
2.长远
(1)可以的话尝试预留出足够的内存空间,
(2)不然的话,可以使用以下命令临时让redis申请内存成功(系统命令)
echo 1 > /proc/sys/vm/overcommit_memory

overcommit_memory解释:
vm.overcommit_memory 表示内核在分配内存时候做检查的方式。这个变量可以取到0,1,2三个值。对取不同的值时的处理方式都定义在内核源码 mm/mmap.c 的 __vm_enough_memory 函数中。
取 1 的时候: 此时宏为 OVERCOMMIT_ALWAYS,函数直接 return 0,分配成功。
取 2 的时候: 此时宏为 OVERCOMMIT_NEVER,内核计算:内存总量×vm.overcommit_ratio/100+SWAP 的总量,如果申请空间超过此数值,则分配失败。vm.overcommit_ratio 的默认值为50。
取 0 的时候: 此时宏为 OVERCOMMIT_GUESS,内核计算:NR_FILE_PAGES 总量+SWAP总量+slab中可以释放的内存总量,如果申请空间超过此数值,则将此数值与空闲内存总量减掉 totalreserve_pages(?) 的总量相加。
如果申请空间依然超过此数值,则分配失败。
以上为粗略描述,在实际计算时,如果非root进程,则在计算时候会保留3%的空间,而root进程则没有该限制。详细过程可看源码。

原创粉丝点击