MongoDB
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]。兼容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
排障[編輯 | 編輯原始碼]
如果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/
部分設備始終無法啟動 MongoDB[編輯 | 編輯原始碼]
由於 CPU 架構缺乏必要的指令集,有些設備是無法運行 MongoDB 的。例如,MongoDB 可以被安裝在使用 Intel「Gemini Lake Refresh」/Goldmount Plus 微架構的 GPD MicroPC 上,但在運行 MongoDB Shell 的時候會出現如下信息:
$ 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
另外,使用 coredumpctl info
可觀察到 4 (ILL)
信號,意指嘗試執行非法指令集。換句話說,該設備缺乏本地運行該程序所必需的指令集。
但是,它可以連接到能運行 MongoDB 的遠程設備上的 MongoDB Atlas 實例,該操作不需要 mongodb.service
。
透明大頁(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
有關更多詳細信息,請參閱以下鏈接:進一步參考