出自 Arch Linux 中文维基

MongoDB (詞源 humongous) 是一個開源的,面向文檔的資料庫系統,由 MongoDB Inc. (formerly 10gen)開發並提供支持. 它是NoSQL家族中的一員, 替代用表儲存數據的經典的關係型資料庫, MongoDB的數據儲存結構類似於用動態視圖(dynamic schemas)儲存類JSON文檔(JSON-like documents) (MongoDB稱這種格式為BSON, 將數據儘早儘快地整合成對應的應用類型.

安裝

由於 MongoDB 修改了軟體授權協議,官方軟體倉庫已經刪除了此軟體包 [1]

對於可用的最新版本,請安裝以下軟體之一:

或者,也可以使用舊版本的MongoDB:

Tools

還可以找到打包的其他MongoDB工具:

https://mingo.io/ || mingoAUR

使用

啟動/啟用 mongodb.service 進程。

注意: 在MongoDB服務第一次啟動期間,它將通過創建大文件(用於其日誌和其他數據)來預分配空間。這一步可能需要一段時間,在此期間MongoDB Shell不可用。

啟動 Mongo Shell, 在終端輸入 [3]:

$ mongosh

如果配置了身份驗證:

$ mongosh -u userName
警告: 舊的mongo shell在MongoDB V5.0中已被棄用,取而代之的是mongosh [4][失效連結 2023-05-06 ⓘ]。雖然它在某些MongoDB包中可用,但強烈建議您從5.0版開始更改它。

配置

文件格式

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
..

身份驗證

警告: 默認情況下,MongoDB不需要任何身份驗證!不過,MongoDB默認情況下只監聽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

根據需要重新啟用重啟mongob.service。

完全的啟動和停止

默認情況下,如果在90秒內沒有完成啟動或停止操作,則systemd會在請求啟動或停止後立即終止任何內容。

mongodbAUR會讓systemd等待MongoDB啟動所需的時間,但mongodb-binAUR不會。這兩個包都允許systemd在被要求停止後終止MongoDB,如果它沒有在90秒內完成的話。

大型MongoDB資料庫可能需要相當長的時間才能完全關閉,特別是在使用交換的情況下。(使用64GB RAM和16GB交換空間的頂級NVMe上的運行450GB資料庫可能需要一個小時才能關閉。)

默認情況下,MongoDB使用日誌記錄。[7] 對於日誌記錄,不徹底的關閉應該不會造成數據丟失的風險。但是,如果不徹底關閉,大型MongoDB資料庫可能需要相當長的時間才能啟動備份。在這種情況下,選擇是否需要徹底關閉就是選擇較慢的關機和較慢的啟動。[8]

警告: 如果禁用日誌記錄,如果不進行徹底關機,則會有嚴重的數據丟失風險,因此您確實需要要求徹底關機。[9]

為了防止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

有關更多詳細信息,請參閱以下連結:進一步參考