当前位置:  开发笔记 > 编程语言 > 正文

生产中重新启动/自动修复Mongodb

如何解决《生产中重新启动/自动修复Mongodb》经验,为你挑选了1个好方法。

我想要实现的是拥有一个/etc/init.d脚本,它可以更可靠地启动Mongodb,即使它很难用 - 它应该在系统处于锁定状态时尝试自动修复.

是的,我可以自己编写脚本,但我认为那里的人肯定已经这样做了.

我注意到在服务器出现故障后,Mongodb处于不通过/etc/init.d/mongod脚本重启的状态.显然需要删除锁定文件,并且需要首先使用--repair选项启动并更正--dbpath,然后才能成功重新启动.在某些情况下,还需要将db-files的所有权更改为运行mongodb的用户.另外一个问题是标准的/etc/init.d/mongod脚本在这种情况下不会报告失败,而是以"OK"状态快速且错误地返回,报告Mongod已启动,尽管事实并非如此.

$ sudo /etc/init.d/mongod start
Starting mongod: forked process: 9220
all output going to: /data/mongo/log/mongod.log
                                                           [  OK  ]
$ sudo /etc/init.d/mongod status
mongod dead but subsys locked

操作系统是CentOS或Fedora.

有没有人修改过/etc/init.d脚本或指向这种脚本的指针,在这种情况下会自动尝试修复? 还是有另一种工具可以作为Mongod的看门狗吗?

有关为什么试图自动修复mongodb可能是个坏主意的任何意见?

$ sudo /etc/init.d/mongod status
mongod dead but subsys locked

$ sudo ls -l /var/lib/mongo/mongod.lock 
-rw-r--r--. 1 mongod mongod 5 Nov 19 11:52 /var/lib/mongo/mongod.lock


$ sudo tail -50 /data/mongo/log/mongod.log
************** 
old lock file: /data/mongo/db/mongod.lock.  probably means unclean shutdown
recommend removing file and running --repair
see: http://dochub.mongodb.org/core/repair for more information
*************
Sat Nov 19 11:55:44 exception in initAndListen std::exception: old lock file, terminating
Sat Nov 19 11:55:44 dbexit: 

Sat Nov 19 11:55:44 shutdown: going to close listening sockets...
Sat Nov 19 11:55:44 shutdown: going to flush oplog...
Sat Nov 19 11:55:44 shutdown: going to close sockets...
Sat Nov 19 11:55:44 shutdown: waiting for fs preallocator...
Sat Nov 19 11:55:44 shutdown: closing all files...
Sat Nov 19 11:55:44     closeAllFiles() finished

Sat Nov 19 11:55:44 dbexit: really exiting now

Gates VP.. 5

所以首先要提到的是日记.日记实际上被称为"快速修复".默认情况下,日记功能在2.0+中启用,默认情况下它将执行"修复".

因此,如果您的磁盘可以处理额外的日志写入吞吐量,这可能会解决您的问题.

有关为什么试图自动修复mongodb可能是个坏主意的任何意见?

自动修复MongoDB的首要问题只是时间问题之一.

如果您有200GB的数据库,系统在修复时需要执行以下操作:

    分配~200GB的文件(你有驱动器空间吗?)

    将现有文件中的所有数据读入内存(200GB read)

    检查每个文档的有效性并将其写回新文件(200GB write)

    重新创建所有索引(200GB reads + large number of writes)

    将所有内容刷新到磁盘

如果你看看我的笔记,那就是大量的驱动器在进行维修时会发生颠簸.

但是大多数生产安装都在运行副本集.在这种情况下,您可以从备份中恢复,而不是修复.从备份恢复只会将数据写入一次,这是您应该已经存在的过程.

尽管init.d脚本返回OK,但系统监控应告诉您数据库未启动.



1> Gates VP..:

所以首先要提到的是日记.日记实际上被称为"快速修复".默认情况下,日记功能在2.0+中启用,默认情况下它将执行"修复".

因此,如果您的磁盘可以处理额外的日志写入吞吐量,这可能会解决您的问题.

有关为什么试图自动修复mongodb可能是个坏主意的任何意见?

自动修复MongoDB的首要问题只是时间问题之一.

如果您有200GB的数据库,系统在修复时需要执行以下操作:

    分配~200GB的文件(你有驱动器空间吗?)

    将现有文件中的所有数据读入内存(200GB read)

    检查每个文档的有效性并将其写回新文件(200GB write)

    重新创建所有索引(200GB reads + large number of writes)

    将所有内容刷新到磁盘

如果你看看我的笔记,那就是大量的驱动器在进行维修时会发生颠簸.

但是大多数生产安装都在运行副本集.在这种情况下,您可以从备份中恢复,而不是修复.从备份恢复只会将数据写入一次,这是您应该已经存在的过程.

尽管init.d脚本返回OK,但系统监控应告诉您数据库未启动.


日志在1.8+中引入,只需在配置文件中设置`journal = true`即可.默认情况下,2.0 +日记功能处于活动状态.请注意,日记不是"免费".它不适用于32位,它将使用额外的RAM,额外的磁盘空间和额外的IO.如果你做了很多就地更新(比如计数器),这可能很重要.因此,在盲目推向生产之前测试日记模式.
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有