簡単リモートサーバモニタ再起動方案

3663 ワード

次へ:http://blog.csdn.net/hfahe/article/details/6627033
要旨:もしあなたのサーバーの主要サービスが不定期にkillに落とされたら、どうやってサービスが正常であることを保証しますか?
    先日、あるサーバーに問題が発生しました.主要なプロセス(Webサービス、top、viといった命令を含む)は不定期でキルに落とされます.分析した結果、このサーバーのシステムに問題が発生したと考えています.このサーバーには重要なWebサービスがマウントされています.サービスが正常に運行されることを保証するためには、サービスの移転が必要です.
    しかし、新しいサーバーが到着するまでにはまだ時間がかかります.この時間はどうやってサービスの正常性を保証しますか?人工的な方法で時間がかかり、しかも0時から8時までの全時間監視は不可能です.crontabの方式を採用してもいいですが、問題はcrontabの最小運行間隔が1分間で、サービスが1分間で問題が発生する確率が高いです.サービスが一番長くて使えない時間は1分間で、影響が大きいです.シナリオを実行する方式で実行してもいいですが、キルに落とされてしまい、ずっと監視することができません.何かいい方法がありますか?
    問題を解決する考えは他のサーバーでサービス状態を監視し(これは実現しやすいです)、遠隔でスクリプトを実行することによってサービスの再起動を行います.
1、  サービス状態を監視
    サービス状態を監視する方法は、遠隔取得システムのプロセスリスト分析やHTTP要求など様々である.最も簡単な方法で、HTTP要求の状態からサービスの利用可能性を判断します.
1)  まず監視されているサーバー(以下、サーバー1で代替)に簡単なPHPページを書きます.固定された内容だけを出力する必要があります.
<?php
           echo “alive”;
?>
2)  このWebページには監視サーバ(以下、サーバ2で代替する)上でPerlスクリプトを用いてアクセスし、取得した内容と確定した内容が一致しない場合、サービスは利用できないと見なしている(HTTP状態コードで判断しても良い).次はチェックですdown.plコード:
use LWP::Simple;
use POSIX qw(strftime);
 
sub convert_format_time {
   my $time = shift;
   my $utc = strftime( "%z", localtime );
   $utc = substr( $utc, 0, -2 );
   return strftime( "%Y-%m-%d %H:%M:%S", localtime( ( 8 - $utc )* 60 * 60 + $time ) );
}
 
while(true) {
        open($FH,">>check_result.out") or die "$!";
        $result =LWP::Simple::get("http://xxx.xxx.xxx.xxx/check_down.php");
        $time = convert_format_time(time);
 
        if($result ne 'alive') { # server error
                print $FH "serverdown!-" . $result . "-" . $time . "
"; } else { # server alive print $FH "serveralive.-" . $time . "
"; } close($FH); sleep(1); }
2、  リモートで再起動スクリプトを実行します.
    サービスが利用できないことが検出されました.以下は最も重要なステップです.リモートで再起動スクリプトを実行します.
1)以下はサーバ1でテストして再起動するShellスクリプトcheck_ダウンタウン
#!/bin/bash
php_procs=`psaux | grep php-fpm | grep -v grep | wc -l`
 
if [ $php_procs-lt 1 ]
then
        /etc/init.d/nginx start
        /etc/init.d/php5-fpm start
fi
2)私たちはサーバ2でサーバ1のこのスクリプトを呼び出すために、sshの方式を採用することができますが、重要なのはsshコマンドを実行する時にパスワードを入力する必要がないことです.
    sshコマンドを実行するにはパスワードが必要ではない方法は以下の通りです.
        サーバー2で「ssh-keygen-t rsa」を実行して、一緒に車に戻ればいいです.
        サーバー1にログイン/root/.sshディレクトリを実行して、「viauthorizedukeyes」を実行して、サーバー2上/root/.ssh/id_rsa.pubファイルの内容はこのファイルに追加されます.
        サーバ2に直接「ssh root@サーバ1のip」を使用してログインすることができます.リモートでスクリプトを再起動する方式は「ssh root@サーバ1のip'/path/checkwn.sh」です.
3)  Perlスクリプトを調整し、サーバーがダウンした場合は遠隔に加えて再起動スクリプトの呼び出しを行います.
if($result ne 'alive') { # server error
        $restart_result = `ssh root\@ip'/usr/local/bin/check_down.sh'`;
        print $FH "serverdown!-" . $result . "-" . $time . "
"; print$FH "$restart_result" . "
"; }
大きな仕事が完成しました
    サーバー2でPerlスクリプト「perl checkConpl&」を起動し、出力されたログファイルに結果を見ることができます.
server alive.-2011-07-10 21:05:25
server down!--2011-07-22 21:05:26
Starting nginx: nginx.
 * Starting PHP5 FPM...
   ...done.
 
server alive.-2011-07-10 21:05:29
まとめ:
    上記のような案は簡単ですが、Shell、Perl、PHPスクリプトはそれぞれ違った役割を果たしています.また重要なのは問題を解決する考え方です.不可能な状況で問題を回避する方法は別の面から解決策を考えることです.