MongoDB 如何啟動與初始設定教學

  • 使用環境:macOS
  • MongoDB 版本:不拘

我們要啟動 MongoDB 只需要使用 mongod 指令即可,但實務上總不可能只有這樣,尤其是要搭上 CI/CD、容器化等自動部署,因此本文先來講解如何使用 .conf 檔案來設定資料庫。


首先要知道的是 MongoDB 預設的資料庫路徑是 /data/db/,如果直接在 macOS 底下啟動,只會遇到這樣的錯誤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MingYi mongod
2022-10-05T00:50:47.786+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] MongoDB starting : pid=26591 port=27017 dbpath=/data/db 64-bit host=ApieMacbook.local
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] db version v4.0.3
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] git version: 7ea530946fa7880364d88c8d8b6026bbc9ffa48c
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] allocator: system
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] modules: none
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] build environment:
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] distarch: x86_64
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] target_arch: x86_64
2022-10-05T00:50:47.795+0800 I CONTROL [initandlisten] options: {}
2022-10-05T00:50:47.796+0800 I STORAGE [initandlisten] exception in initAndListen: NonExistentPath: Data directory /data/db not found., terminating
2022-10-05T00:50:47.796+0800 I NETWORK [initandlisten] shutdown: going to close listening sockets...
2022-10-05T00:50:47.796+0800 I NETWORK [initandlisten] removing socket file: /tmp/mongodb-27017.sock
2022-10-05T00:50:47.796+0800 I CONTROL [initandlisten] now exiting
2022-10-05T00:50:47.796+0800 I CONTROL [initandlisten] shutting down with code:100

可以看到 Exception: exception in initAndListen: NonExistentPath: Data directory /data/db not found.,嗯..資料夾不存在,於是我們嘗試著建立 /data/db/ 資料夾:

1
2
3
4
5
➜  / pwd
/
➜ / mkdir data
mkdir: data: Read-only file system
➜ /

會發現無法建立,這是因為 macOS 的安全機制緣故。我們在這邊不打算跟它硬碰硬,山不轉路轉,我們改成指定 MongoDB 的資料庫位置,使用的是 dbpath 設定:

ex: mongod --dbpath=/Users/mingyi/Documents/MingYi/data/db/

透過上述指令就能夠成功啟動 MongoDB server 囉!


port

1
2
2022-10-07T22:38:30.097+0800 I CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2022-10-07T22:38:30.229+0800 I NETWORK [initandlisten] waiting for connections on port 27017

我們可以從 terminal 看到開啟的訊息,裡面包含了綁定的 localhost27017,通常只有在本機端開發才會使用這組,接著我們來嘗試著設定 Port。

  • 使用的參數 --host
  • mongod --host=27066 --dbpath=/Users/mingyi/Documents/MingYi/data/db/

接著預期就能看到這樣的訊息了 waiting for connections on port 27066

logpath

在 Terminal 看到的訊息也可以儲存到指定檔案

  • 使用的參數 --logpath
  • mongod --dbpath=/Users/mingyi/Documents/MingYi/data/db/ --logpath=/Users/mingyi/Documents/MingYi/mongo.log

fork

  • --fork 參數則是離開互動模式,使用後就可以繼續使用同一個 terminal,不需要再額外開一個
  • mongod --dbpath=/Users/mingyi/Documents/MingYi/data/db/ --port=27066 --logpath=/Users/mingyi/Documents/MingYi/mongo.log --fork
1
2
3
4
5
6
2022-10-07T22:56:46.577+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: 36164
child process started successfully, parent exiting

➜ MingYi

補充:
要關閉 mongod,需要先連進去 MongoDB Server
mongosh –port 27066
db.shutdownServer()

journal, journalCommitInterval

  • journal 就是所有對 mongod 操作的內容,使得 crash 時,所有操作變成可恢復性,預設是開啟
  • journalCommitInterval <value>,journal預設是 100ms,時間設定越短即寫入硬碟頻率越高,對硬碟效能很吃重。

profile, slowms

  • slowms: 設定多少毫秒為操作,預設 100ms
  • --profile <level>: 協助檢測效能差的操作設定
    • 0: default 設定,不啟用
    • 1: 只記錄執行時間超過 slowms 的操作
    • 2: 記錄全部操作

設定 profile 對效能會有部分影響,但影響多巨大就真的吃各種狀況,無法概括而論,但效能調整遇到瓶頸時,開啟 1 是很有幫助的。


後續還有很多設定,我就不再節錄使用結果

  • --pidfilepath <path>: 指定儲存 mongod Process ID 的路徑
  • --keyFile <file>: 使用 Sharded cluster 或是 Replica set 時,用來相互認證的鑰匙檔案,內容相符才會互相認識成為一個群組
  • --dictoryperdb: 按照 DB 來分資料夾儲存,好處是能夠減少每份檔案大小,理論上對效能是有幫助的
  • --oplogSize <value>: 設定 oplog 大小,如果資料同步速度 < 寫入速度,那 oplog 遲早會不夠用,一但觸到上限,就會自動遺棄掉最早的操作記錄,要很小心。

還有非常多設定,上面就是舉一些有印象修改過的內容給大家參考。


介紹了很多設定,總不可能在啟動時輸入一大堆指令吧!一來是非常的不方便,二來是難以做 CI/CD,因此寫成一個設定檔是必須的,設定檔的格式為 YAML(YAML)。

我們先建立一個 .conf 結尾的檔案,接著編寫其內容:

1
2
3
4
5
6
7
8
9
10
11
systemLog:
destination: file
path: "/Users/mingyi/Documents/MingYi/mongo.log"
logAppend: true
storage:
dbPath: "/Users/mingyi/Documents/MingYi/data/db/"
journal:
enabled: true
net:
bindIp: 127.0.0.1
port: 27666

接著啟動時只需要使用 -f <path> 即可。

1
2
3
➜  MingYi mongod -f mongo.conf
2022-10-09T08:37:32.507+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'

大功告成!

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。