MongoDB
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
使用[编辑 | 编辑源代码]
启动 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
排障[编辑 | 编辑源代码]
如果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
有关更多详细信息,请参阅以下链接:进一步参考