Мониторинг. · 6 min read · Oct 09, 2025
Идеальный балансировщик нагрузки и высокодоступный веб-кластер с 2 серверами, работающими под Xen на Ubuntu 8.04 Hardy Heron - Страница 9
15. Пользовательские скрипты для мониторинга (lb1, lb2, web1, web2)
Я создал несколько bash-скриптов для мониторинга всей конфигурации (они немного неаккуратные, но работают). Если вы сделаете их лучше, не стесняйтесь отправить их мне!
15.1 Мониторинг с lb1.example.com
Сначала мы должны установить sendmail, чтобы lb1.example.com мог отправлять почту :
apt-get install sendmail
Первый скрипт будет проверять, доступен ли резервный балансировщик нагрузки (lb2.example.com) для переключения:
vi /root/lb2_check
#!/bin/bash
# Проверка резервного балансировщика нагрузки
# Авторские права (c) 2008 blogama.org
# Этот скрипт лицензирован под GNU GPL версии 2.0 или выше
# ---------------------------------------------------------------------
### Этот скрипт выполняет 1 проверку ###
### 1) Проверка, не вышел ли из строя резервный балансировщик нагрузки и отправка уведомления по почте ###
### Для изменения ###
EMAIL="[email protected]"
###### Не вносите изменения ниже ######
### Бинарные файлы ###
MAIL=$(which mail)
### Восстановить оригинал, когда проблема будет исправлена ###
if [ $1 ]; then
if [ $1=="fix" ]; then
rm /root/lb2_problem.txt
> /var/log/ha-log
exit 1;
fi
fi
### Проверка, было ли уже уведомление ###
cd /root
if [ -f lb2_problem.txt ]; then
exit 1;
fi
### Проверка, работает ли Heartbeat в горячем резерве ###
tail /var/log/ha-log 2>&1 | grep "Asking other side for ping node count"
if [ "$?" -ne "1" ]; then
echo "Резервный балансировщик нагрузки вышел из строя" > /root/lb2_problem.txt
$MAIL -s "Проблема с резервным балансировщиком нагрузки" $EMAIL < /root/lb2_problem.txt
fiМы делаем этот скрипт исполняемым :
chmod +x /root/lb2_check
Если lb2.example.com выходит из строя, он создаст файл /root/lb2_problem.txt и отправит уведомление по почте. Пока файл lb2_problem.txt существует, он не будет проверять снова. Также мы должны очистить файл журнала, как только проблема будет исправлена, чтобы скрипт работал правильно.
Как только проблема будет исправлена на lb2.example.com, пожалуйста, вручную выполните :
/root/lb2_check fix
Следующий скрипт будет проверять, не вышли ли из строя какие-либо порты на web1 или web2, проверяя файл журнала ldirectord. В ldirectord уже есть уведомление по почте, но оно отправляет миллионы уведомлений, мой отправляет только одно, пока вы не исправите проблему :
vi /root/ports_failed
и сделайте его таким :
#!/bin/bash
# Проверка сбоев портов Ldirectord
# Авторские права (c) 2008 blogama.org
# Этот скрипт лицензирован под GNU GPL версии 2.0 или выше
# ---------------------------------------------------------------------
### Этот скрипт выполняет 1 проверку ###
### 1) Проверка на сбой порта на балансируемых серверах ###
### Для изменения ###
EMAIL="[email protected]"
###### Не вносите изменения ниже ######
### Бинарные файлы ###
MAIL=$(which mail)
#восстановить оригинал, когда проблема будет исправлена
if [ $1 ]; then
if [ $1=="fix" ]; then
rm /root/port_problem.txt
> /var/log/ldirectord.log
fi
fi
###проверка, было ли уже уведомление###
cd /root
if [ -f port_problem.txt ]; then
cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
exit 1;
fi
### Проверка, не вышел ли из строя порт ###
cat /var/log/ldirectord.log 2>&1 | grep Deleted
if [ "$?" -ne "1" ]; then
cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
cat "Проблема с портами, смотрите файл журнала /var/log/port_problem.log" > /root/port_problem.txt
$MAIL -s "Некоторые порты вышли из строя" $EMAIL < /root/port_problem.txt
fiМы делаем его исполняемым :
chmod +x /root/ports_failed
Это то же самое, что и первый скрипт, как только проблема будет исправлена, вы должны выполнить :
/root/ports_failed fix
чтобы скрипт снова заработал.
Теперь добавьте оба скрипта в ваш crontab :
crontab -e
* * * * * /root/ports_failed >/dev/null 2>&1
* * * * * /root/lb2_check >/dev/null 2>&115.2 Мониторинг с lb2.example.com
Мониторинг второго балансировщика нагрузки важен, потому что он сообщит нам, если главный балансировщик нагрузки вышел из строя, и если это произошло, следите за сбоями портов на web1 и web2.
Сначала мы должны установить sendmail, чтобы lb2.example.com мог отправлять почту :
apt-get install sendmail
vi /root/ports_check
И вставьте этот скрипт :
#!/bin/bash
# Проверка сбоев портов Ldirectord
# Авторские права (c) 2008 blogama.org
# Этот скрипт лицензирован под GNU GPL версии 2.0 или выше
# ---------------------------------------------------------------------
### Этот скрипт выполняет 2 проверки ###
### 1) проверка, не вышел ли главный балансировщик нагрузки из строя и отправка уведомления по почте ###
### 2) Если главный балансировщик нагрузки вышел из строя, проверка на сбой порта на балансируемых серверах ###
### Для изменения ###
EMAIL="[email protected]"
###### Не вносите изменения ниже ######
### Бинарные файлы ###
MAIL=$(which mail)
### Дата ###
NOW=$(date)
### Восстановить оригинал, когда проблема будет исправлена ###
if [ $1 ]; then
cd /root/
if [ $1=="fix" ]; then
if [ -f lb1_problem.txt ]; then
rm /root/lb1_problem.txt
fi
if [ -f port_problem.txt ]; then
rm /root/port_problem.txt
fi
if [ -f /root/server_problem_notified.txt ]; then
rm /root/server_problem_notified.txt
fi
> /var/log/ldirectord.log
> /var/log/ha-log
exit 1;
fi
fi
#проверка, работает ли ldirectord на lb2.example.com (означает, что lb1.example.com вышел из строя)
#$LDIRECTORD /etc/ha.d/ldirectord.cf status 2>&1 | grep running
cat /var/log/ha-log | grep "takeover complete" > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
###проверка, было ли уже уведомление###
cd /root
if [ -f port_problem.txt ]; then
cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
exit 1;
fi
### Проверка, не вышел ли из строя порт ###
cat /var/log/ldirectord.log 2>&1 | grep Deleted
if [ "$?" -ne "1" ]; then
cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
echo "Проблема с портами, смотрите файл журнала /var/log/port_problem.log" > /root/port_problem.txt
$MAIL -s "Некоторые порты вышли из строя" $EMAIL < /root/port_problem.txt
fi
### Проверка, было ли уже уведомление о том, что главный балансировщик нагрузки вышел из строя ###
cd /root
if [ -f server_problem_notified.txt ]; then
exit 1;
fi
### Уведомить, что главный балансировщик нагрузки вышел из строя ###
cd /root
MESSAGE="$NOW : Главный балансировщик нагрузки вышел из строя"
echo $MESSAGE > lb1_problem.txt
$MAIL -s "Главный балансировщик нагрузки вышел из строя" $EMAIL < /root/lb1_problem.txt
echo "уведомлено" > server_problem_notified.txt
fiМы делаем его исполняемым :
chmod +x /root/ports_check
И добавляем его в наш crontab :
crontab -e
* * * * * /root/ports_failed >/dev/null 2>&1Когда вы получите уведомление от скрипта, пожалуйста, выполните после этого :
/root/ports_check fix
15.3 Мониторинг с web1 и web2
Мониторинг веб-кластера уже частично выполнен с помощью monit и munin.
Часть, которая еще не охвачена, - это мониторинг репликации MySQL.
Пожалуйста, прочитайте следующую статью :
Исправление репликации MySQL master-master
Мониторинг MySQL является необязательным, но на сервере в производственной среде могут возникнуть проблемы с репликацией MySQL, поэтому я действительно рекомендую использовать эти скрипты или что-то подобное для проверки согласованности баз данных.
15.4 Мониторинг с удаленного сервера
Эта часть добавляет дополнительную безопасность, проверяя важные порты (25,53,80,443) с удаленного сервера (установите dns-utils для dig):
#!/bin/bash
# Скрипт для проверки важных портов на удаленном веб-сервере
# Авторские права (c) 2008 blogama.org
# Этот скрипт лицензирован под GNU GPL версии 2.0 или выше
# ---------------------------------------------------------------------
### Этот скрипт выполняет проверку на портах 25, 53, 80 и 443 ###
### После 2 неудачных проверок он отправит уведомление по почте ###
### Для изменения ###
WEBSERVERIP="192.168.1.106"
MAILSERVERIP="192.168.1.106"
EMAIL="[email protected]"
DNSSERVERIP="192.168.1.106"
DOMAINTOCHECKDNS="example.com"
DOMAINIP="192.168.1.106"
###### Не вносите изменения ниже ######
### Бинарные файлы ###
MAIL=$(which mail)
TELNET=$(which telnet)
DIG=$(which dig)
### Проверка, было ли уже уведомление###
cd /root
if [ -f server_problem.txt ]; then
exit 1;
fi
### Тест SMTP ###
(
echo "quit"
) | $TELNET $MAILSERVERIP 25 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
echo "ПОРТ ПОДКЛЮЧЕН"
else
if [ -f server_problem_first_time_25.txt ]; then
echo "ПОРТ 25 НЕ ПОДКЛЮЧЕН" >> /root/server_problem.txt
else
echo "НЕ ПОДКЛЮЧЕН" > /root/server_problem_first_time_25.txt
fi
fi
### Тест HTTP ###
(
echo "quit"
) | $TELNET $WEBSERVERIP 80 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
echo "ПОРТ ПОДКЛЮЧЕН"
else
if [ -f server_problem_first_time_80.txt ]; then
echo "ПОРТ 80 НЕ ПОДКЛЮЧЕН" >> /root/server_problem.txt
else
echo "НЕ ПОДКЛЮЧЕН" > /root/server_problem_first_time_80.txt
fi
fi
### Тест HTTPS###
(
echo "quit"
) | $TELNET $WEBSERVERIP 443 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
echo "ПОРТ ПОДКЛЮЧЕН"
else
if [ -f server_problem_first_time_443.txt ]; then
echo "ПОРТ 81 НЕ ПОДКЛЮЧЕН" >> /root/server_problem.txt
else
echo "НЕ ПОДКЛЮЧЕН" > /root/server_problem_first_time_443.txt
fi
fi
### Тест DNS ###
$DIG $DOMAINTOCHECKDNS @$DNSSERVERIP | grep $DOMAINIP
if [ "$?" -ne "1" ]; then
echo "ПОРТ ПОДКЛЮЧЕН"
else
if [ -f server_problem_first_time_53.txt ]; then
echo "ПОРТ 53 НЕ ПОДКЛЮЧЕН" >> /root/server_problem.txt
else
echo "НЕ ПОДКЛЮЧЕН" > /root/server_problem_first_time_53.txt
fi
fi
### Отправить уведомление по почте после 2 неудачных проверок ###
if [ -f server_problem.txt ]; then
$MAIL -s "Проблема с сервером" $EMAIL < /root/server_problem.txt
fiИ вот! Не стесняйтесь отправлять мне личные письма на admin [at] marchost.com или оставлять комментарии здесь или на моей странице : blogama.org
Get new posts in your inbox
No spam. Unsubscribe anytime.