mongodb磁盘满故障

  • 时间:
  • 来源:互联网
  • 文章标签:

cat /var/log/mongodb/mongodb.log

关键的错误日志:
ERROR: Insufficient free space for journal files
Please make at least 3379MB available in /var/lib/mongodb/journal or use --smallfiles
exception in initAndListen: 15926 Insufficient free space for journals, terminating

查了一下 ERROR: Insufficient free space for journal files 原因是因为 mongo 的 journa 目录下空间小于3379MB。
journal 至少以2G的数量进行增长,当磁盘空间不足时,就会报该错误。

看了一下磁盘占用满了:
df -h
/dev/sda1        91G   83G  2.8G  97% /

首先按照错误日志中解决的办法是使用 --smallfiles参数,尝试启动数据库服务。
--smallfiles 选项会减少数据文件的初始大小,并将最大大小限制为512MB。 smallfiles也会将每个日志文件的大小从1GB减少到128MB。
如果你有大量的数据库,每个数据库都包含少量的数据,那么建议使用--smallfiles 选项。
smallfiles选项可以引导mongod实例创建大量文件,这会影响较大数据库的性能,实际使用时慎重选择。

在mongodb.service启动参数中加 --smallfiles 参数
vim /lib/systemd/system/mongodb.service
ExecStart=/usr/bin/mongod --unixSocketPrefix=${SOCKETPATH} --config ${CONF} $DAEMON_OPTS   --smallfiles 

修改服务配置文件后,重新加载一下服务配置文件
systemctl daemon-reload

重新启动mongodb服务,启动成功
service mongodb start

虽然启动成功了,但磁盘占用仍然还是很高,继续尝试解决根本的磁盘占用高的问题。

mognodb删除数据后不会释放占用的磁盘空间给操作系统,即使 drop collection 也不行,除非drop database。

mongo 命令行插卡mongodb的磁盘空间使用情况:
方法1)
mongo> db.serverStatus().mem
{
        "bits" : 64,
        "resident" : 111,
        "virtual" : 165555,
        "supported" : true,
        "mapped" : 82666,
        "mappedWithJournal" : 165332
}

方法2)
root@myubuntu:~# mongostat
connected to: 127.0.0.1
insert  query update delete getmore command flushes mapped  vsize    res faults  locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 
    *0     *0     *0     *0       0     1|0       0  80.7g   162g   111m      0  test:0.0%          0       0|0     0|0    62b     3k     1   20:56:29 
    *0     *0     *0     *0       0     1|0       0  80.7g   162g   111m      0  test:0.0%          0       0|0     0|0    62b     3k     1   20:56:30 
    *0     *0     *0     *0       0     1|0       0  80.7g   162g   111m      0  test:0.0%          0       0|0     0|0    62b     3k     1   20:56:31 
    
参数:
mapped:映射到内存的数据大小,大小等同于数据库文件的大小
visze:占用的虚拟内存大小
res:占用的物理内存大小

查看数据库文件路径:
# du -sh /var/lib/mongodb/
81G     /var/lib/mongodb/


删除数据以后,dbshell 中用命令 db.serverStatus().mem 查看磁盘空间占用显示已释放,但并不会释放给操作系统。
官方介绍说用:dbshell 进入删除了数据的 db 后,执行 db.repairDatabase() 是唯一可以回收硬盘空间的方法。但是要注意风险:
1.在生产上操作如果意外停止可能会造成数据无法恢复的危险。
2.如果磁盘空间不足,小于现在这个db时间占有的空间,这种情况是用不了 db.repairDatabase() 的。

经过测试,db.repairDatabase() 能否执行成功,主要处决于:释放出来的磁盘空间小于释放执行前当前OS剩余的磁盘空间,则能释放成功,否则释放失败。
所以,执行前查看当前系统剩余磁盘空间较少时,失败的概率就比较大。

继续寻找其他方案。

本文链接http://www.taodudu.cc/news/show-82988.html