Обходной путь противодействия отказоустойчивости / альтернативы - PullRequest
0 голосов
/ 17 января 2020

Я использую monit для мониторинга моего демона с помощью HTTP API и перезапускаю его при необходимости. Помимо проверки того, что процесс не остановлен, я также добавил проверку HTTP (if failed port 80 protocol http request "/api/status") со счетчиком отказоустойчивости (for N cycles). Я использую счетчик, чтобы избежать перезапуска демона в случае единичных неудачных запросов (например, из-за высокой нагрузки). Проблема в том, что счетчик сбоев не сбрасывается после успешного перезапуска демона. То есть рассмотрим следующий сценарий:

  1. Monit и демон запущены.
  2. Демон заблокирован (например, из-за программной ошибки) и перестает отвечать на запросы HTTP.
  3. Monit ожидает N последовательных сбоев HTTP-запроса и перезапускает демон.
  4. Первый HTTP-запрос monit после перезапуска демона снова завершается сбоем (например, потому что демону требуется некоторое время, чтобы подключиться и начать обслуживание запросы).
  5. Monit перезапускает демона снова. Go до пункта 4.

Кажется, это ошибка, и на самом деле существует проблема 64 (исправлено) и 787 (открыто). Поскольку второй выпуск открывается уже год, у меня нет особых надежд на его скорейшее исправление, поэтому я хотел бы знать, есть ли хороший обходной путь для этого случая.

1 Ответ

0 голосов
/ 21 января 2020

Хотя это не совсем то, что мне было нужно, я выбрал следующую альтернативу:

  1. Использовать достаточно большое значение для параметра timeout токена start program, чтобы дать серверу достаточно получить онлайн. Мониторинг в это время не проверяет соединения.
  2. Используйте параметр retry в предложении if failed port, чтобы допустить единичные сбои. К сожалению, повторные попытки выполняются немедленно (после сбоя запроса или timeout), а не в следующем цикле опроса.
  3. Используйте параметр for N cycles, чтобы повысить отказоустойчивость хотя бы частично.

По сути, у меня есть следующая структура monitr c:

set daemon 5
check process server ...
   start program = "..." with timeout 60 seconds
   stop program = "..."
   if failed port 80 protocol http request "/status" with retry 10 and timeout 5 seconds for 5 cycles then restart
...