Mon, Muninによる楽々監視生活

41,772 views

Published on

qpstudy #01で発表した資料です

Published in: Technology

Mon, Muninによる楽々監視生活

  1. 1. <ul><li>mon, munin による楽々監視生活 </li></ul>  桑野 章弘
  2. 2. アジェンダ <ul><li>自己紹介 </li></ul><ul><li>監視、、、嫌いなんです。 </li></ul><ul><li>監視の種類 </li></ul><ul><li>実際の手順 [munin 編 ] </li></ul><ul><li>実際の手順 [mon 編 ] </li></ul><ul><li>まとめ </li></ul>
  3. 3. 自己紹介
  4. 4. 自己紹介 <ul><li>桑野 章弘 </li></ul><ul><ul><li>id: akuwano </li></ul></ul><ul><ul><li>twitter: @kuwa_tw </li></ul></ul><ul><li>渋谷で働く IT 企業 </li></ul><ul><li>インフラエンジニア </li></ul><ul><ul><li>最近は自分でも何やってんのかわからなくなってきた </li></ul></ul><ul><ul><li>趣味は最近はスマートフォンかな? NexusOne を持っておりますが、 iPhone ユーザとアイデンティティを戦わせたりするのが好きです。 </li></ul></ul>
  5. 5. qpstudy 最初の一発目とか 恥ずかしいんですが、、、
  6. 6. はじめさせて頂きます お題は、、、
  7. 7. 監視、、、嫌いなんです。
  8. 8. 何が嫌いってメンドクサイ <ul><li>好きです? </li></ul><ul><ul><li>やれサーバ足しただの </li></ul></ul><ul><ul><li>やれサーバ外しただの </li></ul></ul><ul><ul><li>スペックが変わったとか </li></ul></ul><ul><ul><li>毎回変えるの? </li></ul></ul><ul><ul><li>なんやかんやですよ </li></ul></ul><ul><ul><li>てんやわんやですよ </li></ul></ul><ul><ul><li>とにかく嫌なんです!めんどくさいんです!さよなら! </li></ul></ul>
  9. 9. でもね、、、 <ul><li>監視って大事なんです </li></ul><ul><ul><li>定常的に見ないとわからないもの </li></ul></ul><ul><ul><li>突発的に出てくる負荷 </li></ul></ul><ul><ul><li>トラブルシューティング時に大活躍 </li></ul></ul><ul><ul><li>寝た子を起こされたりとかもしますけど </li></ul></ul><ul><ul><li>やっぱり離れられない! </li></ul></ul>
  10. 10. と言うわけで <ul><li>監視を出来るだけ簡単にやってみましょうと言うコンセプト。 </li></ul><ul><li>スパッと。 </li></ul>
  11. 11. 監視の種類
  12. 12. こんなのがあります <ul><li>トレンドの監視 </li></ul><ul><li>障害監視 </li></ul>
  13. 13. トレンドの監視 <ul><li>リソースを追ったり </li></ul><ul><li>負荷の増減状況をみたり </li></ul><ul><ul><li>サービス状況のログ取得と言う意味の監視 </li></ul></ul><ul><li>予防の監視 =munin </li></ul>
  14. 14. 障害監視 <ul><li>サーバが落ちたり </li></ul><ul><li>書き込みが出来なかったり </li></ul><ul><ul><li>事象が起こることを監視するという意味の監視 </li></ul></ul><ul><ul><li>検知の監視 =mon </li></ul></ul>
  15. 15. こんなのでいきましょう <ul><li>トレンドの監視 =munin </li></ul><ul><li>障害監視 =mon </li></ul>
  16. 16. 実際の手順 [Munin 編 ]
  17. 17. munin とは <ul><li>perl ベースでかかれた監視ツール(カラスの意味らしいです) </li></ul><ul><li>データ取得は cron で一定期間毎に polling する形式(デフォルト 5 分) </li></ul>
  18. 18. Overview サーバ cron で polling クライアント群 HTML ファイル
  19. 19. Munin[Index]
  20. 20. Munin[ 日時 ]
  21. 21. インストール <ul><li>パッケージで簡単 </li></ul><ul><ul><li>このさい RPMforge 使いましょうw </li></ul></ul><ul><ul><li>Debian 系は APT で OK </li></ul></ul>##### サーバインストール # rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt # rpm -ihv http://apt.sw.be/redhat/el5/en/x86_64/RPMS.dag/rpmforge-release-0.5.1-1.el5.rf.x86_64.rpm # yum update # yum install munin.noarch ##### クライアントインストール # yum install munin-node.noarch ##### サーバインストール (debian/ubuntu) # aptitude install munin ##### クライアントインストール (debian/ubuntu) # aptitude install munin-node
  22. 22. 設定 [ サーバ側 ] <ul><li>取得先のサーバ(エージェントが動いてるサーバ)を記述するだけで簡単 </li></ul><ul><ul><li>処理が多い時は [max_processes] もいじるといいよ </li></ul></ul>vi /etc/munin/munin.conf (snip) ### データ取得先サーバの設定 ### ### db server ### [db.example.com;hoge-db01] address 192.168.0.11 use_node_name yes [db.example.com;hoge-db02] address 192.168.0.12 use_node_name yes グループ名 ホスト名 IP アドレス
  23. 23. 設定 [ クライアント側 ] <ul><li>エージェントを起動するだけでアラ簡単! </li></ul><ul><ul><li>でも取得データを増やしたい場合は /etc/munin/plugins にスクリプトおいて、 /etc/munin/ plugin-conf.d/ にスクリプト毎の設定をおきましょう </li></ul></ul>vi /etc/munin/munin-node.conf (snip) ### Munin サーバの IP 許可設定 ### allow ^192.168.0.10$ ### 取得データの変更 MySQL 関連のパラメータを取得したい ### # ln –s /usr/share/munin/plugins/mysql_bytes /etc/munin/plugins/mysql_bytes cat <<‘EOF’ > plugin-conf.d/mysql [mysql*] env.mysqladmin /usr/bin/mysqladmin env.mysqlopts -udbadmin -h127.0.0.1 EOF ### エージェント起動 ### /etc/init.d/munin-node start  
  24. 24. その他の運用 <ul><li>Web ページはテンプレートでカスタマイズ可能 </li></ul><ul><ul><li>/etc/munin/templates/ 以下にテンプレートがあるのでそれを編集してカスタマイズできます </li></ul></ul><ul><li>独自の監視もスクリプトで簡単! </li></ul>
  25. 25. 独自スクリプト #!/bin/bash MeasurementMode=min #MeasurementMode=sec DATE=`date +%Y-%m-%d` LOG_FILE=&quot;/usr/local/tomcat/logs/hoge.log&quot; GREP_TEXT_E=&quot;ERROR&quot; GREP_TEXT_W=&quot;WARN&quot; TARGET_MINUTE=`LANG=C date +%H:%M --date '1 minutes ago'` TARGET_SECOND=`LANG=C date +%H:%M:%S --date '1 minutes ago'` ECHO=/bin/echo GREP=/bin/grep WC=/usr/bin/wc TAIL=/usr/bin/tail CAT=/bin/cat
  26. 26. 独自スクリプト if [ &quot;$1&quot; == &quot;config&quot; ]; then $ECHO &quot;graph_title log exception count $LOG_FILE&quot;; $ECHO &quot;graph_vlabel request /$MeasurementMode&quot;; $ECHO &quot;graph_category ExceptionCount&quot;; $ECHO &quot;graph_order ERROR WARN&quot;; $ECHO &quot;ERROR.label ERROR*100&quot;; $ECHO &quot;ERROR.min 0&quot;; $ECHO &quot;ERROR.max 1000&quot;; $ECHO &quot;ERROR.draw AREA&quot;; $ECHO &quot;WARN.label WARN&quot;; $ECHO &quot;WARN.min 0&quot;; $ECHO &quot;WARN.max 1000&quot;; $ECHO &quot;WARN.draw STACK&quot;; exit 0; fi
  27. 27. 独自スクリプト if [ &quot;$MeasurementMode&quot; == &quot;min&quot; ]; then TARGET_BETWEEN_TIME=$TARGET_MINUTE TAIL_LINE_CNT=10000 else TARGET_BETWEEN_TIME=$TARGET_SECOND TAIL_LINE_CNT=1000 fi count=`$TAIL -n $TAIL_LINE_CNT $LOG_FILE | $GREP &quot;$TARGET_BETWEEN_TIME&quot; | $GREP &quot;$GREP_TEXT_E&quot; | $WC -l` $ECHO $GREP_TEXT_E.value $(($count*100)) count=`$TAIL -n $TAIL_LINE_CNT $LOG_FILE | $GREP &quot;$TARGET_BETWEEN_TIME&quot; | $GREP &quot;$GREP_TEXT_W&quot; | $WC -l` $ECHO $GREP_TEXT_W.value $count
  28. 28. 実際の手順 [Mon 編 ]
  29. 29. mon とは <ul><li>perl ベースでかかれた監視ツール( Service Monitoring Daemon ) </li></ul><ul><li>Unisys の人が作ってたみたいだけど更新は止まってる模様 </li></ul><ul><ul><li>えーと、間違えました、枯れてます </li></ul></ul>
  30. 30. Overview
  31. 31. インストール <ul><li>やっぱりパッケージで簡単 </li></ul>##### mon のインストール # yum install mon.x86_64 ##### mon のインストール (debian/ubuntu) aptitude install mon
  32. 32. 設定 [ サーバ側 ] <ul><li>[mon.cf] に取得先のサーバを記述するだけで簡単 </li></ul>#################################################################### # 監視先サーバの設定 #################################################################### hostgroup hoge-www-servers 192.168.0.10 192.168.0.11 192.168.0.12 hostgroup fuga-db-servers 192.168.0.11 192.168.0.12
  33. 33. 設定 [ サーバ側 ] <ul><li>[mon.cf] に取得先のサーバを記述するだけで簡単 </li></ul>#################################################################### # サービス監視の設定 #################################################################### watch hoge-servers service ping interval 10s monitor fping.monitor period wd {Sun-Sat} alertevery 3m alertafter 18 3m alert mail.alert -f alert@example.com hoge-alert@example.com upalert mail.alert -f alert@example.com -S “TITLE&quot; -u hoge-alert@example.com service http interval 3m monitor http.monitor -p 80 -u &quot;/url/check.html&quot; allow_empty_group period wd {Sun-Sat} alertevery 9m alertafter 3 9m alert apache_tomcat-restart.alert alert mail.alert -f alert@example.com hoge-alert@example.com upalert mail.alert -f alert@example.com -S “TITLE&quot; -u hoge-alert@example.com
  34. 34. 設定 [ クライアント側 ] <ul><li>なんもいらんです!簡単の極み! </li></ul><ul><ul><li>SSH させてとかやるならいる場合もあります </li></ul></ul>
  35. 35. 運用 <ul><li>Web のコンソール [mon.cgi] </li></ul><ul><li>CLI インターフェース [moncmd/monshow] </li></ul><ul><li>Monitor スクリプト </li></ul><ul><li>Alert スクリプト </li></ul>
  36. 36. Web のコンソール [mon.cgi] <ul><li>Web のコンソール [mon.cgi] </li></ul>
  37. 37. mon.cgi
  38. 38. monshow <ul><li>CLI インターフェース [moncmd] </li></ul><ul><ul><li>mon.cgi でやれることを CLI でも出来ます。 </li></ul></ul><ul><ul><ul><li>設定の確認や、現在のステータス確認 </li></ul></ul></ul>
  39. 39. CLI インターフェース [moncmd/monshow] <ul><li>CLI インターフェース [monshow] </li></ul># /usr/local/mon/clients/monshow --full server: localhost time: Thu May 20 11:38:30 2010 state: scheduler running GROUP SERVICE STATUS LAST NEXT ALERTS SUMMARY R hoge-w-both-mys load_average untested untested 7s none R hoge-w-both-bat hoge-w-both- - 10s 1s none R hoge-both-info- df_check_80 - 79s 00:28:24 none R hoge-both-info- df_check_90 - 00:01:55 00:27:48 none R hoge-c-both-mys hoge-c-both- - 00:01:53 00:01:06 none R hoge-c-pc-info- hoge-c-pc-cr - 7s 4s none R hoge-c-both-net hoge-c-both- - 7s 4s none R hoge-w-both-api hoge-w-both- - 10s 1s none R hoge-both-batch df_check_80 - 64s 00:28:37 none R hoge-both-batch df_check_90 - 00:01:37 00:28:06 none R hoge-w-both-mys hoge-w-both- - 00:02:13 46s none R hoge-w-both-nod hoge-w-both- - 7s 4s none R hoge-w-both-com ntp - 00:01:52 00:27:51 none R hoge-both-chat- df_check_80 - 70s 00:28:31 none
  40. 40. CLI インターフェース [moncmd/monshow] <ul><li>CLI インターフェース [moncmd] </li></ul><ul><ul><li>mon.cgi でやれることを CLI でも出来ます。 </li></ul></ul><ul><ul><ul><li>config のチェック </li></ul></ul></ul><ul><ul><ul><li>config の確認 </li></ul></ul></ul><ul><ul><ul><li>監視の有効・無効 </li></ul></ul></ul><ul><ul><ul><li>監視項目のテスト </li></ul></ul></ul><ul><ul><li>リリーススクリプトに組み込むと便利です </li></ul></ul>
  41. 41. moncmd ##### config チェック # /usr/local/mon/clients/moncmd test config 220 test config completed OK, no errors found ##### チェック 監視(有効 / 無効) # /usr/local/mon/clients/moncmd (enable|disable) service &quot;group&quot; &quot;service“ # /usr/local/mon/clients/moncmd (enable|disable) watch &quot;watch“ # /usr/local/mon/clients/moncmd (enable|disable) host “host“ ##### 現監視項目のリスト # /usr/local/mon/clients/moncmd list watch hoge-servers ping hoge-servers http
  42. 42. Monitor スクリプト <ul><li>細かい監視も可能 </li></ul>
  43. 43. Monitor スクリプト #!/bin/sh #MYSQL MYSQL_USER=‘dbcheck’' MYSQL_PASSWORD=‘hogehoge' MYSQL_BASE='/usr/bin/mysql' MYSQL_COMMAND='SHOW SLAVE STATUSG' MYSQL_GREP='Seconds_Behind_Master' RET='' ## HOST CHECK LOOP for host in &quot;$@&quot; do #EXEC RET=`&quot;${MYSQL_BASE}&quot; -h &quot;$host&quot; -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e &quot;${MYSQL_COMMAND}&quot;|grep ${MYSQL_GREP}|awk '{print $2}'` #RET CHECK if [ &quot;${RET}&quot; != 0 ] then if [ &quot;$failed&quot; = &quot;&quot; ] then failed=&quot;$host:${RET}&quot; else failed=&quot;$failed $host:${RET}&quot; fi fi done ## ERROR CHECK if [ &quot;$failed&quot; != &quot;&quot; ] then echo &quot;$failed&quot; echo &quot;${MYSQL_GREP}:$failed&quot; exit 1 fi # OK RETURN exit 0
  44. 44. Alert スクリプト <ul><li>alert ディレクティブに書いた物は障害時すべて実行される </li></ul><ul><ul><li>メール送信+ Apache 再起動+ Tomcat 再起動とかも可能 </li></ul></ul>
  45. 45. Alert スクリプト #!/usr/bin/perl use Getopt::Std; getopts (&quot;s:g:h:t:l:u&quot;); $summary=<STDIN>; chomp $summary; $t = localtime($opt_t); ($wday,$mon,$day,$tm) = split (/s+/, $t); print <<EOF; アラート送信 グループ : $opt_g, サービス $opt_s EOF print &quot; アップアラートはこっち &quot; if ($opt_u); print <<EOF; 障害時間 $wday $mon $day $tm 障害サマリ : $summary EOF
  46. 46. まとめ
  47. 47. mon とか munin て結構簡単 <ul><li>恐らく OSS の監視アプリの中でも 1 、 2 を争うくらい簡単 </li></ul><ul><li>でも作りこみによっては細かく設定できます </li></ul><ul><li>大規模になってくると問題はありますけど、、、 既にやってますしw </li></ul><ul><ul><li>なんとかなります。 </li></ul></ul><ul><ul><li>お手軽監視に Munin と mon はいかがでしょうか! </li></ul></ul>
  48. 48. ざっくり説明 <ul><li>でしたので、もっと細かい話をと言う方は、、、 </li></ul><ul><ul><li>懇親会でお願いします! </li></ul></ul>
  49. 49. ご清聴ありがとうございました

×