MongoDB (詞源 humongous) 是一個開源的,面向文檔的資料庫系統,由 MongoDB Inc. (formerly 10gen)開發並提供支持. 它是NoSQL家族中的一員, 替代用表儲存數據的經典的關係型資料庫, MongoDB的數據儲存結構類似於用動態視圖(dynamic schemas)儲存類JSON文檔(JSON-like documents) (MongoDB稱這種格式為BSON, 將數據儘早儘快地整合成對應的應用類型.
安裝
由於 MongoDB 修改了軟體授權協議,官方軟體倉庫已經刪除了此軟體包 [1]。
對於可用的最新版本,請安裝以下軟體之一:
- mongodbAUR - 從原始碼構建
- mongodb-binAUR - 從官方MongoDB Ubuntu存儲庫包中提取的預構建MongoDB二進位文件。使用的編譯選項未知。
或者,也可以使用舊版本的MongoDB:
- Mongodb50AUR,mongodb50-binAUR
- mongodb44AUR,mongodb44-binAUR
- mongodb42-binAUR
- mongodb40-binAUR
- mongodb36-binAUR
- mongodb34-binAUR
- mongodb32-binAUR
Tools
還可以找到打包的其他MongoDB工具:
- MongoDB Shell — 新的Mongosh tool,它取代了舊的MongoDB Shell [2][失效連結 2023-05-06 ⓘ]。兼容MongoDB 4.0或更高版本。https://www.mongodb.com/docs/mongodb-shell/ || mongosh-binAUR
- MongoDB Compass — 用於查詢、優化和分析MongoDB數據的圖形用戶界面交互工具 https://www.mongodb.com/docs/compass/ || mongodb-compassAUR,mongodb-compass-readonlyAUR,mongodb-compass-isolatedAUR
- MongoDB Database Tools — 提供導入、導出和診斷功能 https://www.mongodb.com/docs/database-tools/ || mongodb-toolsAUR
- Mingo — A proprietary, EULA licensed, MongoDB GUI built on Electron, designed to aid MongoDB developers with managing their databases.
- https://mingo.io/ || mingoAUR
使用
啟動 Mongo Shell, 在終端輸入 [3]:
$ mongosh
如果配置了身份驗證:
$ mongosh -u userName
配置
文件格式
MongoDB使用基於YAML的配置文件格式。有關可用的配置選項,請參閱https://docs.mongodb.com/manual/reference/configuration-options/。
/etc/mongodb.conf
systemLog: destination: file path: "/var/log/mongodb/mongod.log" logAppend: true storage: journal: enabled: true processManagement: fork: true net: bindIp: 127.0.0.1 port: 27017 setParameter: enableLocalhostAuthBypass: false ..
身份驗證
localhost
,以防止外部訪問。這仍然允許任何本地用戶在不經過身份驗證的情況下進行連接,並且可能會暴露資料庫。建議啟用訪問控制以防止任何不需要的訪問。如果您將MongoDB設置為在0.0.0.0
上偵聽,則必須啟用訪問控制,否則您的數據將被竊取並被勒索。創建具有管理員訪問權限的MongoDB用戶帳戶 [5]:
$ mongosh
use admin db.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ] } )
將以下內容附加到您的/etc/mongob.conf
。
/etc/mongodb.conf
security: authorization: "enabled"
重啟 mongodb.service
.
NUMA
使用非統一訪問內存(NUMA)運行MongoDB會顯著影響性能 [6]。
要查看您的系統是否使用NUMA,請執行以下操作:
# dmesg | grep -i numa
此外,如果NUMA正在使用並且MongoDB不是通過numactl
啟動的,則/var/log/mongodb/mongod.log
將顯示警告。(mongo shell也會顯示這一點,但前提是您沒有啟用身份驗證。)
如果您的系統使用NUMA,為了提高性能,您應該讓MongoDB通過numactl
啟動。
根據您安裝的包編輯mongob.service
。
如果使用mongodbAUR,請將其從:
ExecStart=/usr/bin/mongod $OPTIONS
更改為:
ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod $OPTIONS
如果使用mongodb-binAUR,請將其從:
ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb.conf
更改為:
ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod --quiet --config /etc/mongodb.conf
還需要禁用區域聲明,但在Arch上,/proc/sys/vm/zone_reClaim_mode
默認為0
。
完全的啟動和停止
默認情況下,如果在90秒內沒有完成啟動或停止操作,則systemd會在請求啟動或停止後立即終止任何內容。
mongodbAUR會讓systemd等待MongoDB啟動所需的時間,但mongodb-binAUR不會。這兩個包都允許systemd在被要求停止後終止MongoDB,如果它沒有在90秒內完成的話。
大型MongoDB資料庫可能需要相當長的時間才能完全關閉,特別是在使用交換的情況下。(使用64GB RAM和16GB交換空間的頂級NVMe上的運行450GB資料庫可能需要一個小時才能關閉。)
默認情況下,MongoDB使用日誌記錄。[7] 對於日誌記錄,不徹底的關閉應該不會造成數據丟失的風險。但是,如果不徹底關閉,大型MongoDB資料庫可能需要相當長的時間才能啟動備份。在這種情況下,選擇是否需要徹底關閉就是選擇較慢的關機和較慢的啟動。[8]
為了防止systemd 在90秒後停止MongoDB進程,可以編輯mongob.service
。
要讓MongoDB乾淨利落地關機,請在[Service]部分附加下面內容:(在大型資料庫上,這可能會顯著降低系統關機時間,但會加快下一次MongoDB啟動時間)
TimeoutStopSec=infinity
如果MongoDB需要很長時間才能啟動備份,則對於systemd來說,每隔90秒持續終止並重新啟動它可能是非常有問題的 [10],所以mongodbAUR可以防止這種情況發生。如果使用的是mongodb-binAUR,為了讓systemd等待MongoDB啟動的時間,可以在[Service]部分添加:
TimeoutStartSec=infinity
Troubleshooting
如果MongoDB無法啟動,而你剛剛升級到mongodbAUR 4.0.6-2+,你可能有一個自定義的/etc/mongodb.conf
。當MongoDB還在官方倉庫時,它使用了一個Arch特有的配置文件,使用systemd服務類型的simple。現在它提供了上游的 systemd 服務和配置文件,改用 forking 的 systemd 服務類型。Pacman 會自動升級你的 systemd 服務文件,但只有在你從未修改過/etc/mongodb.conf
的情況下才會自動升級。在這種情況下,systemd 會期待 mongod 分叉,但它的配置文件會告訴它不要這樣做。你需要:切換到安裝在/etc/mongodb.conf.pacnew
的新配置文件,並複製你對舊文件所做的修改,考慮到新文件現在是YAML格式,而舊文件可能是MongoDB 2.4的格式,你仍然需要;或者修改你現有的配置文件,使分叉生效。(要繼續使用舊的2.4文件格式而不是YAML格式,添加fork: true
應該是需要的)。
檢查mongodb.service
是否被配置為使用正確的資料庫位置。
在ExecStart
行中添加--dbpath /var/lib/mongodb
:
ExecStart=/usr/bin/numactl --interleave=all mongod --quiet --config /etc/mongodb.conf --dbpath /var/lib/mongodb
檢查其日誌文件是否有至少3GB的可用空間,否則mongodb可能無法啟動(不向用戶發布消息):
$ df -h /var/lib/mongodb/
檢查mongod.lock
鎖定文件是否為空:
# ls -lisa /var/lib/mongodb
如果是,則停止mongob.service
。在資料庫上運行修復,指定資料庫路徑(/var/lib/mongodb/
是Arch Linux中的默認路徑--dbpath
):
# mongod --dbpath /var/lib/mongodb/ --repair
完成後,資料庫路徑應該包含修復的數據文件和一個空的mongod.lock
文件。
在緊急情況下,您可以刪除該文件,使用可能損壞的文件啟動資料庫,並嘗試從資料庫恢復數據。然而,在這些情況下,不可能預測資料庫的狀態。詳細信息請參見上游文檔。
在以root用戶身份運行修復之後,文件將歸root用戶所有,而Arch Linux在另一個用戶下運行它。您需要使用chown將文件的所有權更改回正確的用戶。有關更多詳細信息,請參閱以下連結:進一步參考
# chown -R mongodb: /var/{log,lib}/mongodb/
Some computer just cannot run MongoDB
Some computers simply will not run MongoDB because their CPU architecture does not have the instruction set needed to run it. For instance, MongoDB was able to be installed on a GPD MicroPC which has an Intel "Gemini Lake Refresh"/Goldmount Plus microarchitecture, but running the MongoDB Shell returned the following:
$ mongosh 'mongodb://localhost:27017'
Current Mongosh Log ID: 642b48661e2fc4dd5bda05d0 Connecting to: mongodb://localhost:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.8.0 MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017
Furuthermore, coredumpctl info
reported a signal 4 (ILL)
meaning that an illegal instruction execution was attempted. In other words, the computer did not have the instruction set to run this program, at least not locally.
It was able to connect to MongoDB Atlas where the server is hosted remotely on a machine that can run MongoDB, no mongodb.service
required.
Warning about Transparent Huge Pages (THP)
用戶可能希望使用 tmpfiles 永久禁用此功能:
/etc/tmpfiles.d/mongodb.conf
w /sys/kernel/mm/transparent_hugepage/enabled - - - - never w /sys/kernel/mm/transparent_hugepage/defrag - - - - never
在運行時使用 sysctl 禁用THP:
# echo never > /sys/kernel/mm/transparent_hugepage/enabled # echo never > /sys/kernel/mm/transparent_hugepage/defrag
軟限制過低的警告
如果您使用的是systemd服務,則編輯單元文件:
[Service] # Other directives omitted # (file size) LimitFSIZE=infinity # (cpu time) LimitCPU=infinity # (virtual memory size) LimitAS=infinity # (locked-in-memory size) LimitMEMLOCK=infinity # (open files) LimitNOFILE=64000 # (processes/threads) LimitNPROC=64000
有關更多詳細信息,請參閱以下連結:進一步參考