本文介紹 MongoDB Community Edition 在 Ubuntu 下的安裝和常見配置方法。文中操作基於 MongoDB Community Edition 4.2.2 和 Ubuntu 18.04 。對於不同的系統和版本,操作方式和方法可能會有不同。
基礎安裝
本節簡單講解在Ubuntu下 MongoDB 基本的安裝步驟。
- 安裝GPG公鑰
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add - - 添加APT源
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list - 重載本地包數據庫
sudo apt-get update - 安裝mongoDB
sudo apt-get install -y mongodb-org - 檢查mongoDB包安裝信息
正常情況下,可以看到以下信息apt list --installed mongodb*mongodb-org/bionic,now 4.2.2 amd64 [installed] mongodb-org-mongos/bionic,now 4.2.2 amd64 [installed] mongodb-org-server/bionic,now 4.2.2 amd64 [installed] mongodb-org-shell/bionic,now 4.2.2 amd64 [installed] mongodb-org-tools/bionic,now 4.2.2 amd64 [installed] - 啟動系統服務
sudo systemctl enable mongod.service sudo systemctl start mongod.service - 檢查服務狀態
如果systemctl status -l mongod.servicemongod.service的狀態不是active(running),可以根據systemctl status命令的輸出和日志文件/var/log/mongodb/mongod.log來排查問題原因。
客戶端連接
當 MongoDB 服務啟動成功后,可以使用 MongoDB JavaScript Shell 客戶端來訪問數據庫了:
mongo --host 127.0.0.1 --port 27017
默認配置下,MongoDB 監聽本地localhost的27017端口。此時,啟動 MongoDB JavaScript Shell 時也可以省略地址和端口參數。連接成功后就可以操作數據庫了。比如查看現有的database:
> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
安裝操作詳解
接下來會對安裝過程做進一步講解,基於這部分內容,可以對 MongoDB 的安裝和基本配置進行部分自定義。
安裝指定組件和版本
在一節內容中,可以看到當 MongoDB 的包安裝完成后,可以看到多個組件被安裝。這些組件分別是
| 包名 | 描述 |
|---|---|
| mongodb-org | 包含所有組件包的元包,安裝此包會包含以下所有組件 |
| mongodb-org-server | MongoDB 服務器,主要是 mongod 進程程序和相關資源和腳本 |
| mongodb-org-mongos | mongos 進程,用於在 MongoDB 分片集群中將客戶端請求分發到各服務節點 |
| mongodb-org-shell | MongoDB JavaScript Shell 客戶端 |
| mongodb-org-tools | 其他 MongoDB 工具, mongoimport, bsondump, mongodump, mongoexport,mongofiles,mongorestore,mongostat,和mongotop |
可以根據需要安裝指定的組件,比如只安裝 MongoDB JavaScript Shell 來訪問遠程服務:
sudo apt install mongodb-org-shell
系統服務配置
當 MongoDB 服務安裝完成后,會創建系統服務文件 /lib/systemd/system/mongod.service。可以根據需要修改此文件。
比如,服務文件里包含以下一些配置:
[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
User和Group指定了啟動 MongoDB 服務進程所使用的用戶mongodb和同名用戶組mongodb。這個用戶和用戶組是在安裝 MongoDB 時自動創建的。可以在必要時指定為期望的值。當修改后,要注意同時修改相關目錄和文件的權限。
ExecStart指定了啟動服務進程的命令,可以看到這里顯示指定了使用配置文件/etc/mongod.conf。可以修改這條配置項讓數據庫使用其他配置文件,也可以添加其他啟動參數。
如果希望在同一台服務器上啟動多個 MongoDB 服務,可以復制服務文件,並修改后啟用。
如果是在啟用服務之后對服務文件做了修改,需要重載配置再重啟服務:
sudo systemctl daemon-reload
sudo systemctl restart mongod.service
基礎配置
本節介紹一些 MongoDB 配置文件中常用的配置項。默認情況下,這些配置保存在文件/etc/mongod.conf中。當配置項修改后,需要重啟服務才能生效。
指定監聽地址和端口
默認情況下,非分片集群下的 MongoDB 監聽 localhost 上的 27017端口。在沒有顯示指定配置文件時,這個是由配置文件中的 net.port和net.bindIp配置頂控制:
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
這時, MongoDB 只接受來自於同一台服務器上的本地連接,所以通常都會需要修改監聽的地址。比如希望監聽所有的IPv4地址,就可以將 net.bindIp 項的值由 127.0.0.1 修改為 0.0.0.0。如果需要調整監聽的端口,則將 net.port 配置頂的值由 27017 修改為期望值。
修改數據存儲
MongoDB 的數據存儲目錄是由配置文件中的 storage.dbPath 配置項來控制的。默認情況下數據保存在 /var/lib/mongodb 目錄下:
# Where and how to store data.
storage:
dbPath: /var/lib/mongodb
可以根據自己的需要修改數據目錄。在修改之前要確保目錄已經存在,並且權限設置正確。目錄的所有者應當為 mongodb:mongodb,或者啟動進程的用戶有讀寫權限。
如果數據庫之前已經有數據了,需要把之前數據目錄下的文件都復制到新目錄下,否則 MongoDB 會新建空的數據文件結構。
修改日志配置
默認情況下 MongoDB 日志記錄在文件 /var/log/mongodb/mongod.log 中。這個是由 systemLog 相關配置項決定的:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
如果要修改日志文件位置,就根據需要修改 systemLog.path 配置項的值。不過要注意日志文件所在目錄的權限。運行 MongoDB 進程的用戶需要有日志目錄的讀寫權限。默認情況下使用的用戶是 mongodb:mongodb。
如果希望日志文件可以輪轉(log rotate),則需要添加配項 systemLog.logRotate:
# where to write logging data.
systemLog:
destination: file
logAppend: true
logRotate: true
path: /var/log/mongodb/mongod.log
訪問控制
默認配置下,MongoDB 是沒有開啟訪問控制的。此時,用戶訪問數據庫不需要做驗證,並且擁有所有的權限。所以在安裝完成后,應當立刻開啟數據庫的訪問控制。
- 連接到本地數據庫后,在客戶端執行以下命令
此命令用在use admin db.createUser( { user: "admin", pwd: passwordPrompt(), roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] } )admin數據庫下創建一個名為admin的賬號。createUser方法參數JSON中的pwd字段用來指定賬號的密碼。這里指定的是另一個方法passwordPrompt。這個方法在執行createUser命令時,會提示並等待用戶在客戶端輸入密碼。roles指定用戶的角色和權限。這里給admin授權的第一個權限是admin數據庫的管理權限。admin數據庫是 MongoDB 用來管理用戶的,所以有了這個權限,就可以用來管理數據庫的其他賬號了。第二個權限readWriteAnyDatabase是對所有數據庫的讀寫權限。 - 在Ubuntu終端中關閉 MongoDB 服務:
sudo systemctl stop mongod.service - 在配置文件將
security.authorization配置頂設置為true來開啟訪問控制:security: authorization: enabled - 啟動 MongoDB 服務來使配置生效:
sudo systemctl start mongod.service - 使用
admin登錄mongo -u admin -p - 給應用數據庫創建賬號,比如
app_db下創建賬號app_admin:use app_db db.createUser( { user: "app_admin", pwd: passwordPrompt(), roles: [ "readWrite" ] } )
這里創建的賬號是有app_db下的讀寫權限readWrite的。如果想創建只讀賬號,則需要指定權限為read。
- 使用普通賬號登錄
和之前使用mongo --authenticationDatabase app_db -u app_admin -padmin賬號登錄不同,這里指定了authenticationDatabase參數值為app_db,因為app_admin是在app_db下創建的賬號。
