我想要实现的是有一个/etc/init.d脚本,它可以更可靠地启动Mongodb,即使它发生故障 - 它应该尝试进行自动修复,以防系统处于锁定状态。在生产中重新启动/自动修复Mongodb
是的,我可以自己编写这个脚本,但我认为有人在那里肯定已经做到了。
我注意到,在服务器出现故障后,Mongodb处于不通过/etc/init.d/mongod脚本重启的状态。很明显,锁文件需要被删除,并且需要先使用--repair选项启动,并且在成功重启之前首先更正--dbpath。在某些情况下,还需要将db文件的所有权更改为运行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
感谢您的详细解答。日记看起来像是要走的路。他们在哪个版本中引入了日记功能? – Tilo
日志记录是在1.8+版本中引入的,只需在配置文件中设置“journal = true”即可。在2.0+日志记录默认情况下处于活动状态。请注意,日记不是“免费的”。它不适用于32位,它将使用额外的RAM,额外的磁盘空间和额外的IO。如果你做了很多就地更新(如计数器),这可能很重要。因此,在盲目推进生产之前,请测试日志模式。 –
很好的回答!虽然它不是一个真正的脚本:)日记可能会诀窍。 32位对我来说不是问题。我会尝试日记!谢谢你的帮助! – Tilo