AWSサーバ障害復旧の対策の一つとしてはAWSのAutoscalingGroup設定ですが、サーバ上プロセスの死活を感知することはできません。

一つの例としては、AWS EC2にWordpress等Webアプリを立ち上がって、データベース(Mysql)も同じサーバに立ち上がる場合、サーバ障害発生時、AWSのAutohealingでサーバの障害を検知して数分間で元サーバを殺して、新しいサーバを立ち上がってデータをリストアして短い間に復旧ができます。しかし、データベースがメモリ不足等の原因でプロセスを落ちたら、サーバ自体は問題ないので障害を検知されずにWebページも見れなくなってしまします。人を知らず夜間で問題が発生すればWebページの実際障害時間が数時間になる可能性もありますのでこの場合Auto-healingの仕組みのみで足りないです。

mysqlプロセスを監視する為、サーバに監視スクリプトをcronに設定すれば一番シンプルの方法だと思います。一応mysqlプロセス障害時もAutohealingをかかる仕組みで下記のようなスクリプトを作ってみました。

#!/bin/bash
# -----------------------------------------------------------------------------
# mysqld 死活監視
# -----------------------------------------------------------------------------

### アカウントや認証情報を外部ファイルから読み込み ###
....

# -----------------------------------------------------------------------------
# 変数定義
# -----------------------------------------------------------------------------
L_FILE_NAME='/usr/local/bin/script/mysqld_err.count'(失敗検知回数を外部ファイルに保存する)
L_STOPPING_COND=3(3回続いて失敗を検知されたらAutoHealingする)
L_RC=`mysqladmin ping -u $USER -p$PASS 2> /dev/null`(mysqladmin pingでプロセス死活監視)
L_NORMAL_RES="mysqld is alive" (mysqladmin ping 正常の結果)
L_TOPIC_ARN=arn:aws:sns:ap-northeast-1:YOUR_AWS_ACCOUNT:YOUR_SNS_TOPIC (SNS通知設定)
L_SUBJECT="【Monitoring System】Server DB Failure"
L_MSG="DBエラーが検知されました。サーバを停止します。"

###mysqldの状態を確認、失敗する場合カウントアップする
if [ "${L_RC}" = "${L_NORMAL_RES}" ]; then
 COUNT=0
else
 COUNT=`(cat ${L_FILE_NAME})`
 COUNT=`expr $COUNT + 1`
fi
echo ${COUNT} > ${L_FILE_NAME}

###失敗回数一定になれば、バックアップ出来る為一時的mysqldを起動して、エラー情報をメール>して、サーバを停止する
if [ $((COUNT)) -ge $((L_STOPPING_COND)) ]; then
 /sbin/service mysqld start  (DBバックアップ出来るように一時的にmysqldを再起動する)
 aws sns publish --topic-arn ${L_TOPIC_ARN} --subject "${L_SUBJECT}" \
 --message "${L_MSG}"
 /sbin/shutdown -h now
fi

そして、cronに一分間隔で設定すれば、

* * * * * /usr/local/bin/script/mysqlmonitoring.sh > /dev/null 2>&1

プロセス監視によりAWS Auto-healingをかかる仕組みは出来ました。

 

TOP