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][失效链接 2023-05-06 ⓘ]。兼容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
使用
启动 Mongo 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/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
。
完全的启动和停止
默认情况下,如果在90秒内没有完成启动或停止操作,则systemd会在请求启动或停止后立即终止任何内容。
mongodbAUR会让systemd等待MongoDB启动所需的时间,但mongodb-binAUR不会。这两个包都允许systemd在被要求停止后终止MongoDB,如果它没有在90秒内完成的话。
大型MongoDB数据库可能需要相当长的时间才能完全关闭,特别是在使用交换的情况下。(使用64GB RAM和16GB交换空间的顶级NVMe上的运行450GB数据库可能需要一个小时才能关闭。)
默认情况下,MongoDB使用日志记录。[7] 对于日志记录,不彻底的关闭应该不会造成数据丢失的风险。但是,如果不彻底关闭,大型MongoDB数据库可能需要相当长的时间才能启动备份。在这种情况下,选择是否需要彻底关闭就是选择较慢的关机和较慢的启动。[8]
为了防止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
有关更多详细信息,请参阅以下链接:进一步参考