はじめに
RDS for mysql のアップデートがまた来たよということで、ダウンタイム時間を計測するシェルスクリプトを書いてみました。
記事目安...10分
実行環境
mysql パッケージがインストールされ、"mysqladmin ping" コマンドを使えることが必須です。
$ which mysqladmin
ダウンタイム計測スクリプト
#! /bin/bash ## sleepTime は、mysqladmin ping コマンドを打つ間隔を指します。 sleepTime=1 ## DB の接続情報 endpoint=$1 dbUser=$2 password=$3 dbStatus="" ## mysql に ping を飛ばす処理(1回目) mysqladmin ping -h ${endpoint} -u ${dbUser} -p${password} 2>&1 | grep alive > /dev/null 2>&1 if [ $? = 0 ]; then echo "DB status is alive" date echo "---------" dbStatus="alive" sleep ${sleepTime} elif [ $? != 0 ]; then echo "DB status is dead" date echo "---------" dbStatus="dead" sleep ${sleepTime} fi ## mysql に ping を飛ばす処理(2回目以降) while true; do mysqladmin ping -h ${endpoint} -u ${dbUser} -p${password} 2>&1 | grep alive > /dev/null 2>&1 if [ $? = 0 ]; then if [ ${dbStatus} = "alive" ]; then sleep ${sleepTime} elif [ ${dbStatus} = "dead" ]; then echo "DB status has been alive" date echo "---------" dbStatus="alive" sleep ${sleepTime} fi elif [ $? != 0 ]; then if [ ${dbStatus} = "alive" ]; then echo "DB status has been dead" date echo "---------" dbStatus="dead" sleep ${sleepTime} elif [ ${dbStatus} = "dead" ]; then sleep ${sleepTime} fi fi done
処理ロジックについて
冒頭でも触れた通り、今回のスクリプトでは "mysqladmin ping" コマンドを定期的に流して RDS for mysql の疎通確認を行います。
処理は、大きく2つに分かれます。
①まず、スクリプトを実行すると、DB との通信が開始されます。
疎通ができた時は 「dbStatus is alive」が、 疎通ができなかった時は「dbStatus is dead」が返ります。
②以後、疎通ができなくなるもしくは、疎通ができるようになるたびに、ログ出力がされます。
つまり、ダウンタイム時間は、DB の疎通がとれなくなった瞬間(dbStatus = dead) から DB に再度疎通確認ができた瞬間 (dbStatus = alive) です。
以下はログ出力の例になります。
DB status is alive Wed Apr 20 07: 03 :35 UTC 2021 --------- DB status has been dead Wed Apr 20 07: 15 :26 UTC 2021 --------- DB status has been alive Wed Apr 20 07: 18 :08 UTC 2021 ---------
使い方
以下引数を入れて、スクリプトを実行します。(*1)
$ bash measure-rds-downtime.sh {{endpoint}} {{dbUser}} {{dbPassword}}
*1. 各引数の詳細
Key | Value |
---|---|
endpoint | RDS のエンドポイント情報 |
dbUser | RDS の接続ユーザ |
dbPassword | RDS の接続パスワード |
まとめ
余裕あるときに改修して、アップデート時間とかも計測できるようにしたいです(できるかはわからない)
菅谷 歩 (記事一覧)