ある案件でデータベースが落ちる事態が頻発したので、データベースの死活監視をシェルで実装した。Zabbixとか色々な監視ツールがあるが、インストールが面倒だったり、設定に手間がかかったり、そこまで大がかりなものは必要ないという場合もあるだろう。
こういうケースを想定して、シェルを書いた。要件は以下の通りいたってシンプルです。
要件
- サーバー外部からではなく、データベースと同じサーバーから監視する
- pingをうつだけのシンプルな機能
- 異常を検知したらメール通知
- 環境はCentOS7系を前提とする
データベースの入っているサーバーで以下のようなコマンドを打つ。127.0.0.1はローカルIP、****にはデータベースのパスワードが入る。
$gt; mysqld is alive
問題なければaliveという旨のメッセージが返ってくる。この仕組みを利用して、シェルを書く。
date=`date “+%Y-%m-%d-%H-%M”`
#正常状態のメッセージを設定
state=”mysqld is alive”
#mysqlの死活結果を実行日時をファイル名として保存
mysqladmin -h127.0.0.1 -P3306 -uユーザー名 -p************** ping >> /home/log/sql-$date.log
#実行結果を変数に格納
result=`cat /home/log/sql-$date.log`
#正常な状態のメッセージと実行結果を比較
if [ “$state” = “$result” ]; then
echo “alive”
else
mysqladmin -h127.0.0.1 -P3306 -uユーザー名 -p*************** ping | mail -s ‘sql_check’ ‘メールアドレス
fi
たったこれだけのシンプルなものだけど、簡単な運用には十分だと思う。上記コードをcronで定期実行すれば対応は完了する。少しコードについて補足すると、ifの中の変数をダブルクオーテーションで囲まないと、コマンドとして認識されてしまうので、うまくいかないのでご注意を。
ちなみにエラーを検知したら、自動でデータベースを再起動するコマンドなどを設定してもいいだろう。その辺りの差配は目的や運用状況に応じて自由に設定すればいい。