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 命令!