фон
Я пытаюсь автоматизировать перезапуск в случае сбоя или перезагрузки для mongos процесса, используемого в настройке mongodb sharded.
Случай 1 : с использованием прямой команды, с mongod user
конфигурация супервизора
[program:mongos_router]
command=/usr/bin/mongos -f /etc/mongos.conf --pidfilepath=/var/run/mongodb/mongos.pid
user=mongod
autostart=true
autorestart=true
startretries=10
Результат
журнал наблюдений
INFO spawned: 'mongos_router' with pid 19535
INFO exited: mongos_router (exit status 0; not expected)
INFO gave up: mongos_router entered FATAL state, too many start retries too quickly
mongodb log
2018-05-01T21:08:23.745+0000 I SHARDING [Balancer] balancer id: ip-address:27017 started
2018-05-01T21:08:23.745+0000 E NETWORK [mongosMain] listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:27017
2018-05-01T21:08:23.745+0000 E NETWORK [mongosMain] addr already in use
2018-05-01T21:08:23.745+0000 I - [mongosMain] Invariant failure inShutdown() src/mongo/db/auth/user_cache_invalidator_job.cpp 114
2018-05-01T21:08:23.745+0000 I - [mongosMain]
***aborting after invariant() failure
2018-05-01T21:08:23.748+0000 F - [mongosMain] Got signal: 6 (Aborted).
Процесс считается запущенным. Но если убит не перезапускается автоматически.
Случай 2 : Использование сценария инициализации
здесь небольшое изменение в сценарии состоит в том, что некоторые ulimit
команды, создание pid-файлов должны выполняться от имени пользователя root, а затем фактический процесс должен запускаться от имени mongod
пользователя.
скрипт mongos
start()
{
# Make sure the default pidfile directory exists
if [ ! -d $PID_PATH ]; then
install -d -m 0755 -o $MONGO_USER -g $MONGO_GROUP $PIDDIR
fi
# Make sure the pidfile does not exist
if [ -f $PID_FILE ]; then
echo "Error starting mongos. $PID_FILE exists."
RETVAL=1
return
fi
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
ulimit -u 64000
ulimit -l unlimited
echo -n $"Starting mongos: "
#daemon --user "$MONGO_USER" --pidfile $PID_FILE $MONGO_BIN $OPTIONS --pidfilepath=$PID_FILE
#su $MONGO_USER -c "$MONGO_BIN -f $CONFIGFILE --pidfilepath=$PID_FILE >> /home/mav/startup_log"
su - mongod -c "/usr/bin/mongos -f /etc/mongos.conf --pidfilepath=/var/run/mongodb/mongos.pid"
RETVAL=$?
echo -n "Return value : "$RETVAL
echo
[ $RETVAL -eq 0 ] && touch $MONGO_LOCK_FILE
}
daemon
comman представляет оригинальный скрипт, но демонизация в рамках supervisord не логична, поэтому использование команды для запуска процесса на переднем плане (?)
supervisord config
[program:mongos_router_script]
command=/etc/init.d/mongos start
user=root
autostart=true
autorestart=true
startretries=10
Результат
журнал наблюдений
INFO spawned: 'mongos_router_script' with pid 20367
INFO exited: mongos_router_script (exit status 1; not expected)
INFO gave up: mongos_router_script entered FATAL state, too many start retries too quickly
mongodb log
Nothing indicating error, normal logs
Процесс считается запущенным. Но если убитый не перезапускается автоматически.
Проблема
Как правильно настроить скрипт / без опции скрипта для запуска mongos под супервизором?
РЕДАКТИРОВАТЬ 1
Измененная команда
sudo su -c "/usr/bin/mongos -f /etc/mongos.conf --pidfilepath=/var/run/mongodb/mongos.pid" -s /bin/bash mongod`
Это работает, если запускается отдельно в командной строке, а также в части скрипта, но не с супервизором
РЕДАКТИРОВАТЬ 2
Добавлена следующая опция в файл конфигурации для mongos
, чтобы заставить его работать на переднем плане
processManagement:
fork: false # fork and run in background
Теперь командная строка и скрипт правильно запускают его на переднем плане, но supervisord не запускает его. В то же время при запуске из командной строки или скрипта отображаются 3 процесса
root sudo su -c /usr/bin/mongos -f /etc/mongos.conf --pidfilepath=/var/run/mongodb/mongos.pid -s /bin/bash mongod
root su -c /usr/bin/mongos -f /etc/mongos.conf --pidfilepath=/var/run/mongodb/mongos.pid -s /bin/bash mongod
mongod /usr/bin/mongos -f /etc/mongos.conf --pidfilepath=/var/run/mongodb/mongos.pid
РЕДАКТИРОВАТЬ 3
При следующих настройках supervisord
все работает нормально. Но я хочу попытаться выполнить скрипт, если это возможно, чтобы установить ulimit
[program:mongos_router]
command=/usr/bin/mongos -f /etc/mongos.conf --pidfilepath=/var/run/mongodb/mongos.pid
user=mongod
autostart=true
autorestart=true
startretries=10
numprocs=1