我想要实现的是拥有一个/etc/init.d脚本,它可以更可靠地启动Mongodb,即使它崩溃了 - 它应该在系统处于锁定状态时尝试自动修复。
是的,我可以自己编写脚本,但我认为那里的人肯定已经这样做了。
我注意到在服务器出现故障后,Mongodb处于不通过/etc/init.d/mongod脚本重启的状态。显然需要删除锁定文件,并且需要首先使用--repair选项启动并更正--dbpath,然后才能成功重新启动。在某些情况下,还需要将db-files的所有权更改为运行mongodb的用户。另一个问题是标准的/etc/init.d/mongod脚本在这种情况下没有报告失败,而是以“OK”状态快速且错误地返回,报告Mongod已经启动,尽管它没有。 / p>
$ 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
答案 0 :(得分:5)
所以首先要提到的是日记。日记实际上被称为“快速修复”。默认情况下,日记功能在2.0+开启,默认情况下它将执行“修复”。
因此,如果您的磁盘可以处理日记的额外写入吞吐量,这可以解决您的问题。
有关为什么尝试自动修复mongodb可能是一个坏主意的任何意见?
自动修复MongoDB的第一个问题只是时间问题。
如果您有200GB的数据库,系统在修复时需要执行以下操作:
200GB read
)200GB write
)200GB reads + large number of writes
)如果你看一下我的笔记,那就是大量的驱动器在进行维修时会发生冲突。
但是大多数生产安装都在运行副本集。在这种情况下,您可以从备份中恢复,而不是修复。从备份中恢复只会将数据写入一次,这是您应该已经存在的过程。
尽管init.d
脚本返回OK
,但系统监控应告诉您数据库未启动。
答案 1 :(得分:1)
只是想指出日记 在32位版本中工作。但是,它默认情况下不会以32位开启。