MongoDB

出自 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]。雖然它在某些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

排障[編輯 | 編輯原始碼]

如果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

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