Использование Supervisord для управления процессом Mongos - PullRequest
0 голосов
/ 02 мая 2018

фон

Я пытаюсь автоматизировать перезапуск в случае сбоя или перезагрузки для 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

1 Ответ

0 голосов
/ 17 мая 2018

Для запуска монго на переднем плане установите следующую опцию

#how the process runs
processManagement:
    fork: false  # fork and run in background

с этой и выше supervisord.conf настройкой, mongos будет запущен и под управлением supervisord

...