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

三國夢迴發表於2020-06-16

問題背景

最近裝個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的使用

可參考我的這篇簡單介紹:

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,我們這邊比較暴力,直接把這個關閉了。

關閉方式:https://www.cnblogs.com/activiti/p/7552677.html

總結

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

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

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

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

相關文章