はじめに
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 の接続パスワード |
まとめ
余裕あるときに改修して、アップデート時間とかも計測できるようにしたいです(できるかはわからない)
菅谷 歩 (記事一覧)