監視スクリプト · 3 min read · Oct 09, 2025
2台のサーバーでXenを実行する完璧な負荷分散および高可用性Webクラスタ - ページ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
# バックアップ負荷分散装置のチェック
# Copyright (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 "他の側にpingノード数を要求中"
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にはすでにメール通知がありますが、何百万もの通知を送信します。私のスクリプトは、問題が修正されるまで1回だけ送信します:
vi /root/ports_failed
そして、次のようにします:
#!/bin/bash
# Ldirectordポート失敗チェック
# Copyright (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からの監視
2番目の負荷分散装置の監視は重要です。なぜなら、それがマスタ負荷分散装置が失敗したかどうかを教えてくれ、失敗した場合はweb1とweb2のポートの失敗を監視するからです。
まず、lb2.example.comがメールを送信できるようにsendmailをインストールする必要があります:
apt-get install sendmail
vi /root/ports_check
そして、このスクリプトを貼り付けます:
#!/bin/bash
# Ldirectordポート失敗チェック
# Copyright (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からの監視
Webクラスタの監視は、すでにmonitとmuninで部分的に行われています。
まだカバーされていない部分は、MySQLレプリケーションの監視です。
次の記事をお読みください:
MySQLマスターマスターレプリケーションの修復
MySQLの監視はオプションですが、プロダクションサーバーではMySQLレプリケーションに問題が発生する可能性があるため、これらのスクリプトまたはそれに類似したものを使用してデータベースの整合性を確認することを強くお勧めします。
15.4 リモートサーバーからの監視
この部分は、リモートサーバーから重要なポート(25,53,80,443)をチェックすることで追加のセキュリティを提供します(dig用にdns-utilsをインストール):
#!/bin/bash
# リモートWebサーバーの重要なポートをチェックするスクリプト
# Copyright (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 "ポート443が接続されていません" >> /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そして、これで完了です!私にプライベートメールを送るか、ここや私のページにコメントを投稿してください:blogama.org
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。