【Bash】RDS for MySQL のダウンタイムを計測するスクリプトを書いてみた

記事タイトルとURLをコピーする

はじめに

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 の接続パスワード

まとめ

余裕あるときに改修して、アップデート時間とかも計測できるようにしたいです(できるかはわからない)

菅谷 歩 (記事一覧)