Назад | Перейти на главную страницу

Как сделать так, чтобы при смене состояния чаще проводился мониторинг?

Я использую Monit для мониторинга различных процессов, которые необходимо запустить и запустить. как группа для правильной работы веб-сайта. Чтобы вызвать или отключить сайт, существует определенный порядок, в котором процессы должны быть запущены или остановлены. Зависимости следующие. (Имена были изменены, чтобы защитить невиновных. Я использую более описательные имена в реальной конфигурации.)

  1. Сервис site зависит от site.workerA, site.workerB и site-redis.

  2. Оба работника зависят от site-redis.

Сайт всегда запускается или останавливается через Monit, чтобы избежать возможных условий гонки, или Monit работает против меня. (например, я останавливаю службу, а Monit продолжает ее запускать.)

Проблема в том, что для запуска всего сайта требуется гораздо больше времени, чем необходимо. Если я проинструктирую Monit запустить сайт, то после того, как Monit определит зависимости, последовательность действий со стороны Monit будет такой:

  1. Начинается site-redis.
  2. Спит 2 минуты.
  3. Обнаруживает, что site-redis работает, поэтому запустите двух рабочих.
  4. Спит 2 минуты.
  5. Обнаруживает, что рабочие и redis работают, поэтому запустите site.
  6. [Спит 2 минуты]
  7. [Обнаруживает, что site это работает.]

Я заключил в скобки последние два шага, потому что они практически не обсуждаются, поскольку сайт фактически запущен и работает до последнего двухминутного интервала.

Двухминутный спящий режим - это интервал опроса по умолчанию, который Monit использует для проверки служб. Я знаю, что могу уменьшить этот интервал, чтобы эти службы всегда опрошены чаще. Например, я мог бы сделать

check process site.workerB pidfile "/srv/site/var/run/site/site.workerB.pid"
    every [number] cycles
    ...

Мне также пришлось бы изменить длину цикла опроса на что-то меньшее, чтобы цикл составлял менее 2 минут.

Однако я не хочу, чтобы Монит всегда чаще опрашивайте эти службы. Я бы хотел, чтобы Monit чаще опрашивал службы только тогда, когда находится в процессе ожидания изменения состояния. Скажем, если Monit запустил службу, и от нее зависит другая служба, опросите с интервалом в 5 секунд, а не с 2 минутами.

Я не вижу возможности настроить Monit для этого, но, возможно, я что-то пропустил.


Вот иллюстрация к описанию моей прозы выше. После удаления вещей, которые не имеют отношения к проблеме, конфигурация Monit будет такой:

check process site-redis pidfile ".../site/redis.pid"
      group site
      start program = ...
      stop program = ...
      if does not exist then start

check process site pidfile ".../site/site.pid"
      group site
      depends on site.workerA, site.workerB, site-redis
      start program = ...
      stop program = ...
      if does not exist then start

check process site.workerA pidfile ".../site/site.workerA.pid"
      group site
      depends on site-redis
      start program = ...
      stop program = ...
      if does not exist then start

check process site.workerB pidfile ".../site/site.workerB.pid"
      group site
      depends on site-redis
      start program = ...
      stop program = ...
      if does not exist then start

Фактически вы можете инициировать повторную оценку мониторинга, monit validate или SIGUSR1.

Таким образом, вы можете переписать свои программы запуска / остановки на:

#!/bin/bash

function background {
    i="0"
    while [ $i -lt 20 ]; do
        monit validate > /dev/null
        monit status __YOUR__SERVICE__NAME__HERE__ | grep OK > /dev/null && exit 0
        sleep 5
        i=$[$i+1]
    done
}


# restart procedure


state=$?

background &

exit $state

Короче говоря: после завершения процедуры перезапуска отслеживается ее код выхода и запускается фоновый цикл. Он запускается 20 раз и спит по 5 секунд после каждого запуска (~ 1 мин 40 с). Он заставляет monit переоценивать свое состояние и выходит из цикла, если состояние OK. Если нет, цикл продолжается. Наконец, сам сценарий завершается с кодом выхода процедуры перезапуска.