MongoDB - Arch Linux 中文维基

跳至內容

# MongoDB

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 MongoDB，最近一次同步於 2024-04-03，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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

## 使用

啟動/啟用 `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

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

分類：​

- 資料庫管理系統

MongoDB
新增話題