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 может блокировать внешние подключения.