Мониторинг. · 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>&1

15.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

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.