Как автоматически перезапустить MySQL и MongoDB, если они не отвечают?

Как автоматически перезапустить MySQL и MongoDB, если они не отвечают?

Я использую простой сервер разработки (Ubuntu), на котором MySQL и MongoDB иногда падают. Я всегда перезапускаю их с помощью sudo service mysql restart.

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

Я читал о таких инструментах, какНагиос, но я думаю, что это немного перебор в моей ситуации.

Кто-нибудь знает, как мне начать?

решение1

Я читал о таких инструментах, какНагиос, но я думаю, что это немного перебор в моей ситуации.

Кто-нибудь знает, как мне начать?

Легко. Посмотрите, как настроить конфигурации мониторинга с помощьюМонит. Это легкий и простой в настройке инструмент мониторинга системы, который очень полезен для настройки в сценариях, которые вы описываете: служба выходит из строя, перезапускаю ее и оповещаю меня об этом.

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

Настройка Монитора.

Я настроил это так. Сначала установите саму программу Monit следующим образом:

sudo apt-get install monit

После установки отредактируйте конфигурацию здесь; я предпочитаю использовать , nanoно вы можете использовать любой текстовый редактор, который вам больше нравится:

sudo nano /etc/monit/monitrc

Измените значения демона по умолчанию для проверки служб каждые 60 секунд с задержкой запуска 120:

set daemon 60
with start delay 60

Затем найдите mailserverобласть monitrcи добавьте следующую строку. Для работы этого необходимо активировать Postfix или SMTP. Обычно на моих серверах установлен Postfix, поэтому я использую следующую настройку:

set mailserver localhost

Затем я убеждаюсь, что каталог конфигурации Monit настроен следующим образом:

sudo mkdir -p /etc/monit/conf.d

Настройка набора правил мониторинга Monit Apache2.

Теперь — как я уже сказал — я в основном использую Monit для мониторинга Apache, поэтому это простая конфигурация, которую мне нравится использовать, но основная концепция похожа для MySQL, MongoDB или других вещей. Я бы сохранил ее в этом файле:

sudo nano /etc/monit/conf.d/apache2.conf

И вот содержимое этого файла:

check process apache with pidfile /var/run/apache2.pid
  start "/usr/sbin/service apache2 start"
  stop  "/usr/sbin/service apache2 stop"
  if failed host 127.0.0.1 port 80
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

Синтаксис достаточно понятен, но в целом:

  • Процесс зависит от apache2.pid; обязательно измените его так, чтобы он соответствовал фактическому местоположению вашего apache2.pidили httpd.pidв вашей среде.
  • Затем идут команды, связанные с процессами startи stop.
  • И имеет логику, которая контролирует веб-сервер на 80порту localhost( 127.0.0.1)
  • И только действия сервера недоступны в течение 15 секунд.
  • А если ему приходится действовать, он пытается перезапустить.
  • А затем отправляет оповещение на указанный адрес электронной почты в случае истечения времени ожидания сервера или его отсутствия.

Настройка набора правил мониторинга Monit MySQL.

На основепримеры, на которые я ссылался выше, я бы предположил, что такая конфигурация будет работать для MySQL. Сначала создайте файл вроде этого:

sudo nano /etc/monit/conf.d/mysql.conf

И я адаптировал пример так, чтобы он, как я предполагаю, вел себя аналогично тому, что я настроил для Apache:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid
  start program = "/usr/sbin/service mysql start"
  stop program = "/usr/sbin/service mysql stop"
  if failed host 127.0.0.1 port 3306 protocol mysql
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

Конечно, это следует подкорректировать в соответствии с вашей фактической рабочей средой, например, скорректировать местоположение mysqld.pid, адрес электронной почты и т. д., но в остальном это довольно общие идеи/реализация.

После настройки перезагрузите компьютер, monitи все должно быть хорошо:

sudo service monit restart

Настройка набора правил мониторинга Monit MongoDB.

Чтобы создать набор правил мониторинга MongoDB, создайте файл следующего вида:

sudo nano /etc/monit/conf.d/mongod.conf

А вот правило мониторинга MongoDB; обратите внимание, что оно соответствует активному демону MongoDB, а не PID (он же: mongod.lock), поскольку с ним оно, похоже, не работает:

check process mongod matching "/usr/bin/mongod"
  start program = "/usr/sbin/service mongod start"
  stop program = "/usr/sbin/service mongod stop"
  if failed host 127.0.0.1 port 27017 protocol http
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

Конечно, это следует настроить в соответствии с вашей реальной рабочей средой, например, скорректировать фактический путь к /usr/bin/mongodдвоичному файлу, адрес электронной почты и т. д., но в остальном это довольно общие идеи/реализация.

После настройки перезагрузите компьютер, monitи все должно быть хорошо:

sudo service monit restart

Мониторинг Монит.

Вы можете следить за журналом Monit, чтобы увидеть его в действии:

sudo tail -f -n 200 /var/log/monit.log

И в качестве теста вы можете просто остановить сервер MySQL или MongoDB и посмотреть, что отображается в этом журнале. Если все пройдет хорошо, вы должны увидеть весь процесс мониторинга и перезапуска, включая отправку электронного письма на адрес, который вы указали в конфигурации.

решение2

Для этой работы подойдет простой скрипт bash (или любой другой знакомый вам язык сценариев) (его нужно запустить с помощью sudo):

while true
do
    # Ping the MySQL server (or run a real SELECT command using mysql client)
    mysqladmin ping
    # Check the return code: should be 0 if server is alive
    if [[ $? != 0 ]]
    then
        service mysql restart
    fi
    # Wait until next check
    sleep 60
done

Связанный контент