MongoDB
MongoDB (源自 humongous) 是一个源代码开放的文档导向数据库系统,由 MongoDB Inc. (前称 10gen) 开发和支持。它是 NoSQL 数据库系统家族的一部分。与“经典”关系数据库中将数据存储在表中的方式不同,MongoDB 将结构化数据存储为类 JSON 文档,这些文档具有动态模式(MongoDB 将该格式称为 BSON),从而使某些类型应用程序中的数据集成更加容易和快速。
安装
由于重新许可问题 [1],MongoDB 已从官方软件仓库中移除。
安装以下其中之一以获取可用的最新版本
- mongodbAUR - 从源代码构建。
- mongodb-binAUR - 从 官方 MongoDB Ubuntu 仓库 软件包中提取的预构建 MongoDB 二进制文件。使用的编译选项未知。
或者,还有旧版本的 MongoDB 可用
- mongodb50AUR, mongodb50-binAUR
- mongodb44AUR, mongodb44-binAUR
- mongodb42-binAUR
- mongodb40-binAUR
- mongodb36-binAUR
- mongodb34-binAUR
- mongodb32-binAUR
工具
其他 MongoDB 工具也已打包
- MongoDB Shell — 新的 mongosh 工具,它取代了旧版 mongo shell[2]。它与 MongoDB 4.0 或更高版本兼容。
- MongoDB Compass — 用于查询、优化和分析 MongoDB 数据的 GUI 交互式工具
- https://mongodb.ac.cn/docs/compass/ || mongodb-compassAUR, mongodb-compass-readonlyAUR, mongodb-compass-isolatedAUR
- MongoDB Database Tools — 提供导入、导出和诊断功能
- Mingo — 基于 Electron 构建的专有、EULA 许可的 MongoDB GUI,旨在帮助 MongoDB 开发人员管理其数据库。
- https://mingo.io/ || mingoAUR
用法
要访问 MongoDB 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/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
。
干净地启动和停止
默认情况下,systemd 在请求启动或停止后,如果未在 90 秒内完成操作,则会立即终止任何进程。
mongodbAUR 使 systemd 等待 MongoDB 启动所需的时间,但 mongodb-binAUR 则不会。这两个软件包都允许 systemd 在被要求停止后终止 MongoDB,如果它未在 90 秒内完成。
大型 MongoDB 数据库可能需要相当长的时间才能干净地关闭,尤其是在使用交换空间的情况下。(一个在顶级 NVMe 上运行的 450GB 活动数据库,配备 64GB RAM 和 16GB 交换空间,可能需要一个小时才能关闭。)
默认情况下,MongoDB 使用日志记录。[7] 通过日志记录,不干净的关机不应构成数据丢失的风险。但是,如果不干净地关机,大型 MongoDB 数据库可能需要相当长的时间才能重新启动。在这种情况下,选择是否需要干净的关机是在较慢的关机与较慢的启动之间进行选择。[8]
要防止 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
有关更多详细信息,请参阅以下链接: 更多参考