在默认情况下,Redis是开启磁盘备份功能的。并且当磁盘备份发生故障以后会暂停写入操作。因此,当Redis配合MySQL等关系型数据库作为高速缓存服务器使用是,我们可以完全禁用磁盘备份功能。如果没有其他持久层的支持,那么磁盘备份功能就必不可少,除非里面的数据没有保存的必要(可能性不大)。本案例中就出现由于磁盘空间不足,导致Redis服务磁盘备份失败,自动暂停了写入操作,所有连接Redis服务器进行写操作失败。
首先,我们看一下出现这种情况时,客户端出现的报错信息:
redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on 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服务器中查看Redis的日志,会发现类型错误信息:
1 changes in 900 seconds. Saving…
Background saving started by pid 3639
Write error saving DB on disk: No space left on device
Background saving error
解决方案
大致思路是想办法腾出空间,使Redis能够做一次备份操作后关闭Redis服务器,为磁盘扩容或者挂载新磁盘。由于磁盘已经没有空间,Redis暂时无法完成最后一次写操作。当前情况下,可以选择先备份旧的Redis数据镜像文件,
- 方法1:移动旧的Redis数据镜像文件到其他分区/磁盘。
- 方法2:如果本机器完全没有磁盘空间,可以挂在一个新的磁盘,或者scp到同网络的其他服务器上。
然后删除本磁盘的旧镜像数据。这样我们就腾出了空间给Redis做一次写操作。并使用以下命令关闭Redis服务器:
./src/redis-cli -a password shutdown
或者登陆以后运行关闭命令:
./src/redis-cli AUTH PASSWORD shutdown save
磁盘扩容
由于使用的是云服务器,因此可以按照本文《Linux云硬盘扩容并保留原有数据》操作。但是需要注意的是,首先要卸载分区。但是如果在/etc/fstab
中设置了自动挂载,就需要先注释掉自动挂载并重启服务器,否则无法后续的操作。
最后,使用以下命令重启Redis服务器:
nohup ./src/redis-server ./redis.conf 2>&1 &
如果需要查看当前的Redis是否连接正常,可以使用以下命令查看连接情况:
netstat -tun | grep 6379 | awk '{print $5}' | awk -F':' '{print $1}' | sort | uniq -c
扫码联系船长