MongoDB

出自 ArchWiki

MongoDB (源自 humongous) 是一个源代码开放的文档导向数据库系统,由 MongoDB Inc. (前称 10gen) 开发和支持。它是 NoSQL 数据库系统家族的一部分。与“经典”关系数据库中将数据存储在表中的方式不同,MongoDB 将结构化数据存储为类 JSON 文档,这些文档具有动态模式(MongoDB 将该格式称为 BSON),从而使某些类型应用程序中的数据集成更加容易和快速。

安装

由于重新许可问题 [1],MongoDB 已从官方软件仓库中移除。

安装以下其中之一以获取可用的最新版本

或者,还有旧版本的 MongoDB 可用

工具

其他 MongoDB 工具也已打包

  • MongoDB Shell — 新的 mongosh 工具,它取代了旧版 mongo shell[2]。它与 MongoDB 4.0 或更高版本兼容。
https://mongodb.ac.cn/docs/mongodb-shell/ || mongosh-binAUR
  • MongoDB Compass — 用于查询、优化和分析 MongoDB 数据的 GUI 交互式工具
https://mongodb.ac.cn/docs/compass/ || mongodb-compassAUR, mongodb-compass-readonlyAUR, mongodb-compass-isolatedAUR
  • MongoDB Database Tools — 提供导入、导出和诊断功能
https://mongodb.ac.cn/docs/database-tools/ || mongodb-toolsAUR
  • Mingo — 基于 Electron 构建的专有、EULA 许可的 MongoDB GUI,旨在帮助 MongoDB 开发人员管理其数据库。
https://mingo.io/ || mingoAUR

用法

启动/启用 mongodb.service 守护进程。

注意: 在首次启动 mongodb 服务期间,它将预分配空间,通过创建大型文件(用于其日志和其他数据)。此步骤可能需要一段时间,在此期间 MongoDB shell 将不可用。

要访问 MongoDB 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/mongodb.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 启动。

编辑 mongodb.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

重新启用重启 mongodb.service,根据需要。

干净地启动和停止

默认情况下,systemd 在请求启动或停止后,如果未在 90 秒内完成操作,则会立即终止任何进程。

mongodbAUR 使 systemd 等待 MongoDB 启动所需的时间,但 mongodb-binAUR 则不会。这两个软件包都允许 systemd 在被要求停止后终止 MongoDB,如果它未在 90 秒内完成。

大型 MongoDB 数据库可能需要相当长的时间才能干净地关闭,尤其是在使用交换空间的情况下。(一个在顶级 NVMe 上运行的 450GB 活动数据库,配备 64GB RAM 和 16GB 交换空间,可能需要一个小时才能关闭。)

默认情况下,MongoDB 使用日志记录。[7] 通过日志记录,不干净的关机不应构成数据丢失的风险。但是,如果不干净地关机,大型 MongoDB 数据库可能需要相当长的时间才能重新启动。在这种情况下,选择是否需要干净的关机是在较慢的关机与较慢的启动之间进行选择。[8]

警告: 如果您禁用日志记录,则未能要求干净的关机将严重威胁数据丢失,因此您确实需要要求干净的关机。[9]

要防止 systemd 在 90 秒后终止 MongoDB,请编辑 mongodb.service

要允许 MongoDB 干净地关机,请追加[Service] 部分:(对于大型数据库,这可能会显着减慢您的系统关机时间,但会加快您下次 MongoDB 的启动时间)

TimeoutStopSec=infinity

如果 MongoDB 需要很长时间才能重新启动,则 systemd 每 90 秒不断终止并重新启动它可能会非常成问题[10],因此 mongodbAUR 防止这种情况发生。如果使用 mongodb-binAUR,要使 systemd 等待 MongoDB 启动所需的时间,请追加[Service] 部分

TimeoutStartSec=infinity

故障排除

MongoDB 无法启动

如果 MongoDB 无法启动,并且您刚刚升级到 mongodbAUR 4.0.6-2+,您可能有一个自定义的 /etc/mongodb.conf。当 MongoDB 在官方软件仓库中时,它使用了一个 Arch 特定的配置文件,该文件使用了简单的 systemd 服务类型。它现在提供上游的 systemd 服务和配置文件,这些文件改为使用 forking 的 systemd 服务类型。Pacman 将自动升级您的 systemd 服务文件,但仅当您从未修改过 /etc/mongodb.conf 时,才会自动升级 (如果从未修改过)。在这种情况下,systemd 将期望 mongod fork,但其配置文件会告诉它不要 fork。您需要:切换到安装在 /etc/mongodb.conf.pacnew 的新配置文件,并复制您对旧文件所做的仍然需要的更改,考虑到新文件现在是 YAML 格式,而旧文件可能是 MongoDB 2.4 格式;或者修改您现有的文件以启用 forking。(要继续使用旧的 2.4 文件格式而不是 YAML,添加 fork: true 应该是需要的。)

检查 mongodb.service 是否配置为使用正确的数据库位置。

--dbpath /var/lib/mongodb 添加到 ExecStart

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

如果为空,停止 mongodb.service。对数据库运行修复,指定 dbpath(/var/lib/mongodb/ 是 Arch Linux 中的默认 --dbpath

# mongod --dbpath /var/lib/mongodb/ --repair

完成后,dbpath 应包含修复后的数据文件和一个空的 mongod.lock 文件。

警告: 在紧急情况下,您可以删除该文件,使用可能已损坏的文件启动数据库,并尝试从数据库中恢复数据。但是,无法预测这些情况下数据库的状态。有关详细信息,请参阅上游文档

以 root 身份运行修复后,文件将归 root 用户所有,而 Arch Linux 在不同的用户下运行它。您需要使用 chown 将文件的所有权更改回正确的用户。有关更多详细信息,请参阅以下链接: 更多参考

# chown -R mongodb: /var/{log,lib}/mongodb/

切换到不同的版本 / 全新安装

卸载某个版本的 MongoDB 并安装不同版本后,MongoDB 可能无法启动。在这种情况下,请尝试删除并重新创建以下文件夹(请注意,这将删除您的数据库)

$ rm -r /var/{lib,log}/mongodb
$ mkdir /var/{lib,log}/mongodb
$ chown -R mongodb:mongodb /var/{log,lib}/mongodb/

有些计算机就是无法运行 MongoDB

某些计算机就是无法运行 MongoDB,因为它们的 CPU 架构不具备运行它所需的指令集。例如,MongoDB 能够安装在具有 Intel "Gemini Lake Refresh" / Goldmount Plus 微架构的 GPD MicroPC 上,但运行 MongoDB Shell 返回了以下内容

$ mongosh 'mongodb://127.0.0.1:27017'
Current Mongosh Log ID: 642b48661e2fc4dd5bda05d0
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.8.0
MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017

此外,coredumpctl info 报告了一个信号 4 (ILL),这意味着尝试执行非法指令。换句话说,该计算机没有运行此程序所需的指令集,至少在本地是如此。

它可以连接到 MongoDB Atlas,服务器远程托管在一台可以运行 MongoDB 的机器上,无需 mongodb.service

关于透明大页 (THP) 的警告

可能需要使用 tmpfile 永久禁用此功能

/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

关于软 rlimits 过低的警告

如果您正在使用 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

有关更多详细信息,请参阅以下链接: 更多参考