問題背景
最近裝個centos 7.6的環境,其中,基礎環境包括,redis、nginx、mongodb、fastdfs、mysql等,其中,自啟動使用的是systemctl,其他幾個元件,都沒啥問題,唯獨,這個mongodb,是死活啟動不了。
但是,我這裡說的,不是啟動不了,如果直接在shell裡敲:
systemctl start mongod.service
是沒啥問題的,是可以啟動的。
mongod.service大致如下,各資料夾的許可權也已經仔細檢查過,應該是沒毛病:
[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方式:
/etc/rc.d/rc.local
#!/bin/bash
/usr/bin/mongod --fork -f /etc/mongod.conf &
但是,依然不行。
這兩天,同事也在斷斷續續在弄,大家手裡有其他事,這塊暫時放下了。
轉機:strace命令
我一般瀏覽器開的tab比較多,有個幾天前的tab,是關於strace的,我當時主要是想:找一個命令,可以監控某個程式的網路請求。
本來可以用tcpdump,但是,這個不是針對某個程式的,只能通過埠過濾,一般情況下,用埠過濾也足夠了,但是,總是覺得不爽。
然後找到了這個連結:
https://askubuntu.com/questions/11709/how-can-i-capture-network-traffic-of-a-single-process
裡面提到了strace可以做到。試了下,確實完美解決了我的問題。
比如說,我可以attach到某個程式,然後呼叫程式的某個介面,讓該程式呼叫某個微服務,然後看看我們能不能抓到:
(看不清可在單獨tab檢視,這個是java應用,向註冊中心eureka傳送的心跳,可以發現,完美抓到了)
strace的使用
可參考我的這篇簡單介紹:
大家也可以直接在伺服器上直接執行以下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)
然後,我們只是知道了,有這個現象,但不知道為啥,然後就開始了一頓漫無邊際的面向搜尋引擎找問題。找了半天,沒啥收穫。
後邊我們就決定再去看看官網,看看官網有沒有說,怎麼才是正統的服務自啟動方式(已經快放棄了。。。)
柳暗花明
結果在官網的如下連結:
看到如下一段話,說SELinux,預設不讓mongo訪問/sys/fs/cgroup:
然後我一看,這個目錄有點熟悉啊,上面報沒有許可權的檔案,不就這個目錄下嗎?
/sys/fs/cgroup/memory/memory.limit_in_bytes EACCES (Permission denied)
知道原因就好說了,原來是SELinux,我們這邊比較暴力,直接把這個關閉了。
關閉方式:https://www.cnblogs.com/activiti/p/7552677.html
總結
在華為的時候,組裡的大佬們有一句話:辦法總比困難多。
那時感覺,這也太雞湯了。。。
我現在也有這個感覺,每次在快要放棄時,問題結果被解決了,有點意思。
另外一個感悟:方法比結果重要