Мне нужен сценарий оболочки bash, который я могу запустить с помощью задания cron, чтобы проверить, запущен ли mysql на удаленном сервере. Если это так, то ничего не делайте, остальные запускают сервер.
Cronjob будет проверять удаленный сервер на наличие (или нет) mysql каждую минуту. Я могу написать задание cron самостоятельно, но мне нужна помощь со сценарием оболочки, который проверяет, работает ли удаленный mysql или нет. Ответ после проверки, вверх или вниз не важен. Но проверка важна.
Спасибо.
Присоединиться mysqld
с помощью mysqladmin
В документации MySQL говорится о mysqladmin ping
Проверить, доступен ли сервер. Статус возврата от mysqladmin - 0, если сервер работает, 1, если нет. Это 0 даже в случае ошибки, такой как доступ запрещен, потому что это означает, что сервер запущен, но отказался от соединения, что отличается от того, что сервер не работает.
Сначала создайте пользователя без прав
mysql> GRANT USAGE ON *.* TO ping@'%' IDENTIFIED BY 'ping';
Создайте такой скрипт
#!/bin/bash
MYSQL_USER=ping
MYSQL_PASS=ping
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqladmin ping ${MYSQL_CONN} 2>/dev/null 1>/dev/null
MYSQLD_RUNNING=${?}
if [ ${MYSQLD_RUNNING} -eq 1 ]; then service mysql start ; fi
Поместите этот скрипт в crontab, как хотите
Убедитесь, что на 3306 открыт брандмауэр, чтобы можно было подключиться ping @ '%'.
Проверить это просто:
mysql -e "select 1" || echo down
Вы можете заменить echo командой ssh в root, чтобы запустить службу, но это кажется немного рискованным. Это может иметь последствия для безопасности. Это может быть ненадежно. Я бы посоветовал вам, вероятно, иметь для этого какое-то подходящее программное обеспечение для кластеров / аварийного переключения. Есть MySQL MMM, который мы раньше использовали, но я понимаю, что он вышел из моды.
Предполагая, что у вас будет sshkey auth для входа без пароля для пользователя root на удаленный компьютер, вы можете выполнить следующую команду -
ssh remotemysql "if ['ps -efww | grep mysql | grep -v grep']; then echo" server is up "; else echo" server is down "; fi"
замените echo "server is down" на сценарий запуска mysql. скажем /etc/init.d/mysqld start
Как сказал @khaled в ветке комментариев к вашему вопросу, было бы намного надежнее реализовать keepalived. Это не так страшно, как вы думаете. keepalived будет управлять плавающим IP-адресом, и вы дадите ему команду запустить сценарий в случае аварийного переключения. Вот статья о том, как настроить keepalived с помощью mysql:
https://alexzeng.wordpress.com/2012/10/31/how-to-setup-mysql-ha-by-using-keepalived/
Вы можете изменить эту конфигурацию, чтобы установить основной и резервный вместо того, чтобы они оба были резервными (в случае, если вы хотите, чтобы автоматическое восстановление после сбоя было восстановлено после восстановления основного узла).
Мне нужен сценарий оболочки bash, который я могу запустить с помощью задания cron, чтобы проверить, запущен ли mysql на удаленном сервере.
Это наполняет меня трепетом. Я не могу представить, почему кто-то может подумать, что это хороший способ управления службой. Mysql поставляется со сценариями запуска, которые будут интегрированы с systemd и sysvinit, которые являются стандартными способами запуска службы в системе Linux / Unix. Systemd имеет встроенную возможность перезапуска отказавшей службы, но я никогда не видел, чтобы конфигурация по умолчанию использовала эту опцию по очень очевидным причинам, и если бы для этого была веская причина, ее можно было бы вызвать с респауном из inittab на sysV система. Если это связано с запуском экземпляра СУБД для каждого пользователя (как это делает Kmail), то триггером должен управлять сеанс пользователя, а не cron.
Но если оставить в стороне законность вопроса, использование mysql или mysqladmin для мониторинга состояния службы влечет за собой раскрытие учетных данных для подключения к базе данных, что не очень хорошая идея с точки зрения безопасности. Это также создает сложности с управлением ресурсами (когда вы достигнете максимального количества подключений, может показаться, что ваша служба не работает)
Вы можете определить, запущена ли служба из: