MongoDB 分片的 mongos 初始化脚本和配置服务器

Init scripts for mongos and config server for MongoDB sharding

出于测试目的,我在本地环境中创建了一个分片。

我在 1 台机器上有 3 个配置服务器,在同一台机器上有 1 个查询路由器,在两台不同的机器上有两个数据节点。

一切正常,但我的问题是我无法在不同端口上保持所有进程处于活动状态 运行ning,因为我没有任何启动/停止脚本。我 运行 在命令行上处理 & 最后使其处于活动状态,这是保持进程处于活动状态的非常糟糕的方式,有时它会自动死亡。

请帮助或提供一种使用脚本的方法,脚本还可以处理各种端口以激活单台机器上的所有进程。

您永远不应该希望从一个初始化脚本中驱动多个实例,因为当您对任何一个实例执行 startup/shutdown 时,这会产生大量额外的管理工作。

您应该为每个单独的数据库进程实例寻找一个初始化脚本,因为这是 Linux 最佳实践。

在大多数情况下,您应该能够使用 MongoDB 提供的通用初始化脚本,然后为每个数据库实例创建一个重命名的副本。

然后您应该为每个实例创建单独的配置文件,其中应该包含略有不同的配置,并且 运行 每个实例都有自己的端口、自己的数据库路径和自己的日志文件。

然后您可以将每个初始化脚本指向其实例的配置文件,一切都会按计划进行。

最后,在 MongoDB 中,您应该使用 --fork 选项,它提供了一种从 shell 实例中分离 MongoDB 的安全方法。如果您绝对必须继续使用 shell fork(& 运算符),那么您应该将 MongoDB 包装在 "nohup" 中,以避免实例因 shell 的终止而关闭。这看起来像: nohup <mongodb cmd and arguments> &

编辑: 您可以使用相同的过程来使用相同的初始化脚本来启动 MongoS。您需要找到将 mongod 二进制文件设置为要执行的那一行。在所有的 debian 衍生产品中,这将是 DAEMON 变量。将其更改为指向 mongos 而不是 mongod 然后就可以了。

对于配置服务器,我们可以使用以下脚本:

#!/bin/bash

### BEGIN INIT INFO
# Provides:        MongoDB Config Server
# Required-Start:  $network
# Required-Stop:   $network
# Default-Start:   2 3 4 5
# Default-Stop:    0 1 6
# Short-Description: Start/Stop MongoDB Config server
### END INIT INFO

start() {
        /usr/bin/mongod --configsvr --dbpath /home/configdb/ --port 27018 &
}

stop() {
        for a in `ps -ef | grep 27018 | awk '{print }'`; do kill -9 $a; done
}

case  in
  start|stop) ;;
  restart) stop; start;;
  *) echo "Run as [=10=] <start|stop|restart>"; exit 1;;
esac

我们可以使用如下示例的脚本 query_router:

#!/bin/bash

### BEGIN INIT INFO
# Provides:        MongoDB Config Server
# Required-Start:  $network
# Required-Stop:   $network
# Default-Start:   2 3 4 5
# Default-Stop:    0 1 6
# Short-Description: Start/Stop MongoDB Config server
### END INIT INFO

start() {
        /usr/bin/mongos --configdb 192.168.3.187:27018 --port 27019 &
}

stop() {
        for a in `ps -ef | grep 27019 | awk '{print }'`; do kill -9 $a; done
}

case  in
  start|stop) ;;
  restart) stop; start;;
  *) echo "Run as [=11=] <start|stop|restart>"; exit 1;;
esac

我们不能为 mongo 使用默认的 mongo 配置,因为它还需要在启动时定义配置数据库和端口信息。