모니터링 스크립트 · 6 min read · Oct 09, 2025
완벽한 로드 밸런스 및 고가용성 웹 클러스터: Ubuntu 8.04 하디 헤론에서 Xen을 실행하는 2대 서버 - 페이지 9
15. 모니터링을 위한 사용자 정의 스크립트 (lb1, lb2, web1, web2)
전체 설정을 모니터링하기 위해 몇 가지 bash 스크립트를 만들었습니다 (조금 지저분하지만 작동합니다). 더 나은 스크립트를 만들면 언제든지 저에게 이메일을 보내주세요!
15.1 lb1.example.com에서 모니터링
먼저 lb1.example.com이 이메일을 보낼 수 있도록 sendmail을 설치해야 합니다:
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 "다른 쪽에 핑 노드 수 요청"
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
다음 스크립트는 ldirectord 로그 파일을 확인하여 web1 또는 web2에서 포트가 실패했는지 확인합니다. 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에서 포트 실패를 주시해야 합니다.
먼저 lb2.example.com이 이메일을 보낼 수 있도록 sendmail을 설치해야 합니다:
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
#lb2.example.com에서 ldirectord가 실행 중인지 확인 (즉, lb1.example.com이 실패한 경우)
#$LDIRECTORD /etc/ha.d/ldirectord.cf status 2>&1 | grep running
cat /var/log/ha-log | grep "인수 완료" > /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 마스터-마스터 복구
MySQL 모니터링은 선택 사항이지만, 프로덕션 서버에서는 MySQL 복제와 관련하여 문제가 발생할 수 있으므로 이러한 스크립트나 유사한 것을 사용하여 데이터베이스 일관성을 확인하는 것을 강력히 권장합니다.
15.4 원격 서버에서 모니터링
이 부분은 원격 서버에서 중요한 포트 (25,53,80,443)를 확인하여 추가 보안을 추가하는 것입니다 (dig를 위해 dns-utils를 설치):
#!/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
fiEt voila! admin [at] marchost.com으로 개인 이메일을 보내거나 여기 또는 제 페이지(blogama.org)에 댓글을 남기세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.