Monitでサーバー監視(ディスク、プロセス、ネットワーク)
概要
前回構築設定したMonitにディスク使用率、プロセス稼働状況、ネットワーク帯域使用率の監視を追加します。
環境
| OS | CentOS Linux release 8.2.2004 | 
| 監視 | monit-5.26.0 | 
構築の流れ
- ディスク使用率監視
- プロセス稼働状況監視
- ネットワーク帯域使用率監視
構築方法
[0] 前回のおさらい
前回はsystem情報の監視の設定まで行っています。
監視状況は以下の状態です。
「statsu」がOKと出ていますので、正しく監視されており、異常なしの状態です。
# monit status
Monit 5.26.0 uptime: 13m
System 'monit01.cv.local'
  status                       OK
  monitoring status            Monitored
  monitoring mode              active
  on reboot                    start
  load average                 [0.01] [0.08] [0.11]
  cpu                          0.0%us 0.0%sy 0.0%wa
  memory usage                 178.9 MB [4.7%]
  swap usage                   0 B [0.0%]
  uptime                       14m
  boot time                    Fri, 18 Sep 2020 12:03:31
  data collected               Fri, 18 Sep 2020 12:17:19[1] ディスク使用率監視
- 設定追加
よくある監視項目としてディスク使用率の監視を追加します。
# vi /etc/monit.d/diskディスク使用率の監視にはキーワード:checkとサービスタイプ:filesystemを指定して監視します。
monitの監視設定ファイルは、/etc/monit.d に作成したファイルを読み取るように設定されていますので、ここにファイルを作成します。
下記はそれぞれの領域(マウントポイント)でディスク容量が90%以上になった場合にメール通知されます。
check filesystem rootfs with path /
    if space usage > 90% for 5 cycles then alert
check filesystem boot with path /boot
    if space usage > 90% for 5 cycles then alert"使用率が90%以上になったことを5回連続で検知した場合にアラート通知する"という条件です。
実環境に於いては一時ファイルの作成削除などでディスク使用率が閾値周辺で上下する場合があるので5回連続で閾値超過した場合に通知するようにしています。
何回連続で通知を出すかは、そのサーバの使われ方により変更すると、夜中に起こされることも減ると思います。
- シンタックス
設定ファイルを変更したらまずシンタックスチェックを実施します。
# monit -t
Control file syntax OKシンタックスエラーがなければ設定を反映します。
# monit reload上記コマンドを実行すると設定が再読み込みされ監視が開始されると共に、下記のように設定が再読み込みされたことがメール通知されます。
Subject: monit alert -- monit01.cv.local Monit instance changed monit01.cv.local
Monit instance changed Service monit01.cv.local
                Date:        Thu, 24 Sep 2020 15:39:31
                Action:      start
                Host:        monit01.cv.local
                Description: Monit reloaded
           Your faithful employee,
           Monit[2] プロセス稼働状況監視
- 設定追加
ディスク使用率監視に続いて、プロセスの稼働状況の監視設定を追加します。
# vi /etc/monit.d/httpdhttpdプロセスの監視設定を行います。
プロセス稼働状況はキーワード:checkとサービスタイプ:processを指定して監視します。
check process httpd with pidfile /var/run/httpd/httpd.pid
  start program = "/bin/systemctl start httpd" with timeout 60 seconds
  stop program  = "/bin/systemctl stop httpd"
  if failed port 80 for 2 cycles then restart
  if failed port 443 for 2 cycles then restart
  if 5 restarts within 5 cycles then timeout| 行 | 説明 | 
|---|---|
| 1 | check processの行でpidファイルの存在確認。pidファイルが存在しないか、実行中のプロセスのPID番号が含まれていない場合startメソッドを呼び出す。 | 
| 2 | サービスを起動するコマンド。後ろの「with timeout 60 seconds」は起動タイムアウト時間を指定。 | 
| 3 | サービスを停止するコマンド。 | 
| 4 | 80ポートへ2回連続でアクセスできなければサービスを再起動する。 | 
| 5 | 443ポートへ2回連続でアクセスできなければサービスを再起動する。 | 
| 6 | 5サイクル中5回再起動が行われた場合にそれ以上再起動を行わず、監視を止める。(再起動できない場合いつまでも再起動を繰り返さない処置です。) | 
- 動作確認
試しにhttpdプロセスをkillしてみます。
# kill -9 `cat /var/run/httpd/httpd.pid`; systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disable>
   Active: deactivating (stop-sigkill) (Result: signal) since Fri 2020-09-25 10:49:05 JST;>
     Docs: man:httpd.service(8)
  Process: 2360 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=killed, signal=KILL)
 Main PID: 2360 (code=killed, signal=KILL)
   Status: "Running, listening on: port 443, port 80"
    Tasks: 80 (limit: 23968)
   Memory: 2.2M
   CGroup: /system.slice/httpd.serviceしばらくして監視周期が来るとmonitがhttpdプロセスの停止を検知して起動させています。
# tail -f /var/log/monit.log
[JST Sep 25 10:49:46] error    : 'httpd' process is not running
[JST Sep 25 10:49:46] info     : 'httpd' trying to restart
[JST Sep 25 10:49:46] info     : 'httpd' start: '/bin/systemctl start httpd'- 設定追加
プロセス監視でもう一つ、mariadbプロセスの監視設定を行います。
# vi /etc/monit.d/mariadb基本的にhttpd監視と同じですが、protocolメソッドを使用して指定ユーザでログイン監視も行っています。
check process mysql with pidfile /var/run/mariadb/mariadb.pid
    start program = "/bin/systemctl start mariadb"
    stop program = "/bin/systemctl stop mariadb"
    if failed
       port 3306
       protocol mysql username "monit" password "P@ssw0rd"
    then alertこちらの監視設定では、if failed ~ then alert としているので、プロセスの再起動はせず通知を出すのみです。
[3] ネットワーク帯域使用率監視
# vi /etc/monit.d/networkネットワーク帯域使用率監視はキーワード:checkとサービスタイプ:networkを指定して監視します。
下記のsaturationメソッドで帯域使用率(飽和度)を監視することが可能です。
check network ens160 with interface ens160
  if saturation > 90% then alert但し、saturationはネットワークインターフェースの種類や環境により取得できないことがあるので、そのような環境では下記のように毎秒や直近数時間の通信量を監視することで代替が可能です。
# vi /etc/monit.d/network2check network ens160 with interface ens160
  if upload > 100 MB/s then alert
  if total downloaded > 1 GB in last 2 hours then alert
  if total downloaded > 10 GB in last day then alert以上でmonitのよくある基本的な監視設定は終了です。
ご紹介した監視設定の他にもかなりマニアックな項目も監視できたり、メール通知の他に任意のスクリプトを実行して、slackへ通知したり、リカバリ処理を実行したりとシンプルが故に自由度の高い監視も可能です。
お時間のある方は下記のmonitマニュアルを参考にいろいろ実践してみるのも面白いかもしれません。
技術情報
関連サービス
お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]
お問い合わせ

