Redis踩坑 -- 快照不能持久化

错误

错误提示:MISCONF Redis is configured to save RDB snapshots, but it’s currently unable to persist to 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 直接崩掉,也无法通过 shutdown 命令来关闭,只能通过查看进程号,用 kill 命令来杀死进程。

这是由于强制关闭 Redis 快照导致不能持久化造成的错误。网上大多数都解决方案都是清一色的运行 config set stop-writes-on-bgsave-error no 命令,关闭配置项 stop-writes-on-bgsave-error 来解决问题。

但是这么做不能实质解决问题,将该配置项关闭代表着只是让 redis 忽略了这个异常,让程序继续往下运行,但是依然没有持久化,快照依然没有保存到磁盘上。

那么为什么会造成这种原因呢?

原因可能 1

最简单的一种可能,查看自己保存路径下的文件有没有权限!!!!!!
举个例子,如果你在配置文件中设置了 dir,自己指定了一个快照的保存路径,请注意,这个保存路径下的文件夹,你当前登陆用户有没有写(x)权限。如果没有,用以下命令去修改你存放快照文件夹的权限!

sudo chmod -R 777 你的指定目录

改完权限就可以正常持久化了,也就不会报错了。

原因可能 2

redis 的日志中可以看到:

“WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.”(警告:过量使用内存设置为 0!在低内存环境下,后台保存可能失败。为了修正这个问题,请在/etc/sysctl.conf 添加一项 ‘vm.overcommit_memory = 1’ ,然后重启(或者运行命令’sysctl vm.overcommit_memory=1’ )使其生效。)

意思是系统内存不足,试着修改vm.overcommit_memory=1后问题就解决了。

但是内存是够的呀,为什么 Redis 会认为内存不足呢?这是因为 Redis 保存数据的硬盘的时候需要 fork 一份主进程,然后在 Fork 进程内完成数据保存到硬盘的操作,如果主进程使用了 4GB 的内存,Fork 子进程的时候需要额外的 4GB,此时内存就不够了,Fork 失败,进而数据保存硬盘也失败了。

vm.overcommit_memory 改为 1 的作用:

0 — 默认设置。当应用进程尝试申请内存时,内核会做一个检测。内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。举个例子,比如 1G 的机器,A 进程已经使用了 500M,当有另外进程尝试 malloc 500M 的内存时,内核就会进行 check,发现超出剩余可用内存,就会提示失败。

1 — 对于内存的申请请求,内核不会做任何 check,直到物理内存用完,触发 OOM 杀用户态进程。同样是上面的例子,1G 的机器,A 进程 500M,B 进程尝试 malloc 500M,会成功,但是一旦 kernel 发现内存使用率接近 1 个 G(内核有策略),就触发 OOM,杀掉一些用户态的进程(有策略的杀)。

2 — 当 请求申请的内存 >= SWAP 内存大小 + 物理内存 * N,则拒绝此次内存申请。解释下这个 N:N 是一个百分比,根据 overcommit_ratio/100 来确定,比如 overcommit_ratio=50,那么 N 就是 50%。

信息来源

https://blog.csdn.net/weixin_41866960/article/details/89608666
https://www.cnblogs.com/qq78292959/p/3994349.html

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叁柚木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值