曹工改bug:centos下,mongodb開機不能自啓動,systemctl、rc.local都試了,仍是不行,要不要放棄?

問題背景

最近裝個centos 7.6的環境,其中,基礎環境包括,redis、nginx、mongodb、fastdfs、mysql等,其中,自啓動使用的是systemctl,其餘幾個組件,都沒啥問題,惟獨,這個mongodb,是死活啓動不了。html

可是,我這裏說的,不是啓動不了,若是直接在shell裏敲:java

systemctl start  mongod.service

是沒啥問題的,是能夠啓動的。mysql

mongod.service大體以下,各文件夾的權限也已經仔細檢查過,應該是沒毛病:nginx

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb
ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target

後邊換成了rc.local方式:redis

/etc/rc.d/rc.local  

#!/bin/bash
/usr/bin/mongod --fork -f /etc/mongod.conf &

可是,依然不行。sql

這兩天,同事也在斷斷續續在弄,你們手裏有其餘事,這塊暫時放下了。mongodb

起色:strace命令

我通常瀏覽器開的tab比較多,有個幾天前的tab,是關於strace的,我當時主要是想:找一個命令,能夠監控某個進程的網絡請求。shell

原本能夠用tcpdump,可是,這個不是針對某個進程的,只能經過端口過濾,通常狀況下,用端口過濾也足夠了,可是,老是以爲不爽。ubuntu

而後找到了這個連接:centos

https://askubuntu.com/questions/11709/how-can-i-capture-network-traffic-of-a-single-process

裏面提到了strace能夠作到。試了下,確實完美解決了個人問題。

好比說,我能夠attach到某個進程,而後調用進程的某個接口,讓該進程調用某個微服務,而後看看咱們能不能抓到:

(看不清可在單獨tab查看,這個是java應用,向註冊中心eureka發送的心跳,能夠發現,完美抓到了)

strace的使用

可參考個人這篇簡單介紹:

Linux下,如何監控某個進程到底向哪一個地址發起了網絡調用

你們也能夠直接在服務器上直接執行如下shell,查看幫助文檔:

yum install strace
man strace

其主要支持兩種方式,一種是直接使用strace來包裝某個命令,使用strace來啓動該命令;另外一種,就是上面說的,attach到某個已經在運行中的進程。

而後,我想到,既然strace能夠監控系統調用,那麼,監控下mongodb吧,這裏能夠用strace來包裝命令,我試着把命令換成了以下的樣子:

strace -tt -s 10000 -o  mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf

這塊命令,分兩塊看。

strace -tt -s 10000  -o  mongo.txt

這部分是strace的參數,

-tt 打印時間

-s 設置字符串的長度,不然具體內容顯示不出來

-o 將結果輸出到文件

另外部分,就是mongo的命令了:

/usr/bin/mongod --fork  /etc/mongod.conf

比較正常狀況下,和異常狀況下的strace輸出日誌

在同事建議下,咱們先直接在shell中執行了如下命令:

strace -tt -s 10000  -o  mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf

而後,獲得了mongo.txt。這個是正常的文件。

而後,咱們reboot了服務器,而後不清楚文件生成到哪裏了,直接find查找了一把,而後找到後,把這兩個文件,都存到了pc上,用beyond compare進行對比。

下面是對比結果:

建議大圖查看。

能夠發現,有問題的文件裏,在打開如下文件時,報了錯,提示沒有權限:

/sys/fs/cgroup/memory/memory.limit_in_bytes   EACCES (Permission denied)

而後,咱們只是知道了,有這個現象,但不知道爲啥,而後就開始了一頓漫無邊際的面向搜索引擎找問題。找了半天,沒啥收穫。

後邊咱們就決定再去看看官網,看看官網有沒有說,怎麼纔是正統的服務自啓動方式(已經快放棄了。。。)

柳暗花明

結果在官網的以下連接:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/#install-mongodb-community-edition

看到以下一段話,說SELinux,默認不讓mongo訪問/sys/fs/cgroup:

而後我一看,這個目錄有點熟悉啊,上面報沒有權限的文件,不就這個目錄下嗎?

/sys/fs/cgroup/memory/memory.limit_in_bytes   EACCES (Permission denied)

知道緣由就好說了,原來是SELinux,咱們這邊比較暴力,直接把這個關閉了。

關閉方式:http://www.javashuo.com/article/p-vnqrmbin-eh.html

總結

在華爲的時候,組裏的大佬們有一句話:辦法總比困難多。

那時感受,這也太雞湯了。。。

我如今也有這個感受,每次在快要放棄時,問題結果被解決了,有點意思。

另一個感悟:方法比結果重要