【译】管理MongoDB进程


MongoDB作为一个标准的程序运行。我们可以在命令行通过发送mongod命令和指定选项来启动MongoDB。MongoDB也可以作为一个Windows服务来运行。

下面的示例假设包含mongod进程的目录已经在我们的系统目录中。mongod进程是运行在一个单一服务器上的主要数据库进程。mongos提供了一个与客户端部分一致的MongoDB接口。mongo二进制提供了管理的shell。

本文档讨论了mongod进程,但是本文档的一些部分也适用于mongos实例。

启动mongod进程

默认地,MongoFB监听来自客户端在27017端口上的连接,并且将数据存储在/data/db目录下。

在Windows下,该路径为我们启动MongoDB的驱动上。例如,如果我们没有指定--dbpath,在C:\驱动启动一个MongoDB服务器,会将所有的数据文件存储在C:\data\db上。

如果使用所有默认的配置启动MongoDB,可以在系统shell中使用下面的命令:

mongod

指定一个数据目录

如果我们希望mongod在非/data/db
的路径下存储数据文件,那么我们可以指定一个dbPath。该路径在我们启动mongod之前必须存在。如果不存在,则创建该目录和权限,以保证mongod可以向该路径读写数据。

使用--dbpath选项指定mongod使用的数据库路劲来作为一个数据目录。下面的调用将会启动一个mongod实例,并且将数据存储在/srv/mongodb路径下:

mongod --dbpath /srv/mongodb/

指定一个TCP端口

每次一个单独的进程只能监听一个网络接口上的连接。如果我们在一台机器上启动了多个mongod进程,或者有其它进程必须使用这个端口,我们必须给每个进程分配一个不同的端口来监听客户端连接。

在命令行使用--port选项来指定mongod的端口。下面的命令启动一个mongod来监听端口12345

mongod --port 12345

尽可能使用默认的端口号以避免混淆。

启动mongod作为后台进程

使用--fork--logpath选项来启动mongod进程作为后台进程(例如,fork),并且将其输出写入到一个日志文件中。我们必须创建日志目录,但是如果该目录不存在,mongod将会创建日志 文件。

下面的命令启动mongod作为一个后台进程并且将日志记录输出到/var/log/mongodb.log

mongod --fork --logpath /var/log/mongodb.log

其它配置选项

可以查阅文档了解更多常用用户案例的通用配置和部署。

命令行和配置文件接口都为MongoDB管理员提供了大量的选项和配置用于控制数据库系统的操作。下面我们将介绍一些常用配置和通用用户案例的最佳实例实例。

尽管两种接口都提供了对相同集合选项和设置的存取,在这里,我们将主要介绍配置文件接口。如果我们使用一个初始化脚本或者直接从操作系统的包里安装的MongoDB,那么我们有可能已经在/etc/mongodb.conf下有了默认的配置文件。通过检查/etc/init.d/mongod或者/etc/rc.d/mongod脚本的内容来保证初始化脚本使用合适的配置文件启动mongod。

如果希望使用该配置文件启动MongoDB实例,以下列形式发送一个命令:

mongod --config /etc/mongod.conf
mongod -f /etc/mongod.conf

修改我们系统中/etc/mongod.conf文件的值来控制我们数据库实例的配置。

配置数据库

考虑下面使用YAML形式的基本配置:

 processManagement:
   fork: true
net:
   bindIp: 127.0.0.1
   port: 27017
storage:
   dbPath: /srv/mongodb
systemLog:
   destination: file
   path: "/var/log/mongodb/mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true

或者之前.ini配置文件形式:

fork = true
bind_ip = 127.0.0.1
port = 27017
quiet = true
dbpath = /srv/mongodb
logpath = /var/log/mongodb/mongod.log
logappend = true
journal = true

对于大多数单机的服务器而言,上面已经包含了足够多的基本配置。其进行了几个假设,但是考虑下面的解释:

  • forktrue:启动了mongod的后台模式,使得MongoDB与当前会话分开,并且允许我们将数据库运行为一个普通的服务器。
  • bindIp127.0.0.1,强制服务器只监听本地IP的请求。只绑定应用级别系统可以读取的由系统网络提供的存取控制过滤的安全接口(例如,防火墙),从2.6版本开始,从官方.deb.rpm包安装的mongod将bind_ip配置默认设置为127.0.0.1
  • port27017,默认的实例的MongoDB端口,MongoDB可以绑定任何端口。我们也可以使用网络过滤工具过滤基于端口的存取。UNIX系列的系统要求超级用户权限来讲进程保定到小于1024的端口上。
  • quiettrue,这禁止了输出/日志文件中大多数严格的条目,推荐用于生产系统。如果设置了该选项,我们可以使用setParameter来修改运行时间内的设置。
  • dbPath/srv/mongodb,指定了MongoDB存储数据文件的位置,/srv/mongodb/var/lib/mongodb是比较通用的位置。运行mongod的用户账号需要有该目录的读写权限。
  • systemLog.path/var/log/mongodb/mongodb.log,是mongod将会写入输出的地方。如果我们不指定这个值,那么mongod将会将其输出写入到标准输出中(例如,stdout
  • logAppendtrue,保证了mongod不会将接下来的服务器启动操作覆盖写入一个已有的日志文件。
  • storage.journal.enabled是true,启动日志。日志保证了单一实例的写能力。64位版本的mongod默认启动日志。因此,该设置可能是多余的。

停止mongod进程

在一个正常的关闭中,mongod完成所有等待的操作,将所有数据写入到数据文件中,然后关闭所有的数据文件,所有其它的关闭都是非干净的,可能会影响数据文件的可靠性。

为了保证一个干净的关闭,使用下列方法中的一个来关闭mongod实例:

使用shutdownServer()

在mongo shell中使用db.shutdownServer()方法来关闭mongod,如下所示:

use admin
db.shutdownServer()

在初始化脚本中调用相同的方法来得到相同的结果。

对于启用了授权的系统,用户只有在授权了admin数据库的情况下才能使用db.shutdownServer()或者在wei通过系统上本地接口来使用该命令进行关闭。

使用--shutdown

在Linux命令行中,使用--shutdown选项来关闭mongod,如下命令所示:

mongod --shutdown

使用CTRL-C

在一个交互模式下运行mongod实例时,使用Control-C来执行干净的关闭。

使用kill

在Linux命令行中,使用下列命令之一来关闭指定的mongod实例:

kill <mongod process ID>
kill -2 <mongod process ID>

警告:千万不要使用kill -9(例如,SIGKILL)来终止mongod实例。

停止一个复制集

流程

如果mongod是复制集中的主节点,那么该mongod实例的关闭过程有如下几步:

  • 查看从节点的时新性
  • 如果没有从节点与主节点的时间间隔在10秒之内,那么mongod将会返回一个它不会关闭的信息。我们可以给关闭命令传递一个timeoutSecs参数来等待从节点赶上
  • 如果存在一个从节点与主节点的时间间隔在10秒之内,那么主节点将会降级并且等待从节点追上
  • 在60秒之后或者一旦从节点追上之后,主节点将会关闭

强制复制集关闭

如果没有最新的从节点但是我们又想要关闭主节点,在shutdown命令中增加一个force的参数,如下面的mongo shell操作所示:

db.adminCommand({shutdown:1. force: true})

如果想要在没有最新从节点的情况下,保持检查从节点固定秒,在shutdown中使用timeoutSecs参数。MongoDB将会在没有最从节点的情况下持续检查从节点一段时间。如果任何一个从节点在指定的时间内追上了,那么主节点将会关闭。如果没有从节点追上,那么它将不会关闭。

下面的命令将shutdown中的timeoutSecs参数设置为5

db.adminCommand({shutdown: 1, timeoutSecs: 5})

我们也可以选择在db.shutdownServer()方法中使用timeoutSecs参数:

db.shutdownServer({timeoutSecs: 5})

终止正在运行的操作

MongoDB提供了两种方法来终止正在运行的操作:maxTimeMS()db.killOp()。根据需要使用这些操作来控制MongoDB部署中操作的行为。

可使用的过程

maxTimeMS

2.6版本开始。maxTimeMS()方法设置了操作的时间限制,当操作到达了指定的时间限制时,MongoDB在下一个终止点终止该操作。

终止一个查询
在 mongo shell 中,使用下面的方法为查询设置一个30毫秒的时间限制:

db.location.find( { "town": { "$regex": "(Pine Number)", "$options": 'i' } } ).maxTimeMS(30)

终止一个命令
考虑一个潜在长运行时间的操作:使用distinct返回每个collection字段有city键值的操作:

db.runCommand( { 
distinct: "collection", 
key: "city" } )

我们可以向命令的文档中增加一个maxTimeMS的字段来为该操作设置一个45毫秒的时间限制:

db.runCommand( { 
distinct: "collection",
key: "city",
maxTimeMS: 45 } )

db.getLastError()db.getLastErrorObj()将会返回被终止选项的错误:

{ "n" : 0,
  "connectionId" : 1,
  "err" : "operation exceeded time limit",
  "ok" : 1 }

killOp

db.killOp()方法将会在下一个中断点中断一个正在运行的操作,killOp()通过操作ID来表示目标操作。

db.killOp(<opId>)

警告:在终止正在运行的操作时需要特别小心。使用db.killOp()方法来终止客户端初始化的操作,千万不要 终止内部 的数据库操作。

参考文献

打赏

mickey

记录生活,写给几十年后的自己。