監視スクリプト · 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>&1

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

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。