1. 程式人生 > 其它 >Mongodb:ERROR: child process failed, exited with 1

Mongodb:ERROR: child process failed, exited with 1

技術標籤:mongodbmongodblinux

mongoDB無法啟動的問題

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

問題復現過程:

安裝完畢後,使用systemctl命令啟動

[[email protected] yum.repos.d]# ls /var/lib/mongo/
[[email protected] yum.repos.d]# systemctl start mongod.service
[[email protected] 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。
關閉服務

[[email protected] yum.repos.d]# systemctl stop mongod.service

以上的操作不會造成任何問題,但是當我以mongod命令的方式啟動服務,再關閉服務後,使用systemctl命令的方式啟動,就會無法啟動。
mongod命令啟動

[[email protected] 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

關閉服務

[[email protected] 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
[
[email protected] yum.repos.d]# kill 1489

使用systemctl啟動

[[email protected] 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.
[[email protected] 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.

發現啟動不了了,檢視日誌也沒有明確說是哪裡的問題。
檢查資料目錄

[[email protected] 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命令啟動不了服務。
修改屬主屬組

[[email protected] yum.repos.d]# chown -R mongod.mongod /var/lib/mongo/

再次啟動

[[email protected] yum.repos.d]# systemctl start mongod
[[email protected] 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啟動失敗的解決方法還可以參考這裡。