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をかかる仕組みは出来ました。