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

Monit не может обнаружить MySQL, но я могу

Monit настроен на наблюдение за MySQL на локальном хосте через порт 3306.

check process mysqld with pidfile /var/lib/mysql/li175-241.pid
  start program = "/etc/init.d/mysql start"
  stop program = "/etc/init.d/mysql stop"
  if failed port 3306 protocol mysql then restart
  if 5 restarts within 5 cycles then timeout

Мое приложение, настроенное для подключения к MySQL через localhost: 3306, работает нормально и может получить доступ к базе данных. Я даже могу использовать MySQL Query Browser для удаленного подключения к базе данных через порт 3306. Порт полностью открыт и к нему можно подключиться. Поэтому я чертовски уверен, что он работает.

Однако бег monit -v показывает, что Monit не может обнаружить MySQL на этом порту.

'mysqld' failed, cannot open a connection to INET[localhost:3306] via TCP

Это происходит постоянно, пока Monit не решит больше не отслеживать MySQL в соответствии с настройками.

Как я могу приступить к устранению этой проблемы?


sudo netstat -lnp | grep mysql возвращает следующее:

tcp        0      0 173.230.135.241:3306    0.0.0.0:*               LISTEN      14357/mysqld    
unix  2      [ ACC ]     STREAM     LISTENING     265228   14357/mysqld        /var/run/mysqld/mysqld.sock

Ошибка mysqld, не удается открыть соединение с INET [localhost: 3306] через TCP

Эта ошибка показывает, что monit пытается подключиться к порту 3306 на локальном хосте, который является IP-адресом 127.0.0.1.

tcp 0 0 173.230.135.241:3306 0.0.0.0:* СЛУШАТЬ 14357 / mysqld

Этот вывод netstat показывает, что mysqld прослушивает указанный IP-адрес. Он не слушает на локальном хосте.

Вам либо нужно заставить mysqld также прослушивать локальный хост, либо вам нужно указать monit, чтобы он проверял конкретный IP-адрес, вместо того, чтобы использовать по умолчанию localhost.

Это работает для меня - используя сокет mysql, а не его порт (на машине debian):

check process mysql with pidfile /var/run/mysqld/mysqld.pid
   group database
   start program = "/etc/init.d/mysql start"
   stop program = "/etc/init.d/mysql stop"
   #if failed host 192.168.1.222 port 3306 protocol mysql then restart
   if failed unix "/var/run/mysqld/mysqld.sock" protocol mysql then restart
   depends on mysql_bin
   depends on mysql_rc

 check file mysql_bin with path /usr/bin/mysql
   group database
   if failed checksum then unmonitor
   if failed permission 755 then unmonitor
   if failed uid root then unmonitor
   if failed gid root then unmonitor

 check file mysql_rc with path /etc/init.d/mysql
   group database
   if failed checksum then unmonitor
   if failed permission 755 then unmonitor
   if failed uid root then unmonitor
   if failed gid root then unmonitor

Я только что нашел этот вопрос, потому что у меня была такая же проблема. При запуске Monit 5.12.2 фокус в том, чтобы верхний регистр в протокол. Вот что мне понравилось:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid
    group database
    start program "/root/scripts/restart.mysql.sh" with timeout 900 seconds
    stop program = "/etc/init.d/mysql stop"
    if failed port 3306 protocol MYSQL then restart
    if failed unixsocket /var/run/mysqld/mysqld.sock protocol MYSQL then restart
    if 5 restarts within 5 cycles then timeout
    depends on mysql_bin
    depends on mysql_rc

Ваше приложение работает на том же сервере, что и mysql? Монит работает на том же сервере?

Mysql может блокировать внешние подключения.