tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

monitでtd-agentを監視してdaemontoolsぽく自動起動してみる

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!

等記事はyumでやってますがコンパイルのほーでやる場合はこちらを参考にしました
Monit の導入

起動スクリプト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でメールしてみるテスト