Ubuntu 16.04 (阿里雲ECS),MongoDB 4.0,
原來,已經寫了10篇MongoDB的隨筆了。可是,自己居然沒有使用配置文件啓動過MongoDB,對其更多的配置是不明白的。
昨天(180808)花了一些努力,終於,實現了使用配置文件啓動MongoDB、並且改進了隨機啓動腳本,本文便是對此過程進行的記錄。
注意,安裝方式很關鍵!安裝方式不同,可能會和本文介紹的內容存在差別,請讀者自行判別。本文使用的安裝方式Install MongoDB Community Edition on Ubuntu,其中的Using .deb Packages (Recommended)。
新發現,終於知道自己爲何可以在ECS上率性用上使用配置文件啓動MongoDB了!原來,在其/etc目錄中存在一個mongod.conf文件:
$ ls -l mongod.conf
-rw-r--r-- 1 root root 626 Jun 22 10:19 mongod.conf
本地開發環境和ECS都是使用相同的安裝方式,可是,剛剛檢查本地系統時卻沒有找到/etc/mongod.conf文件,檢查ECS上的mongod.conf的建立時間發現其建立時間爲Jun 22,那個時候俺還沒有購買ECS呢!運氣!哎,總靠運氣學習軟件、開發、編程可不是好事啊!學習,需要的是dig,不斷dig!
舊方式
安裝完畢後,mongod、mongo等命令會出現在/usr/bin中,可以使用whereis命令查看(命令很多,本文僅涉及到其中的mongod、mongo)。
由於安裝後/etc/下沒有配置文件,於是,自己一直使用命令行方式啓動MongoDB服務器。
後來,將MongoDB服務器啓動命令加入到了啓動腳本——簡單粗糙版:
在/etc/init.d/中建立MongoDB服務器的啓動腳本,並手動在/etc/rc3.d/中建立腳本的軟連接(此時根本不知道什麼LBS信息,啓動腳本的編寫規範,直到現在自己也只是知道皮毛)。
下面是舊方式的啓動腳本mongo01:
1 #!/bin/sh 2 3 # START MongoDB 4 # Data Directory: /home/log/ws/mdb/data0725 5 6 # Only can be accessed from localhost/127.0.0.1 7 # Use the default port 27017 8 mongod --dbpath /home/username/ws/mdb/data0725 --logpath /home/username/ws/mdb/data0725/log --logappend --auth --directoryperdb &
前面看過的一篇博文中講,要是啓動腳本中沒有LBS信息的話,可能會導致服務無法啓動。還好,在上面的MongoDB服務啓動時一直是成功的。
注意,末尾添加 空格、&符號。
在代表運行級別3的/etc/rc3.d/目錄中建立啓動腳本的軟連接。
重啓,可以發現MongoDB服務器已經啓動了,如下:
sudo netstat -antp | grep mongod
ps -ef | grep mongod
做完上面的操作後,啓動MongoDB服務器的腳本已經被添加爲Linux服務了。
還可以使用service --status-all查看腳本對應服務的運行狀態:
[ + ] mongo01
中括號中是+號,表示服務已啓動。
從啓動腳本可以看到,數據文件存放於家目錄下的,日誌文件也是存放於其中。
在MongoDB服務器的啓動被添加爲Linux服務後,默認是使用root賬戶啓動的——可以看到ps -ef顯示進程的用戶爲root,這樣的權限太高,需要限制。
而自己之前使用登錄賬號啓動MongoDB時,MongoDB的進程爲登錄賬號。
Linux賬號、進程、進程相關的資源——各種文件(包括文件夾)之間存在什麼關係呢?
最佳實踐是怎樣的?配置文件放哪裏、數據文件放哪裏、日誌文件放哪裏、PID文件放哪裏、其它文件?
之前使用netstat -ano | grep mongod命令時,還可以看到一個/tmp/mongodb-27017.sock文件,這個文件又是做什麼用的呢?
總之,對於舊方式自己還是不太放心的,還需要改進,更專業的改進——把東西放到對的位置、安全的位置。
新方式
介紹在阿里雲ECS上使用部署。
前面說了,在/etc/目錄下發現了一個mongod.conf文件——一個很好的起點,試着用這個文件啓動MongoDB服務,是可以的。
不過,看到Nginx等在/etc/中都有自己的目錄,於是,新建了mongod目錄,並把/etc/中的mongod.conf拷貝了進取,再按照自己的需要改改改。
首先要考慮的是數據庫存放位置,孤選擇了/home/目錄下建立一個mdb目錄,再在裏面建立各種MongoDB數據庫存放文件夾(放在/var/目錄下也可以吧?還是推薦方案?默認是放到/data/目錄下,可是,沒有/data/目錄)。
$ ls -l /home/mdb/
total 4
drwxr-xr-x 7 root root 4096 Aug 8 18:04 data0802
/home/mdb/下的data0802就是孤存放數據庫的目錄了,日誌文件存放在/var/log/mongodb/目錄下,日誌文件名和配置文件名同名——參考了uWSGI服務器的日誌文件命名。
還有PID文件,放到了/run/目錄下,也應該和配置文件同名(不包括擴展名)(/run/目錄下是否也建立一個mongodb目錄呢?)。
因此,有下面幾個文件是需要關注的:
/home/mdb/data0802
/etc/mongod/data0802.conf
/var/log/mongodb/data0802.log
/run/data0802.pid
配置文件如下:
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /home/mdb/data0802 journal: enabled: true directoryPerDB: true # engine: # mmapv1: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/data0802.log # network interfaces net: port: 27017 bindIp: 127.0.0.1 # how the process runs processManagement: fork: true pidFilePath: /run/data0802.pid timeZoneInfo: /usr/share/zoneinfo # set auth? setParameter: enableLocalhostAuthBypass: false security: authorization: enabled #operationProfiling: #replication: #sharding: ## Enterprise-Only Options: #auditLog: #snmp:
在配置隨機啓動前,使用mongod測試下上面的配置文件吧!因爲是在/etc/目錄下,所以,需要添加sudo!
注意,在執行前請確保沒有其它MongoDB服務在運行,或者,不會和配置文件中描述的發生衝突。
$sudo mongod -f /etc/mongod/data0802.conf
注意,上面的配置文件用了絕對路徑。
不出意外,運行成功!
需要注意上面的配置文件中紫色的部分,那是自己在默認的配置文件上後來添加的,因爲啓動時遇到了很多警告或錯誤信息:
directoryPerDB: true
fork: true
security:
authorization: enabled
可以從參考鏈接MongoDB Configuration File Options中找到它們代表的意義。
命令行啓動的參數 和 配置文件中的配置項 有對應關係,是否一一對應,暫不確定,,而且兩者的寫法也不太一樣。
比如,上面配置文件中的authorization:enabled,在命令行中只要寫爲--auth即可。
fork: true表示後臺啓動?其具體意義還需要dig。
不過,仍然堅定支持配置文件方式啓動。對於命令行中的選型對應的配置文件選項, 咱可以去參考的官文鏈接中去 查找——目前來看很easy。
下面,配置隨機啓動MongoDB服務——和舊方式是不同的。
在/etc/init.d/目錄中建立啓動腳本mongodb,如下:
1 #!/bin/bash 2 ### BEGIN INIT INFO 3 # Provides: mongodb 4 # Required-start: $local_fs $remote_fs $network $syslog 5 # Required-Stop: $local_fs $remote_fs $network $syslog 6 # Default-Start: 2 3 4 5 7 # Default-Stop: 0 1 6 8 # Short-Description: starts the mongodb daemon 9 # Description: starts mongodb using start-stop-daemon 10 ### END INIT INFO 11 12 mongod -f /etc/mongod/data0802.conf &
說明,沒有sudo,使用了絕對路徑,命令後面跟着 空格、&符號。
注意,啓動腳本中的LBS信息尚不確定,請大家謹慎使用。
再使用update-rc.d命令安裝此啓動腳本即可,安裝後,Linux服務就多了一項mongodb了!可以使用命令service --status-all查看其狀態。
安裝啓動腳本:
sudo update-rc.d mongodb defaults 10
好了,重啓,重啓後可以看到mongodb服務已經啓動,使用mongo命令也可以連接到MongoDB服務。
如果服務沒有啓動,那一定是出現了故障了!那麼,檢查日誌文件。日誌文件在哪兒?/var/log/mongodb/data0802.log。
參考鏈接
MongoDB Configuration File Options
附錄
1.命令行中使用配置文件啓動時的一些輸出
$ sudo mongod -f data0802.conf
2018-08-08T17:05:27.171+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
about to fork child process, waiting until server is ready for connections.
forked process: 5858
child process started successfully, parent exiting
2.使用mongo鏈接MongoDB服務器的一些輸出,其中的WARNING信息可以 促進 完善配置文件
$ mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
Server has startup warnings:
2018-08-08T17:05:27.184+0800 I STORAGE [initandlisten]
2018-08-08T17:05:27.184+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-08-08T17:05:27.184+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 7856 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
2018-08-08T17:05:28.285+0800 I CONTROL [initandlisten]
說明:
孤的配置文件中沒有使用默認的WiredTiger存儲引擎,而是使用了文件系統存儲的方式,會比較低效;
WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
開始沒有開啓安全認證,後來添加了authorization: enabled選項,警告消失:
WARNING: Access control is not enabled for the database.
其它的WARNING尚未解決。
3.解決一下WARNING後使用mongo訪問MongoDB服務器的輸出
$ mongo
MongoDB shell version v4.0.0
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.0
>
後記
其實,新方式中的數據庫文件夾早已存在了,並且已經建立了兩個賬號,在做本文實踐時,直接拷貝了文件夾,結果,可以使用。只不過,因爲之前沒有選擇WiredTiger存儲引擎,所以,現在也是不可以的了。但是,通過數據導出、導入的方式可以將其中的數據轉存到另一個支持WiredTiger存儲引擎的數據庫中。
fork配置項說明:fork server process
Enable a daemon mode that runs the mongos or mongod process in the background.
使得mongod、mongo在後臺運行。
還有一個問題,怎麼設置、選擇啓動MongoDB的用戶和用戶組呢?需要新建嗎?怎麼新建?