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

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

# 問題背景 最近裝個centos 7.6的環境,其中,基礎環境包括,redis、nginx、mongodb、fastdfs、mysql等,其中,自啟動使用的是systemctl,其他幾個元件,都沒啥問題,唯獨,這個mongodb,是死活啟動不了。 但是,我這裡說的,不是啟動不了,如果直接在shell裡敲: ```shell systemctl start mongod.service ``` 是沒啥問題的,是可以啟動的。 mongod.service大致如下,各資料夾的許可權也已經仔細檢查過,應該是沒毛病: ```shell [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方式: ```shell /etc/rc.d/rc.local #!/bin/bash /usr/bin/mongod --fork -f /etc/mongod.conf & ``` 但是,依然不行。 這兩天,同事也在斷斷續續在弄,大家手裡有其他事,這塊暫時放下了。 # 轉機:strace命令 我一般瀏覽器開的tab比較多,有個幾天前的tab,是關於strace的,我當時主要是想:找一個命令,可以監控某個程序的網路請求。 本來可以用tcpdump,但是,這個不是針對某個程序的,只能通過埠過濾,一般情況下,用埠過濾也足夠了,但是,總是覺得不爽。 然後找到了這個連結: 裡面提到了strace可以做到。試了下,確實完美解決了我的問題。 比如說,我可以attach到某個程序,然後呼叫程序的某個介面,讓該程序呼叫某個微服務,然後看看我們能不能抓到: ![](https://img2020.cnblogs.com/blog/519126/202006/519126-20200616171811549-515054780.png) (看不清可在單獨tab檢視,這個是java應用,向註冊中心eureka傳送的心跳,可以發現,完美抓到了) # strace的使用 可參考我的這篇簡單介紹: [Linux下,如何監控某個程序到底向哪個地址發起了網路呼叫](https://www.cnblogs.com/grey-wolf/p/13142165.html) 大家也可以直接在伺服器上直接執行以下shell,檢視幫助文件: ```shell yum install strace man strace ``` 其主要支援兩種方式,一種是直接使用strace來包裝某個命令,使用strace來啟動該命令;另一種,就是上面說的,attach到某個已經在執行中的程序。 然後,我想到,既然strace可以監控系統呼叫,那麼,監控下mongodb吧,這裡可以用strace來包裝命令,我試著把命令換成了如下的樣子: ```shell strace -tt -s 10000 -o mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf ``` 這塊命令,分兩塊看。 ```shell strace -tt -s 10000 -o mongo.txt ``` 這部分是strace的引數, >
-tt 列印時間 > > -s 設定字串的長度,否則具體內容顯示不出來 > > -o 將結果輸出到檔案 另外部分,就是mongo的命令了: ```shell /usr/bin/mongod --fork /etc/mongod.conf ``` ## 比較正常情況下,和異常情況下的strace輸出日誌 在同事建議下,我們先直接在shell中執行了以下命令: ```shell strace -tt -s 10000 -o mongo.txt /usr/bin/mongod --fork -f /etc/mongod.conf ``` 然後,得到了mongo.txt。這個是正常的檔案。 然後,我們reboot了伺服器,然後不清楚檔案生成到哪裡了,直接find查找了一把,然後找到後,把這兩個檔案,都存到了pc上,用beyond compare進行對比。 下面是對比結果: ![](https://img2020.cnblogs.com/blog/519126/202006/519126-20200616172846213-1442574214.png) 建議大圖檢視。 可以發現,有問題的檔案裡,在開啟以下檔案時,報了錯,提示沒有許可權: ```shell /sys/fs/cgroup/memory/memory.limit_in_bytes EACCES (Permission denied) ``` 然後,我們只是知道了,有這個現象,但不知道為啥,然後就開始了一頓漫無邊際的面向搜尋引擎找問題。找了半天,沒啥收穫。 後邊我們就決定再去看看官網,看看官網有沒有說,怎麼才是正統的服務自啟動方式(已經快放棄了。。。) # 柳暗花明 結果在官網的如下連結:
看到如下一段話,說SELinux,預設不讓mongo訪問/sys/fs/cgroup:![](https://img2020.cnblogs.com/blog/519126/202006/519126-20200616173224303-1025681488.png) 然後我一看,這個目錄有點熟悉啊,上面報沒有許可權的檔案,不就這個目錄下嗎? ```shell /sys/fs/cgroup/memory/memory.limit_in_bytes EACCES (Permission denied) ``` 知道原因就好說了,原來是SELinux,我們這邊比較暴力,直接把這個關閉了。 關閉方式: # 總結 在華為的時候,組裡的大佬們有一句話:辦法總比困難多。 那時感覺,這也太雞湯了。。。 我現在也有這個感覺,每次在快要放棄時,問題結果被解決了,有點意思。 另外一個感悟:方法比結