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 配置,因为它还需要在启动时定义配置数据库和端口信息。
出于测试目的,我在本地环境中创建了一个分片。
我在 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 配置,因为它还需要在启动时定义配置数据库和端口信息。