Ubuntu:启动(Upstart)MongoDB的第二个实例

12

自带的标准 upstart 脚本适用于 MongoDB:

# Ubuntu upstart file at /etc/init/mongodb.conf

limit nofile 20000 20000

kill timeout 300 # wait 300s between SIGTERM and SIGKILL.

pre-start script
    mkdir -p /var/lib/mongodb/
    mkdir -p /var/log/mongodb/
end script

start on runlevel [2345]
stop on runlevel [06]

script
  ENABLE_MONGODB="yes"
  if [ -f /etc/default/mongodb ]; then . /etc/default/mongodb; fi
  if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec  /usr/bin/mongod -- --config /etc/mongodb.conf; fi
end script
如果我想运行第二个 mongod 实例,我认为我只需将 /etc/mongodb.conf 文件和 /etc/init/mongodb.conf 文件分别复制到 /etc/mongodb2.conf/etc/init/mongodb2.conf,并在第一个配置文件中更改标准端口。然后调整上面的脚本以使用新创建的 /etc/mongodb2.conf 启动。

然后我只需说start mongodb2,服务就会启动...但它会在启动后立即停止。我需要更改什么才能使两个进程都运行起来?

 # Ubuntu upstart file at /etc/init/mongodb2.conf

limit nofile 20000 20000

kill timeout 300 # wait 300s between SIGTERM and SIGKILL.

pre-start script
    mkdir -p /var/lib/mongodb2/
    mkdir -p /var/log/mongodb2/
end script

start on runlevel [2345]
stop on runlevel [06]

script
  ENABLE_MONGODB="yes"
  if [ -f /etc/default/mongodb ]; then . /etc/default/mongodb; fi
  if [ "x$ENABLE_MONGODB" = "xyes" ]; then exec start-stop-daemon --start --quiet --chuid mongodb --exec  /usr/bin/mongod -- --config /etc/mongodb2.conf; fi
end script
6个回答

10

我无法让“标准”的Upstart脚本按照上面的描述正常工作,所以我进行了如下更改:

# Ubuntu upstart file at /etc/init/mongodb.conf

limit nofile 20000 20000

kill timeout 300 # wait 300s between SIGTERM and SIGKILL.

pre-start script
    mkdir -p /var/lib/mongodb/
    mkdir -p /var/log/mongodb/
end script

start on runlevel [2345]
stop on runlevel [06]

script

  exec sudo -u mongodb /usr/bin/mongod --config /etc/mongodb.conf

end script

如果你想运行其他的MongoDB实例,只需复制*.conf文件并更改/etc/mongodb2.conf/etc/init/mongodb2.conf中的内容即可。

# Ubuntu upstart file at /etc/init/mongodb2.conf

limit nofile 20000 20000

kill timeout 300 # wait 300s between SIGTERM and SIGKILL.

pre-start script
    mkdir -p /var/lib/mongodb2/
    mkdir -p /var/log/mongodb2/
end script

start on runlevel [2345]
stop on runlevel [06]

script

  exec sudo -u mongodb /usr/bin/mongod --config /etc/mongodb2.conf

end script

我认为唯一没有起作用的事情是 重启mongodb - 你需要先 停止 然后再 启动 ...


5
我知道已经有一个被接受的解决方案,但我认为这个更加优雅。
另一种方法是使用start-stop-daemon的pid文件创建。例如,我有两个运行在同一台服务器上的mongos,使用了两个不同的upstart脚本,这两行神奇的代码是:
exec start-stop-daemon --make-pidfile --pidfile /var/run/mongodb-router.pid --start --startas /data/bin/mongos --chuid mongo -- --logappend --logpath /mnt/log/mongos.log --configdb mongo2-config01,mongo2-config02,mongo2-config03


exec start-stop-daemon --make-pidfile --pidfile /var/run/mongodb-routerrt.pid --start --startas /data/bin/mongos --chuid mongo -- --logappend --logpath /mnt/log/mongos-rt.log --configdb mongort-config01,mongort-config02,mongort-config03 --port 27027

请注意,一个命令有'--pidfile /var/run/mongodb-router.pid',另一个命令有'--pidfile /var/run/mongodb-routerrt.pid'和不同的端口。

2
这是我的做法。 在同一台服务器上使用start-stop-daemon启动两个mongodb实例。
以下是我的start-stop-daemon配置。
exec start-stop-daemon --make-pidfile --pidfile /var/lib/mongodb/db1.pid --start --quiet --chuid mongodb --name mongod1 --exec /usr/bin/mongod -- --config etc/mongodb1.conf

exec start-stop-daemon --make-pidfile --pidfile /var/lib/mongodb/db2.pid --start --quiet --chuid mongodb --name mongod2 --exec /usr/bin/mongod -- --config etc/mongodb2.conf

请注意--name选项。对我来说,这就解决了问题。

Upstart在我添加了--name参数之前不允许我启动和停止多个mongod实例,谢谢! - thaddeusmt

2

今天我也遇到了同样的问题。原因是默认脚本使用start-stop-daemon启动mongo,该脚本专门设计用于确保只运行一个进程版本。您已经发现解决方法之一是不使用start-stop-daemon并自己启动二进制文件。这也是我使用的方法,但我很想知道是否有更好的方法。


1
我发现以下的upstart对我有用。
# Ubuntu upstart file at /etc/init/mongodb.conf

description "manage mongodb instance"

start on runlevel [2345]
stop on runlevel [06]

limit nofile 20000 20000

kill timeout 300 # wait 300s between SIGTERM and SIGKILL.

env MONGODB_USER=mongodb
env MONGODB_DATA=/var/lib/mongodb/
env MONGODB_LOG=/var/log/mongodb/
env MONGODB_PID=/var/run/mongodb.pid

pre-start script
  if [ ! -d $MONGODB_DATA ]; then
    mkdir -p $MONGODB_DATA
    chown $MONGODB_USER:$MONGODB_USER $MONGODB_DATA
  fi

  if [ ! -d $MONGODB_LOG ]; then
    mkdir -p $MONGODB_LOG
    chown $MONGODB_USER:$MOGODB_USER $MONGODB_LOG
  fi
end script

exec start-stop-daemon --start --pidfile $MONGODB_PID --chuid $MONGODB_USER:$MONGODB_USER --exec /usr/bin/mongod -- --config /etc/mongodb/mongodb.conf

pre-stop exec start-stop-daemon --signal QUIT --stop --quiet --pidfile $MONGODB_PID --chuid $MONGODB_USER:$MONGODB_USER --exec /usr/bin/mongod -- --config /etc/mongodb/mongodb.conf

1

两个守护进程不能在同一个TCP端口上监听,因此您必须更改mongod2的--port参数以便监听不同的端口。
两个守护进程不能共享相同的数据目录,因此您必须更改mongod2的--data-dir参数。


是的,我知道。这就是为什么我复制了/etc/mongodb2.conf并更改了端口和数据文件夹(如上所述)。但仍然无法工作... - Philipp Kyeck
2
抱歉,但您尚未发布配置文件,因此我猜测了一下。如果您通过控制台而不是守护进程手动启动第二个守护进程,会发生什么导致它过早退出? - ALoR
当我手动调用 mongod --config /etc/mognodb2.conf 时,它可以正常工作。 - Philipp Kyeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接