Mongodb:ERROR: child process failed, exited with 1

mongoDB无法启动的问题

安装方式:配置yum源,使用yum安装

问题复现过程:

安装完毕后,使用systemctl命令启动

[root@node-1 yum.repos.d]# ls /var/lib/mongo/
[root@node-1 yum.repos.d]# systemctl start mongod.service
[root@node-1 yum.repos.d]# ll /var/lib/mongo/
total 64
-rw------- 1 mongod mongod 4096 Dec  7 14:44 collection-0-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec  7 14:44 collection-2-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec  7 14:44 collection-4-4384179953892643704.wt
drwx------ 2 mongod mongod   71 Dec  7 14:44 diagnostic.data
-rw------- 1 mongod mongod 4096 Dec  7 14:44 index-1-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec  7 14:44 index-3-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec  7 14:44 index-5-4384179953892643704.wt
-rw------- 1 mongod mongod 4096 Dec  7 14:44 index-6-4384179953892643704.wt
drwx------ 2 mongod mongod  110 Dec  7 14:44 journal
-rw------- 1 mongod mongod 4096 Dec  7 14:44 _mdb_catalog.wt
-rw------- 1 mongod mongod    5 Dec  7 14:44 mongod.lock
-rw------- 1 mongod mongod 4096 Dec  7 14:44 sizeStorer.wt
-rw------- 1 mongod mongod  114 Dec  7 14:44 storage.bson
-rw------- 1 mongod mongod   47 Dec  7 14:44 WiredTiger
-rw------- 1 mongod mongod 4096 Dec  7 14:44 WiredTigerHS.wt
-rw------- 1 mongod mongod   21 Dec  7 14:44 WiredTiger.lock
-rw------- 1 mongod mongod  963 Dec  7 14:44 WiredTiger.turtle
-rw------- 1 mongod mongod 4096 Dec  7 14:44 WiredTiger.wt

以上的操作是完全没有问题的,检查了数据目录,发现是服务成功启动后才会有相应的数据,类似于mysql的数据初始化。注意:数据目录的每一个文件的属主属组都是mongod。
关闭服务

[root@node-1 yum.repos.d]# systemctl stop mongod.service

以上的操作不会造成任何问题,但是当我以mongod命令的方式启动服务,再关闭服务后,使用systemctl命令的方式启动,就会无法启动。
mongod命令启动

[root@node-1 yum.repos.d]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1489
child process started successfully, parent exiting

关闭服务

[root@node-1 yum.repos.d]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      890/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      974/master
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      1489/mongod
tcp6       0      0 :::22                   :::*                    LISTEN      890/sshd
tcp6       0      0 ::1:25                  :::*                    LISTEN      974/master
[root@node-1 yum.repos.d]# kill 1489

使用systemctl启动

[root@node-1 yum.repos.d]# systemctl start mongod.service
Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.
[root@node-1 yum.repos.d]# vim /var/log/messages
Dec  7 14:51:06 node-1 systemd: Starting MongoDB Database Server...
Dec  7 14:51:06 node-1 mongod: about to fork child process, waiting until server is ready for connections.
Dec  7 14:51:06 node-1 mongod: forked process: 1822
Dec  7 14:51:06 node-1 mongod: ERROR: child process failed, exited with 1
Dec  7 14:51:06 node-1 mongod: To see additional information in this output, start without the "--fork" option.
Dec  7 14:51:06 node-1 systemd: mongod.service: control process exited, code=exited status=1
Dec  7 14:51:06 node-1 systemd: Failed to start MongoDB Database Server.
Dec  7 14:51:06 node-1 systemd: Unit mongod.service entered failed state.
Dec  7 14:51:06 node-1 systemd: mongod.service failed.

发现启动不了了,查看日志也没有明确说是哪里的问题。
检查数据目录

[root@node-1 yum.repos.d]# ll /var/lib/mongo/
total 280
-rw------- 1 mongod mongod 32768 Dec  7 14:50 collection-0-4384179953892643704.wt
-rw------- 1 mongod mongod 36864 Dec  7 14:50 collection-2-4384179953892643704.wt
-rw------- 1 mongod mongod  4096 Dec  7 14:44 collection-4-4384179953892643704.wt
drwx------ 2 mongod mongod   216 Dec  7 14:50 diagnostic.data
-rw------- 1 mongod mongod 32768 Dec  7 14:50 index-1-4384179953892643704.wt
-rw------- 1 mongod mongod 36864 Dec  7 14:50 index-3-4384179953892643704.wt
-rw------- 1 mongod mongod  4096 Dec  7 14:44 index-5-4384179953892643704.wt
-rw------- 1 mongod mongod  4096 Dec  7 14:50 index-6-4384179953892643704.wt
drwx------ 2 mongod mongod   110 Dec  7 14:50 journal
-rw------- 1 mongod mongod 32768 Dec  7 14:50 _mdb_catalog.wt
-rw------- 1 mongod mongod     0 Dec  7 14:50 mongod.lock
-rw------- 1 mongod mongod 36864 Dec  7 14:50 sizeStorer.wt
-rw------- 1 mongod mongod   114 Dec  7 14:44 storage.bson
-rw------- 1 mongod mongod    47 Dec  7 14:44 WiredTiger
-rw------- 1 mongod mongod  4096 Dec  7 14:50 WiredTigerHS.wt
-rw------- 1 mongod mongod    21 Dec  7 14:44 WiredTiger.lock
-rw------- 1 root   root    1247 Dec  7 14:50 WiredTiger.turtle
-rw------- 1 mongod mongod 45056 Dec  7 14:50 WiredTiger.wt

发现有一个文件的属主属组变成了root,很有可能就是因为无法读取这个文件导致使用systemctl命令启动不了服务。
修改属主属组

[root@node-1 yum.repos.d]# chown -R mongod.mongod /var/lib/mongo/

再次启动

[root@node-1 yum.repos.d]# systemctl start mongod
[root@node-1 yum.repos.d]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      890/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      974/master
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      1679/mongod
tcp6       0      0 :::22                   :::*                    LISTEN      890/sshd
tcp6       0      0 ::1:25

原因分析

首先,在使用mongoDB的过程中,尽量不要使用kill命令去操作,要以正常的方式结束mongodb的进程,否则大概率会出现无法启动服务的问题。
其次,出现上述的问题,并不是kill导致的问题,而是启动服务身份发生改变的问题。使用mongod命令启动服务,由于当前我是root用户,所以启动过程中所创建的文件的属主属组都会是root,当我使用systemctl命令启动时,由于mongod.service文件指定了启动服务的用户,所以将会变成mongod用户来启动服务,此时就会无法打开数据目录的那个文件,造成服务无法启动。但其实此时再次用mongod去启动服务,他是可以起来的,因为是以root的用户的身份去启动的。问题就在这。
最后,虽然这次只是因为身份问题导致了服务起不来,但是还是要提醒,生产环境谨慎使用 kill 命令!

有关mongodb启动失败的解决方法还可以参考这里。

猜你喜欢

转载自blog.csdn.net/rookie23rook/article/details/110818783