ログイン
ユーザー名:

パスワード:


パスワード紛失

新規登録
メインメニュー
My Twitter

nagiosサーバの冗長化

このトピックの投稿一覧へ

なし nagiosサーバの冗長化

msg# 1
depth:
0
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2013-7-13 16:12 | 最終変更
takahashi  一人前 居住地: 千葉県船橋市  投稿数: 73
 nagiosの冗長化手法について書いてみます。正確に書くとフェイルオーバーを自動的に行うのでHA構成と書いた方が良いかもしれません。2台のnagiosサーバをセッティングし、マスターが常時監視を行い、なんらかの原因でマスターが止まってしまった場合、スレーブが自動的に監視を引き継ぐといった動作を行います。

 もちろん2台のnagiosが同時に稼働するActive・Active方式も可能ですが、その場合監視用のプローブパケットが2倍になるので今回はフェイルオーバー方式を採用しました。

1.環境
  ・Debain GNU 7.1 Linux wheezy
  ・kernel  3.2.0-4-686-pae
  ・nagios3  3.4.1-3

2.冗長化の概要
  ・nagiosの設定は一切変更しない。
  ・相手のnagiosの稼働状況を監視し自サービスの動作を管理するスクリプトを作成。
  ・監視スクリプトをcronで4分間隔でマスター、スレーブ交互に動作させる。
  ・監視状況を記録したretention.datの同期を取る。

3.システム稼働の為の前提条件
 2台のnagiosサーバはお互いにrootでssh接続が可能なように設定します。具体的にはパスワード認証を使わず、公開キーを使いパスフレーズ無しのログインを使います。

デフォルトの状態ではrootの公開キーが無いので、su - でrootになってから、
ssh-keygen -t rsa
で、パスフレーズ無しで公開キーを作成します。
/root/.ssh に、id_rsa.pub というファイルが出来ますので、これが公開キーです。私はいつもすぐにそのサーバの名前を付け、id_rsa.pub.nagios1 のようにファイル名を変更しています。

同様にスレーブ側のnagiosサーバでもrootの公開キーを作り、id_rsa.pub.nagios2とファイル名を変更します。

まずはスレーブ(nagios2)の公開キーを、
scp /root/.ssh/id_rsa.pub.nagios2  nagios1:/root/.ssh
で、マスター(nagios1)へ送ります。

次にマスターへログインし、su - でrootになります。
cd /root/.ssh
cat id_rsa.pub.nagios2 > authorized_keys
このように、authorized_keysにアクセスしたいサーバの公開キーを登録します。
※2回目以降は、cat id_rsa.pub.nagios2 >> authorized_keys としないと前に登録したキーが消えてしまいます。

それではテストしてみましょう。
一度、マスターからログアウトしてスレーブにログインしてください。
su - でrootになってから、ssh nagios1 とマスターへsshで接続すると、一番最初には相手側の公開キーの登録をするか?という確認がありますが、2回目以降はパスフレーズ無しでするっと接続することが出来ます。

もし何らかの理由で相手側のサーバの公開キーが変わってしまったときには、
ssh-keygen -R 相手のサーバ名
ssh-keygen -R 相手サーバのIPアドレス
で、相手の情報を削除してから再びsshで接続するとうまくいきます。

同様にマスターの公開キーもスレーブへコピーして、authorized_keysを作成します。

このようにお互いにrootで接続出来るようにしておくと、nagiosの設定ファイルの同期もscpやrsyncを使って簡単にできるようになります。折角ですので、/etc/nagios3/conf.dの同期をとっておきましょう。

4.それでは監視用スクリプトです。
マスターとスレーブで同じスクリプトを使います。違うところは上から数行目のMASTERHOST=です。ここにはお互いに相手サーバのIPアドレスを書いてください。

例として、マスターはnagios1.sample.com 192.168.0.11で、スレーブはnagios2.sample.com 192.168.0.12 としましょう。

下記はマスター側のスクリプトとなります。その為、MASTERHOST=はnagios2の192.168.0.12を指定します。
#!/bin/bash
# nagios-watchdog R1.2
#.
MAILER=/usr/sbin/sendmail
SUBJECT="URGENT: nagios master process switch has taken place."
RECIPIENT="admin@sample.com"
SERVICE=/etc/init.d/nagios3
RETENTIONFILE=/var/lib/nagios3/retention.dat
MASTERHOST=192.168.0.12

# Ensure only one copy can run at a time
PIDFILE=/var/run/nagios-watchdog.pid
 if [ -e ${PIDFILE} ]; then
 echo -e "ERR: nagios-watchdog.pid has already existed."
 exit 1;
 else
 touch ${PIDFILE};
 fi

# Checks the actual daemon status on the other host
ssh ${MASTERHOST} "/etc/init.d/nagios3 status" >/dev/null 2>&1

# Is the other host doing all the work?
 if [ $? -eq 0 ]; then
    # Stop what I'm doing
    ${SERVICE} stop >/dev/null 2>&1

    # Copy the retention data from the other nagios process
    scp ${MASTERHOST}:${RETENTIONFILE} /tmp/;

    # Verify that we didn't get a corrupted copy.
    if [ `grep "{" /tmp/retention.dat | wc -l` -eq `grep "}" /tmp/retention.dat | wc -l` ]; then
        mv /tmp/retention.dat ${RETENTIONFILE};
        chown nagios ${RETENTIONFILE};
        chgrp www-data ${RETENTIONFILE};
     else
        rm -f /tmp/retention.dat;
     fi
 else
     ${SERVICE} status >/dev/null 2>&1
     if [ $? -ne 0 ]; then
        echo -e "From: nagios-watchdog@`hostname`\nSubject: ${SUBJECT}\nTo: ${RECIPIENT}\nNow running on host: `hostname`" | ${MAILER} ${RECIPIENT};
        ${SERVICE} start >/dev/null 2>&1;
        sleep 2;
        /usr/sbin/apache2ctl restart;
     fi
 fi

rm -f ${PIDFILE}

exit 0;
ロジックは非常に単純です。
〇相手側のサーバのnagiosの稼働状況を確認。
  →動いている。
    ・自分のnagiosを止める。
    ・相手のretention.datを自分へコピーする。
  →動いてない。
    →自分のnagiosサービスが動いているか?
      →動いている。
        ・何もしないで終了。
      →動いてない。
        ・自分のnagiosを起動。
        ・nagiosサーバが切り替わった事をメールで通知。
        ・apacheも再起動。

nagiosの監視間隔はおよそ5分なので、4分間隔でマスターとスレーブ相互にこの監視スクリプトを動作させるとうまくいきます。

例えば、マスターは毎時1,5,9,13,17,21,25,29,33,37,41,45,49,53,57分に監視を行い、スレーブ側は3,7,11,15,19,23,27,31,35,39,43,47,51,55,59分に監視を行うといった感じです。

上記監視スクリプトをnagios-watchdog.shという名前で実行権限をつけておきます。
chmod 755 /root/nagios-watchdog.sh

また、下記の内容を任意のファイル名(nagios-checkとか)をつけて、/etc/cron.dに入れおけば指定時間に監視スクリプトが実行されます。
マスター用
1,5,9,13,17,21,25,29,33,37,41,45,49,53,57 * * * * root  /root/nagios-watchdog.sh
スレーブ用
3,7,11,15,19,23,27,31,35,39,43,47,51,55,59 * * * * root  /root/nagios-watchdog.sh

5.最後になりましたが運用方法です。
 最初はcron登録はしないで、手動で監視スクリプトを実行してみて動作確認を行ってください。問題が出ないようでしたら、スレーブのnagiosは停止&マスターのnagiosが稼働している状況で、マスター側でcronの登録、次にスレーブ側でcronを登録し、しばらくsyslogを監視して下さい。

 それでは最終のテストです。cronでの相互監視が開始してから約10分待ってから、まずマスター側のcronを一時的に止め、次にnagiosのサービスを止めます。すると最大で4分以内に、スレーブ側でnagiosが稼働を開始し、同時に管理者宛へメールが送られます。

 Webブラウザーでスレーブ側のnagios管理画面を呼び出して監視が正常に引き継がれていることを確認して下さい。その後、マスター側のcronを起動して下さい。

【重要】この監視スクリプトを使うことで、フェイルオーバーは自動で行われますが、フェイルバックは自動では行われません。スレーブ側に切り替わっているサービスを、マスター側に戻したい場合には、マスターが側でcronを稼働させスレーブ側にある最新のretention.datがコピーされるのを待ってから、スレーブのcronを停止、次にnagiosを停止させ、すぐにマスター側のnagiosを稼働させて下さい。もちろん、マスター側のnagiosが稼働を開始したらスレーブ側のcronをスタートさせるのを忘れないで下さい。

 また、監視サーバのsyslogへ監視対象機器がログ情報を送信して、nagiosで自syslogをチェックして何らかの監視を行っている場合には、この冗長化手法は使えない(監視対象機器がsyslogの送信先を変更できない)ので注意して下さい。

 尚、このやり方は下記ページで紹介されていた方法(RedHat系+SElinux)をdebianで動くように修正したものです。nagiosの冗長化の方法はいくつかあるようですが、個人的にはこの手法が解りやすくて単純だったので使ってみることにしました。監視サーバが1台で冗長化を検討している方にちょっとでも参考になればうれしいです。
http://allmybase.com/2010/10/04/setting-up-fully-redundant-failover-nagios-servers/
投票数:5 平均点:10.00

投稿ツリー

  条件検索へ


Calendar
TS3
TS3 Minolin server TeamSpeak Viewer