MongoDB

来自 Arch Linux 中文维基

MongoDB (词源 humongous) 是一个源码公开的,面向文档的数据库系统,由 MongoDB Inc. (formerly 10gen)开发并提供支持. 它是NoSQL家族中的一员, 替代用表储存数据的经典的关系型数据库, MongoDB的数据储存结构类似于用动态视图(dynamic schemas)储存类JSON文档(JSON-like documents) (MongoDB称这种格式为BSON, 将数据尽早尽快地整合成对应的应用类型.

安装[编辑 | 编辑源代码]

由于 MongoDB 修改了软件授权协议,官方软件仓库已经删除了此软件包 [1]

对于可用的最新版本,请安装以下软件之一:

或者,也可以使用旧版本的MongoDB:

Tools[编辑 | 编辑源代码]

还可以找到打包的其他MongoDB工具:

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

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