1、问题描述:
用浏览器打开网站 https://www.test.org 提示: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.,具体报错如下:
2、环境:
centos环境:
[root@test1 redis]# cat /etc/redhat-release
CentOS> [root@test1 redis]#
redis版本:
[root@test1 redis]# redis-server -v
Redis server v=3.0.2 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=76b21ee90041b162
[root@test1 redis]# redis-server --version
Redis server v=3.0.2 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=76b21ee90041b162
Redis属于源码安装的:
[root@test1 ~]# cd /usr/local/redis/
[root@test1 redis]# tree
.
├── bin
│ ├── redis-benchmark
│ ├── redis-check-aof
│ ├── redis-check-dump
│ ├── redis-cli
│ ├── redis-sentinel -> redis-server
│ └── redis-server
├── conf
│ └── redis.conf
├── data
│ └── dump.rdb
└── logs
└── redis.log
3、解决方法
方法1:操作无效
有两种修改方法,一种是通过redis命令行修改,另一种是直接修改redis.conf配置文件
命令行修改方式示例:
[root@test1 redis]# redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
修改redis.conf文件:vi打开redis-server配置的redis.conf文件,然后使用快捷匹配模式:/stop-writes-on-bgsave-error定位到stop-writes-on-bgsave-error字符串所在位置,接着把后面的yes设置为no即可。
方法2:此方法无效,因为此机器已经设置过了。
[root@test1 /]# cat /etc/sysctl.conf|grep vm.overcommit_memory
vm.overcommit_memory = 1
Redis "MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"问题
今天在程序中,jedis put数据到redis过程中,“MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk”报错;
再查看Redis日志,看到有这样的错误提示“Can’t save in background: fork: Cannot allocate memory”,这个提示很明显"Fork进程时内存不够用了!",但内存明明还有一个多G;
经网上查询,Redis在保存数据到硬盘时为了避免主进程假死,需要Fork一份主进程,然后在Fork进程内完成数据保存到硬盘的操作,如果主进程使用了4GB的内存,Fork子进程的时候需要额外的4GB,此时内存就不够了,Fork失败,进而数据保存硬盘也失败了。
解决方法:
很简单,按提示的操作(将vm.overcommit_memory 设为1)即可:
有三种方式修改内核参数,但要有root权限:
(1)编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 使配置文件生效
(2)sysctl vm.overcommit_memory=1
(3)echo 1 > /proc/sys/vm/overcommit_memory
方法3:重启redis服务 操作无效
由于是通过源码安装的redis的,此时需要通过redis客户端程序redis-cli的shutdown命令来重启redis
[root@test1 redis]# redis-cli -h 127.0.0.1 -p 6379 shutdown
(error) NOAUTH Authentication required.
此时只能kill命令关闭redis进程了
[root@test1 redis]# ps -ef|grep redis
root 36219 1 0 11:19 ? 00:00:05 ./bin/redis-server :6379
root 40410 39701 0 14:19 pts/7 00:00:00 grep redis
[root@test1 redis]# kill 36129
kill 进程号无法关闭redis进程
[root@test1 redis]# ps -ef|grep redis
root 36219 1 0 11:19 ? 00:00:05 ./bin/redis-server :6379
root 40410 39701 0 14:19 pts/7 00:00:00 grep redis
用kill -9 +进程号 强制关闭redis进程才可以强制关闭redis进程
[root@test1 redis]# kill -9 36129
[root@test1 redis]# ps -ef|grep redis
root 40410 39701 0 14:19 pts/7 00:00:00 grep redis
redis进程关闭了,然后再指定配置文件,开启redis服务
[root@test1 redis]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
[root@test1 redis]# ps -ef|grep redis
root 36219 1 0 11:19 ? 00:00:05 /usr/local/redis/bin/redis-server *:6379
root 40410 39701 0 14:19 pts/7 00:00:00 grep redis
这时再打开网站 https://www.test.org 可以正常打开网站,但是不到1分钟网站报错依旧。
方法4:查看redis日志
直接用tail -30 redis.log 查看redis.log最后30行的日志
[root@test1 logs]# cd /usr/local/redis/logs
[root@test1 logs]# tail -30 redis.log
2654:M 28 Apr 09:57:58.036 Background saving started by pid 33756
33756:C 28 Apr 09:57:58.037 # Write error saving DB on disk: No space left on device
2654:M 28 Apr 09:57:58.136 # Background saving error
2654:M 28 Apr 09:58:04.047 10 changes in 300 seconds. Saving...
2654:M 28 Apr 09:58:04.047 Background saving started by pid 33757
33757:C 28 Apr 09:58:04.049 # Write error saving DB on disk: No space left on device
2654:M 28 Apr 09:58:04.148 # Background saving error
2654:M 28 Apr 09:58:10.056 10 changes in 300 seconds. Saving...
2654:M 28 Apr 09:58:10.057 Background saving started by pid 33758
33758:C 28 Apr 09:58:10.058 # Write error saving DB on disk: No space left on device
2654:M 28 Apr 09:58:10.157 # Background saving error
2654:M 28 Apr 09:58:16.067 10 changes in 300 seconds. Saving...
2654:M 28 Apr 09:58:16.068 Background saving started by pid 33771
33771:C 28 Apr 09:58:16.069 # Write error saving DB on disk: No space left on device
2654:M 28 Apr 09:58:16.168 # Background saving error
2654:M 28 Apr 09:58:22.078 10 changes in 300 seconds. Saving...
2654:M 28 Apr 09:58:22.079 * Background saving started by pid 33773
33773:C 28 Apr 09:58:22.080 # Write error saving DB on disk: No space left on device
2654:M 28 Apr 09:58:22.179 # Background saving error
发现此是日志:Write error saving DB on disk: No space left on device,磁盘空间不足了
查看inode使用情况:发现inode没有使用完
[root@test1 logs]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)%% 挂载点
/dev/mapper/vg_yyd-lv_root
512064 122336 389728 24% /
tmpfs 489644 4 489640 1% /dev/shm
/dev/sda1 128016 38 127978 1% /boot
/dev/mapper/vg_yyd-lv_home
640848 19358 621490 4% /home
/dev/sdb1 6553600 138928 6414672 3% /data
[root@test1 logs]# df -hT
文件系统 类型 容量 已用 可用 已用%% 挂载点
/dev/mapper/vg_yyd-lv_root
ext4 7.7G 5.5G 1.9G 75% /
tmpfs tmpfs 1.9G 12K 0 100% /dev/shm
/dev/sda1 ext4 485M 40M 420M 9% /boot
/dev/mapper/vg_yyd-lv_home
ext4 9.7G 1.5G 7.8G 16% /home
/dev/sdb1 ext4 99G 15G 80G 16% /data
查看block使用率,发现/根目录磁盘已使用100%了,基本已经确认是这个原因导致的。
[root@test1 redis]# df -hT
文件系统 类型 容量 已用 可用 已用%% 挂载点
/dev/mapper/vg_yyd-lv_root
ext4 7.7G 7.7G 0 100% /
tmpfs tmpfs 1.9G 12K 1.9G 1% /dev/shm
/dev/sda1 ext4 485M 40M 420M 9% /boot
/dev/mapper/vg_yyd-lv_home
ext4 9.7G 1.5G 7.8G 16% /home
/dev/sdb1 ext4 99G 15G 80G 16% /data
-bash: echo: write error: 设备上没有空间
[root@test1 ~]# cd /var/log
[root@test1 log]# du -sh
2.4G .
查看/var/log/目录下最占空间大小的文件,由此可见 /var/log/notification.log占2.3G大小。
[root@test1 log]# du -sh /var/log/|sort -nr #也可以直接用命令du -sh |sort -nr
2.3G /var/log/notification.log
148K /var/log/anaconda.storage.log
128K /var/log/dracut.log-20160101
128K /var/log/cron
124K /var/log/anaconda.syslog
120K /var/log/cron-20180422
116K /var/log/anaconda.xlog
80K /var/log/secure-20180422
80K /var/log/dmesg.old
76K /var/log/dmesg
40K /var/log/rsyncd.log
36K /var/log/salt
36K /var/log/lastlog
36K /var/log/anaconda.program.log
28K /var/log/anaconda.log
清空日志文件notification.log,注意此时一定不要用删除,因为日志文件很可能被服务进程占用,虽然能删除成功,但是进程没有释放此文件,还得重启对应服务释放才行,所以此时最佳方法就是清空日志,而不是删除日志。
[root@test1 log]# >notification.log
[root@test1 log]# df -hT
文件系统 类型 容量 已用 可用 已用%% 挂载点
/dev/mapper/vg_yyd-lv_root
ext4 7.7G 5.5G 1.9G 75% /
tmpfs tmpfs 1.9G 12K 1.9G 1% /dev/shm
/dev/sda1 ext4 485M 40M 420M 9% /boot
/dev/mapper/vg_yyd-lv_home
ext4 9.7G 1.5G 7.8G 16% /home
/dev/sdb1 ext4 99G 15G 80G 16% /data
日志清空后,磁盘已有空间了,此时再打开网站 https://www.test.org 就可以正常打开了。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com