どうもこんにちは、ディーネットの山田です。
さて、今回はmonitのインストールに触れmonitを使ったサーバ運用の自動化についてお伝えしようと思います。
目次
monitとはなんなのか?
ざっくり言うと、サービスを監視しサービスがダウンしていた場合に、サービス復旧を自動で行ってくれる
大変ありがたいオープンソースのソフトウェアになります。
ただ、動作としては、条件と一致(対象のプロセスがダウン)したら、対象のプロセスを再起動してくれるって
言うやつですので根本原因などは人間が調べることになります。
ちょっと宣伝させて下さい!
当社では、24時間365日エンジニアが常駐しておりますので、このような自動復旧ソフトウェアに任せること
なく、アラートが発生したらエンジニアが原因をお客様サーバ上で調査し、対応を行っております。
前提
今回は、CentOS7系にインストールします。
CentOS7系は既にセットアップされた状態でのお話です。
# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
monitのインストール
epelのリポジトリを追加しましょう
# yum install epel-release.noarch
yumを使ってmonitをインストールしましょう
# yum install --enablerepo=epel monit
monitの設定ファイルに手を加えるためにバックアップしておく
# cp -a /etc/monitrc{,_org}
それでは、設定ファイルに手を加えていく
# vi /etc/monit
============================================================
19 set daemon 30 # check services at 30 seconds intervals
20 # with start delay 240 # optional: delay the first check by 4-minutes (by
21 # # default Monit check immediately after Monit start)
============================================================
↓20行目の起動遅延について設定を入れる。
↓※サーバ再起動時などでmonitの方が先に起動して監視対象がまだ起動しておらず
↓ 監視条件に引っ掛かってしまうことを防ぐためです。
============================================================
19 set daemon 30 # check services at 30 seconds intervals
20 with start delay 240 # optional: delay the first check by 4-minutes (by
21 # # default Monit check immediately after Monit start)
============================================================
文法に問題がないかチェックする
# monit -t
「Control file syntax OK」が表示されればOKです。
monitを起動する
# systemctl start monit
# systemctl enable monit
monitが起動したことと、自動起動されるようになったことを確認する
# systemctl status monit
# systemctl is-enabled monit
これにてmonitのインストールは完了です
では、例としてApacheを監視してみましょう
Apacheを監視するように設定する
# vi /etc/monit.d/httpd
============================================================
check process httpd
with pidfile "/var/run/httpd/httpd.pid"
start program = "/usr/bin/systemctl start httpd"
stop program = "/usr/bin/systemctl stop httpd"
if failed port 80 with timeout 10 seconds then restart
if failed port 443 with timeout 10 seconds then restart
if 30 restarts within 30 cycles then unmonitor
============================================================
設定ファイルの文法チェック
# monit -t
Control file syntax OK
「Control file syntax OK」が表示されればOKです。
設定ファイルを読み込みさせる
# monit reload
Reinitializing monit daemon
設定が反映されたことを確認
# monit status
============================================================
Process 'httpd'
status OK
monitoring status Monitored
monitoring mode active
on reboot start
pid 9617
parent pid 1
uid 0
effective uid 0
gid 0
uptime 20d 4h 3m
threads 1
children 5
cpu 0.0%
cpu total 0.0%
memory 0.2% [7.1 MB]
memory total 0.7% [26.2 MB]
security attribute (null)
disk write 0 B/s [44 kB total]
port response time 0.181 ms to localhost:443 type TCP/IP protocol DEFAULT
port response time 0.078 ms to localhost:80 type TCP/IP protocol DEFAULT
data collected Mon, 07 May 2018 14:51:47
============================================================
このように表示されればOK
それでは、模擬障害としてApacheを停止させてmonitによって起動されるかをテストします。
Apacheが起動していることを確認
# ps aux | grep httpd
============================================================
root 9617 0.0 0.1 247948 7316 ? Ss Apr17 0:48 /usr/sbin/httpd -DFOREGROUND
apache 16533 0.0 0.1 250192 4472 ? S May06 0:00 /usr/sbin/httpd -DFOREGROUND
apache 16535 0.0 0.1 250032 3980 ? S May06 0:00 /usr/sbin/httpd -DFOREGROUND
apache 16537 0.0 0.1 250192 4472 ? S May06 0:00 /usr/sbin/httpd -DFOREGROUND
apache 16538 0.0 0.1 250168 4236 ? S May06 0:00 /usr/sbin/httpd -DFOREGROUND
apache 16539 0.0 0.1 250192 4472 ? S May06 0:00 /usr/sbin/httpd -DFOREGROUND
root 19717 0.0 0.0 112660 972 pts/0 R+ 14:55 0:00 grep --color=auto httpd
============================================================
Apacheを停止します
# systemctl stop httpd
Apacheが停止したことを確認します
# ps aux | grep httpd
============================================================
root 19754 0.0 0.0 112660 972 pts/0 S+ 14:56 0:00 grep --color=auto httpd
============================================================
しばらく待つと...
Apacheが停止していることをmonitが検知して、Apacheを起動してくれる
# ps aux | grep httpd
============================================================
root 19757 0.1 0.1 247948 7316 ? Ss 14:56 0:00 /usr/sbin/httpd -DFOREGROUND
apache 19758 0.0 0.0 250032 3772 ? S 14:56 0:00 /usr/sbin/httpd -DFOREGROUND
apache 19759 0.0 0.0 250032 3772 ? S 14:56 0:00 /usr/sbin/httpd -DFOREGROUND
apache 19760 0.0 0.0 250032 3772 ? S 14:56 0:00 /usr/sbin/httpd -DFOREGROUND
apache 19761 0.0 0.0 250032 3772 ? S 14:56 0:00 /usr/sbin/httpd -DFOREGROUND
apache 19762 0.0 0.0 250032 3772 ? S 14:56 0:00 /usr/sbin/httpd -DFOREGROUND
root 19764 0.0 0.0 112660 972 pts/0 S+ 14:57 0:00 grep --color=auto httpd
============================================================
monitのログにもApacheの停止を検知して、Apacheを再起動してくれたときのログ
# cat /var/log/monit.log
============================================================
[JST May 7 14:56:47] error : 'httpd' process is not running
[JST May 7 14:56:47] info : 'httpd' trying to restart
[JST May 7 14:56:47] info : 'httpd' start: '/usr/bin/systemctl start httpd'
[JST May 7 14:57:18] info : 'httpd' process is running with pid 19757
============================================================
備考
監視の設定ファイルを色々作成していくことで、対象サーバ上で稼動している複数サービスの
監視が自動で行えるようになりますね。
ただ、複雑な障害はまだまだ自動化の道のりは長いのでまずは簡単なプロセス再起動で
直るような障害から自動化していきましょう。