Hadoop運用 >
目次 †
概要 †
Nagiosの基本情報については、webframe:Nagios をご参照ください。
エージェント監視のGangliaと連携するため、Nagiosはネットワークを介したアクティブな障害検知とそのアラート通知に徹します(Gangliaと機能が重複し構築が煩雑になるため、基本的にNRPEなどのNagiosのエージェント機構は使用しません)。Gangliaが収集した監視データの中で障害検知が必要なものについては、Nagiosが定期的にそれらのデータを取得し、設定された閾値に従いアラート通知を行います。
以下の説明ではGanglia環境は前提ですので、セットアップ等については、GangliaセットアップforHadoop をご参照ください。
モデル環境 †
サーバ †
No. ホスト 説明 備考 1 nm{00,01} .grid.example.com冗長化されたNagiosサーバ 2 gm{00,01} .grid.example.com冗長化されたGanglia(gmetad)サーバ 構築済の前提
VIP †
No. VIPのDNS 説明 備考 1 pleiades-nm .grid.example.comNagiosサーバの冗長化と負荷分散のため 2 pleiades-gm .grid.example.comGangliaサーバの冗長化と負荷分散のため
Nagios with Ganglia のセットアップ †
Chefレシピ †
参考までに、これらはここで説明している環境を構築するChef レシピ(ロール)です。
基本 †
Nagiosをインストールします。
Debian
$ sudo apt-get install --no-install-recommends nagios3 nagios-plugins nagios-images
CentOS
$ sudo yum install nagios nagios-plugins nagios-plugins-{load,users,ping,ssh,ntp,http,disk,swap,procs,file_age}
$ sudo service nagios start
$ sudo chkconfig nagios on
クラスタ監視のための設定ファイルを用意します。設定ファイルのルートディレクトリはそれぞれ/etc/nagios3 と /etc/nagios ですので、以降の説明では適宜、読み替えてください。
クラスタ名でディレクトリを作成し、以下のようなファイルを作成します。ホストや通知先の定義方法については、Nagiosのマニュアルをご参照ください。設定例一式はこちら からダウンロードできます。 通常、Nagiosではホストのaddress はIPアドレスで定義しますが、Gangliaが監視データをホスト名(FQDN)で出力している場合にはホスト名で定義します。
/etc/nagios3/pleiades
├── checkcommands.cfg
├── contacts.cfg
├── hosts.cfg
└── services.cfg
/etc/nagios3/nagios.cfg で、上記のディレクトリにある設定ファイルをロードするようにします。
# Debian
cfg_dir =/ etc/ nagios3/ pleiades
# CentOS
#cfg_dir=/etc/nagios/pleiades
Webコンソールへのアクセス制御 †
認証 †
セキュアHadoopを構築している場合にはバックエンドにKerberos認証環境がありますので、Webサーバ(Apache2)向けのKerberos認証(SPNEGO)モジュール(mod_auth_kerb など)の利用を検討するとよいでしょう。
認可 †
Ganglia連携監視(check_ganglia_metric) †
Gangliaと連携できるよう、Gangliaの設定ファイル(/etc/ganglia/gmetad.conf)でNagiosのホストからgmetadのサービスへのアクセスを許可します。
trusted_hosts 127.0.0.1 nm00.grid.example.com nm01.grid.example.com
$ sudo /etc/init.d/gmetad restart
gmetadから情報収集するためのNagios監視プラグイン check_ganglia_metric をインストールします。python-setuptoolsパッケージには、easy_installコマンドが含まれています。
Debian
$ sudo apt-get install --no-install-recommends python-setuptools
$ sudo easy_install check_ganglia_metric
CentOS
$ sudo yum install python-setuptools
$ sudo easy_install -U distribute # 不要の場合もあります。
$ sudo easy_install check_ganglia_metric
check_ganglia_metric が利用している NagAconda の最新版(0.2.1)は動作自体には問題ないものの、監視結果を複数行で出力しNagiosでの表示が見難くなりますので、以前のバージョン(0.1.4)を明示的にインストールしそれをアクティブにします。
$ sudo easy_install NagAconda==0.1.4
...
Removing NagAconda 0.2.1 from easy-install.pth file
Adding NagAconda 0.1.4 to easy-install.pth file
Installed /usr/local/lib/python2.7/dist-packages/NagAconda-0.1.4-py2.7.egg
Processing dependencies for NagAconda==0.1.4
Finished processing dependencies for NagAconda==0.1.4
なお、0.2.1の場合の出力例は以下のようになります。設定閾値を出力しますので、デバッグログのようです。
$ check_ganglia_metric.py --gmetad_host=localhost --metric_host=localhost \
> --metric_name=part_max_used --critical=90 --warning=80
checking warning
range was warning
(0, 80.0, False)
86.8:0:80.0 = True
checking critical
range was critical
(0, 90.0, False)
86.8:0:90.0 = False
Status Warning, Maximum Disk Space Used = 86.8 %|part_max_used=86.8%;80;90;;
まずはコマンドラインから check_ganglia_metric の動作を確認します。
$ check_ganglia_metric.py --gmetad_host=gm00.grid.example.com \
> --metric_host=nn00.grid.example.com --metric_name=part_max_used
Status Ok, Maximum Disk Space Used = 16.5 %|part_max_used=16.5%;;;;
$ check_ganglia_metric.py --gmetad_host=gm00.grid.example.com \
> --metric_host=nn00.grid.example.com --metric_name=part_max_used --critical=15
Status Critical, Maximum Disk Space Used = 16.5 %|part_max_used=16.5%;;15;;
Gangliaと連携した監視サービスを定義します。
/etc/nagios3/pleiades/checkcommands.cfg : 監視コマンドを定義します。第1パラメータに監視項目名、第2と第3パラメータにそれぞれワーニングとクリティカルの閾値を与えられるようにします。
define command {
command_name check_ganglia_metric
# 一行で記述
# Debian
command_line / usr/ local / bin/ check_ganglia_metric.py --gmetad_host =pleiades-gm.grid.example.com
--cache_path =/ var/ lib/ nagios3/ .check_ganglia_metric.cache --metric_host =$HOSTADDRESS $ --metric_name =$ARG1 $
--warning =$ARG2 $ --critical =$ARG3 $
# CentOS
#command_line /usr/bin/check_ganglia_metric.py --gmetad_host=pleiades-gm.grid.example.com
# --cache_path=/var/log/nagios/.check_ganglia_metric.cache --metric_host=$HOSTADDRESS$ --metric_name=$ARG1$
# --warning=$ARG2$ --critical=$ARG3$
}
/etc/nagios3/pleiades/services.cfg : サービスのテンプレート(register 0)を定義しておくと、運用時の設定変更を柔軟に行えるようになります。
# Service templates
define service {
name generic-ganglia-service
use generic-service
service_description Ganglia Metric
is_volatile 0
check_period 24x7
max_check_attempts 3
normal_check_interval 5
retry_check_interval 1
contact_groups grid-admins
notification_interval 240
notification_period 24x7
notification_options w ,u,c,r
# check_command check_ganglia_metric!metricName!warning!critical
register 0
}
define service {
name generic-part_max_used-service
use generic-ganglia-service
service_description Maximum Disk Space Used via Ganglia
check_command check_ganglia_metric! part_max_used! 80 ! 90
register 0
}
...
# Real Objects
define service{
use generic-part_max_used-service
hostgroup_name grid-servers
}
Nagiosを再起動させ、設定を反映させます。
check_ganglia_metricキャッシュファイルの監視 †
もしNagiosとGangliaとの連携が絶たれた場合、その時点でGanglia経由の監視サービスは意味をなさなくなります。そのような事態に対処するために、check_ganglia_metricのキャッシュファイルを監視し、連携に問題がある(正しい頻度で更新されない)場合にはGanglia経由の監視サービスの実行を抑止するようにします。これらは、Nagiosのサービス依存定義を利用して実現します。
/etc/nagios3/pleiades/checkcommands.cfg に、まず check_file_age コマンドを定義します。
define command {
command_name check_file_age
command_line / usr/ lib/ nagios/ plugins/ check_file_age -f $ARG1 $ -w $ARG2 $ -c $ARG3 $
}
/etc/nagios3/pleiades/services.cfg に、check_ganglia_metricキャッシュファイルの監視サービスを追加します。
define service {
name generic-check_ganglia_cache-service
use generic-service
service_description Cache for check_ganglia_metric
is_volatile 0
check_period 24x7
# check_interval 1
max_check_attempts 1
normal_check_interval 1
retry_check_interval 1
contact_groups grid-admins
notification_interval 240
notification_period 24x7
notification_options w ,u,c,r
# Debian
check_command check_file_age!/ var/ lib/ nagios3/ .check_ganglia_metric.cache! 90 ! 120
# CentOS
#check_command check_file_age!/var/log/nagios/.check_ganglia_metric.cache!90!120
register 0
}
define service{
use generic-check_ganglia_cache-service
host_name localhost
}
同じく /etc/nagios3/pleiades/services.cfg に、サービス依存定義を追加します。正規表現マッチ機能を使用するため、あらかじめ /etc/nagios3/nagios.cfg で use_regexp_matching を有効にしておきます。以下の例では、localhost のcheck_ganglia_metricキャッシュ監視サービス(Cache for check_ganglia_metric)がCRITICAL状態(c)と保留状態(p)において失敗する場合(それのみが通知され)、grid-serversに属するホストのGanglia連携監視サービス(.* via Ganglia$ にマッチする)の監視は抑止されるようになります。
define servicedependency {
host_name localhost
service_description Cache for check_ganglia_metric
# dependent_host_name .*
dependent_hostgroup_name grid-servers
dependent_service_description .* via Ganglia$
execution_failure_criteria c,p
}
もちろん正規表現マッチ機能を有効にした時点で、デフォルトのワイルドカードパターンが無効となります。ディストリビューション(例えば、Debian系)によってはデフォルトで配布される設定ファイルの中にそのようなパターンがありますので、そのような場合には修正する必要があります。
$ diff -u /etc/nagios3/conf.d/hostgroups_nagios2.cfg{ .dist,}
--- /etc/nagios3/conf.d/hostgroups_nagios2.cfg.dist 2013 -11 -03 22 :11 :31.284092837 +0900
+++ /etc/nagios3/conf.d/hostgroups_nagios2.cfg 2013 -11 -03 22 :11 :53.859414711 +0900
@@ -4 ,7 +4 ,7 @@
define hostgroup {
hostgroup_name all
alias All Servers
- members *
+ members .*
}
# A list of your Debian GNU/Linux servers
このままでは、check_ganglia_metricキャッシュファイルの更新頻度はGanglia連携監視サービスの数とそのチェック間隔に依存しますので、ある程度高い頻度でコンスタントにgmetadへのアクセスを監視するサービスを追加しておきます。監視項目は、問題の発生しにくい load_fifteen で代用し、上述のサービス依存定義にマッチしない service_description にします。
define service {
name generic-ganglia_heartbeat-service
use generic-ganglia-service
service_description Ganglia gmetad Heartbeat
max_check_attempts 3
normal_check_interval 1
retry_check_interval 1
check_command check_ganglia_metric! load_fifteen! 10.0 ! 20.0
hostgroup_name ganglia
register 0
}
define service{
use generic-ganglia_heartbeat-service
}
キャッシュファイルの最終更新日時を更新してから以上の設定を反映します。
$ sudo -u nagios touch /var/lib/nagios3/.check_ganglia_metric.cache
冗長化とフェイルオーバー †
同じ設定で複数の監視ホストを用意すれば問題ありません。バックアップのホストはアラートを非通知に設定しておくとよいでしょう。両ホストが正常であれば監視状態は同様ですので、ユーザアクセスに対して負荷分散させてもよいでしょう。
リソース †
http://www.nagios.org/
http://pypi.python.org/pypi/check_ganglia_metric/
https://github.com/mconigliaro/check_ganglia_metric/issues/4
https://pypi.python.org/pypi/NagAconda
https://code.google.com/p/nagaconda/