monitを入れてみようと思った動機も最初に書いておきます
ざっくりすぎですがtd-agentはこんな運用を想定しています
・in_tailプラグイン使う
・in_tailはpos_file指定する
・tailするファイルは日付入りで日時でローテートされる
・in_tailのpathで指定するファイルはシンボリックリンク
td-agentが何かしらのアレでstopされてしまったり落ちたとします。
日またぎ前に落ちて、日をまたいでから人手で起動すると
そのタイミングでpos_fileの中身が指すファイルは下記のように変わってしまいます
tailするfileのpath 日またぎ前のファイルの読み込み位置 日またぎ前のファイルinode
↓
tailするfileのpath 日またぎ後のファイルの読み込み位置 日またぎ後のファイルinode
なのでやっぱり少しでもダウンタイムを減らしたい。。
ということで、daemontoolsなりを使って自動起動にしたいわけですが
事例もあって良さそうなmonitを使ってやってみようと思いました
ということでさっそく
やる流れ
1.インストール
2.configの設定
3.td-agent用のconfigを設定
4.起動してみる
5.動きを確認
1.インストールとか
インストール
# sudo yum -y install monit Loaded plugins: auto-update-debuginfo, fastestmirror Determining fastest mirrors * base: ftp.iij.ad.jp * extras: ftp.iij.ad.jp ・・・省略・・・ Installed: monit.x86_64 0:5.5-1.el6.rf Complete!
起動スクリプトON
一応ですがやっておきます
# sudo chkconfig --list monit monit 0:off 1:off 2:off 3:off 4:off 5:off 6:off # sudo chkconfig monit on # sudo chkconfig --list monit monit 0:off 1:off 2:on 3:on 4:on 5:on 6:off
2.configの設定
設定はいろいろありますが、とりあえずでこれだけです
# sudo vi /etc/monit.conf --下記の2行コメントあれば外す-- set daemon 10 # check services at 1-minute intervals set logfile syslog facility log_daemon -------------------------------
- set daemon…監視の実行タイミング(秒単位)
- set logfile…ログ出力の設定。そのままだと/var/log/messagesにログが出ます
set daemonに関して、今回はとりあえずなので結果が早くみたいってことで10秒にしました
設定はこちらを参考にさせて頂きました
→15分で始めるmonitによるサーバ監視
→Monit の導入
3.td-agent用のconfigを設定
td-agentの設定ではなく、monit監視するtd-agent用の設定です
# sudo vi /etc/monit.d/td-agent.conf -- check process td-agent with pidfile /var/run/td-agent/td-agent.pid every 2 cycle group system start program = "/etc/rc.d/init.d/td-agent start" stop program = "/etc/rc.d/init.d/td-agent stop" if 5 restarts within 5 cycles then unmonitor --
4.起動してみる
# sudo /etc/init.d/monit start Starting monit: monit: generated unique Monit id 53f7d7d2685d020c2765af8dc81503e4 and stored to '/var/monit/id' Starting monit daemon with http interface at [localhost:2812] [ OK ] # ps aux | grep monit root 4135 0.0 0.0 124656 1588 ? Sl 12:14 0:00 /usr/bin/monit
初期起動時のみ?かわかりませんが
/var/monit以下に下記のファイルを作るようです
- /var/monit/id
- /var/monit/state
※後でちょっと出てきます
追記
rootで実行した場合は下記にファイルができました
# pwd /root # ls -al .monit* -rw------- 1 root wheel 32 Jan 28 14:50 .monit.id -rw-r--r-- 1 root wheel 564 Jan 28 14:53 .monit.state
5.動きを確認
そのままの状態を確認
- オペレーション(td-agentをstart
# sudo /etc/init.d/td-agent status td-agent (pid 8364) を実行中... # ps aux | grep td-agent td-agent 8364 0.0 1.1 213068 22256 ? Sl 14:03 0:00 /usr/lib64/fluent/・・省略・・td-agent/td-agent.pid td-agent 8367 0.1 1.7 234868 32976 ? Sl 14:03 0:00 /usr/lib64/fluent/・・省略・・td-agent/td-agent.pid
- ログ確認(/var/log/messages
Dec 17 14:03:24 hoge monit[8298]: 'td-agent' process is running with pid 8364
動いてますよ、的な
td-agentをstopしてみて確認
- オペレーション(td-agentをstop
# sudo /etc/init.d/td-agent stop Shutting down td-ag2ent: [ OK ] # sudo /etc/init.d/td-agent status td-agent は停止しています
- ログ確認(/var/log/messages
Dec 17 14:04:44 hoge monit[8298]: 'td-agent' process is not running Dec 17 14:04:44 hoge monit[8298]: 'td-agent' trying to restart Dec 17 14:04:44 hoge monit[8298]: 'td-agent' start: /etc/rc.d/init.d/td-agent ・・ちょいたってから・・ Dec 17 14:05:05 hoge monit[8298]: 'td-agent' process is running with pid 8816
- オペレーション(td-agentのstatus
# sudo /etc/init.d/td-agent status td-agent (pid 8816) を実行中...
stopしたtd-agentがmonitによって起動されました
td-agentのプロセスを片方だけkillしてみる
- オペレーション(kill td-agentプロセス)
# ps aux | grep td-agent hoge 3498 0.0 0.0 107456 908 pts/18 S+ 20:15 0:00 grep td-agent root 5041 0.0 0.1 150232 2112 pts/1 S+ 16:00 0:00 sudo tail -f td-agent.log root 5042 0.0 0.0 100940 636 pts/1 S+ 16:00 0:00 tail -f td-agent.log td-agent 25413 0.0 1.1 213068 22256 ? Sl 17:20 0:00 /usr/lib64/fluent/・・省略・・td-agent/td-agent.pid td-agent 25416 0.0 1.7 234740 34096 ? Sl 17:20 0:03 /usr/lib64/fluent/・・省略・・td-agent/td-agent.pid # sudo kill -9 25413 # ps aux | grep td-agent td-agent 25416 0.0 1.7 234868 34088 ? Sl 14:05 0:00 /usr/lib64/fluent/・・省略・・td-agent/td-agent.pid
- ログ確認(/var/log/messages
Dec 17 20:17:23 hoge monit[22294]: 'td-agent' process is not running
Dec 17 20:17:23 hoge monit[22294]: 'td-agent' trying to restart
Dec 17 20:17:23 hoge monit[22294]: 'td-agent' start: /etc/rc.d/init.d/td-agent
Dec 17 20:17:53 hoge monit[22294]: 'td-agent' failed to start
Dec 17 20:18:13 hoge monit[22294]: 'td-agent' process is not running
Dec 17 20:18:13 hoge monit[22294]: 'td-agent' trying to restart
Dec 17 20:18:13 hoge monit[22294]: 'td-agent' start: /etc/rc.d/init.d/td-agent
Dec 17 20:18:14 hoge monit[22294]: 'td-agent' started
Dec 17 20:18:34 hoge monit[22294]: 'td-agent' process is not running
Dec 17 20:18:34 hoge monit[22294]: 'td-agent' trying to restart
Dec 17 20:18:34 hoge monit[22294]: 'td-agent' start: /etc/rc.d/init.d/td-agent
Dec 17 20:19:04 hoge monit[22294]: 'td-agent' failed to start
Dec 17 20:19:24 hoge monit[22294]: 'td-agent' process is not running
Dec 17 20:19:24 hoge monit[22294]: 'td-agent' trying to restart
Dec 17 20:19:24 hoge monit[22294]: 'td-agent' start: /etc/rc.d/init.d/td-agent
Dec 17 20:19:25 hoge monit[22294]: 'td-agent' started
Dec 17 20:19:45 hoge monit[22294]: 'td-agent' process is not running
Dec 17 20:19:45 hoge monit[22294]: 'td-agent' trying to restart
Dec 17 20:19:45 hoge monit[22294]: 'td-agent' start: /etc/rc.d/init.d/td-agent
Dec 17 20:20:05 hoge monit[22294]: 'td-agent' service restarted 5 times within 5 cycles(s) - unmonitor
プロセスの片方だけkillした(落ちた)場合は、5回トライして終了になりました。
ちなみにこの場合はtd-agentの起動スクリプトを直接叩いてもダメなので、まぁ。。しゃーない。。
こんな感じでstopもできません
# sudo /etc/init.d/td-agent status td-agent が停止していますが PID ファイルが残っています # sudo /etc/init.d/td-agent stop Shutting down td-agent: [失敗]
もしやるとしたら「3.td-agent用のconfigを設定」でしたstartの設定を
変なプロセス落としてから起動するスクリプトに変える
とかですかね?スマートな方法あったら教えてくださいm(_ _)m
6.再度確認して動かない場合
動かない状況
こちらもスマートな方法は調べたりしてないですがメモ程度に。
「5.動きを確認」で5回してリトライした後に、
残ってしまったプロセスもkillしてから再度試すと自動起動しなくなります
# sudo kill -9 25416
待ってても/var/log/messagesにはもう何も表示してくれません。。。
まったく調べてはいませんが、
これは「4.起動してみる」のときにできたidとstateファイルが関係してるようです。
今回もそうですが、リトライしてみた状況なんかを覚えていて
本気で起動できない場合に起動ループしないようにしてるぽいですね。
てきとうな回避策
ためしに削除(今回はmv)したら動くようになりました
- オペレーション(idとstate削除&再起動)
# ls -l /var/monit -rw-r--r-- 1 root wheel 33 12月 17 17:20 2013 id -rw------- 1 root wheel 584 12月 17 20:33 2013 state # sudo mv /var/monit/id /var/monit/_id # sudo mv /var/monit/state /var/monit/_state
monitの再起動も必要なのでお忘れなく
# sudo /etc/init.d/monit restart Stopping monit: [ OK ] Starting monit: Starting monit daemon with http interface at [localhost:2812] [ OK ]
- ログ確認(/var/log/messages
Dec 17 20:35:50 hoge monit[22294]: Shutting down monit HTTP server
Dec 17 20:35:51 hoge monit[22294]: monit HTTP server stopped
Dec 17 20:35:51 hoge monit[22294]: monit daemon with pid [22294] killed
Dec 17 20:35:51 hoge monit[22294]: 'hoge.ne.jp' Monit stopped
Dec 17 20:35:51 hoge monit[8630]: Starting monit daemon with http interface at [localhost:2812]
Dec 17 20:35:51 hoge monit[8633]: State file '/var/monit/state': Unable to read magic
Dec 17 20:35:51 hoge monit[8633]: Starting monit HTTP server at [localhost:2812]
Dec 17 20:35:51 hoge monit[8633]: monit HTTP server started
Dec 17 20:35:51 hoge monit[8633]: 'hoge.ne.jp' Monit started
Dec 17 20:36:01 hoge monit[8633]: 'td-agent' process is not running
Dec 17 20:36:01 hoge monit[8633]: 'td-agent' trying to restart
Dec 17 20:36:01 hoge monit[8633]: 'td-agent' start: /etc/rc.d/init.d/td-agent
Dec 17 20:36:22 hoge monit[8633]: 'td-agent' process is running with pid 8692
導入自体はすぐできますね!
メールの設定(ってほどでもないけど)はこちらでやってみました
→td-agent落ちたらmonitでメールしてみるテスト