AWS Fault Injection Simulator (AWS FIS) は、AWS ワークロードでフォールトインジェクション実験を実行できるマネージドサービスです。
この機能を利用してDataKeeperリソースのベースとなるEBSボリュームに疑似的なIOエラーを発生させ、アプリケーションエラーをLifeKeeperに検知させ、フェイルオーバーの試験とする場合の方法について記述します。
DataKeeperリソースの監視機能には、ユーザレベルでのI/Oを監視する機能は実装されておらず、レプリケーションを行う上で、必要なデバイスの状態を確認し、必要であればフラグファイルを作成するという動作を行います。
レプリケーションが実施不可な状態であっても、ファイルシステムリソースとしては利用可能である状況を考慮し、監視処理中にリソース障害と判定する動作はありません。
実際にDataKeepeリソースに対してR/Wを行うプログラムを実行中に、AWS FIS のEBSボリューム障害テストを実施したところ、AWS FISのEBSボリュームの障害テストは、EBSボリュームへのIOを一時停止するだけで、アプリケーションにIOエラーを通知しませんでした。
単純にEBSボリュームへのI/Oを一時停止するだけのアプリケーションは、実験実行中はI/O命令が一時停止状態となるだけでエラーとはならず、実験終了後、再度一時停止したところから再開してしまいます。
共有ディスクにDataKeeperリソースを使用したLifeKeeperシステムでは、ユーザレベルのI/O障害検知は、親リソースとなるファイルシステムあるいはアプリケーションリソースが行います。
したがって、AWS FISのEBSボリュームの障害テストを使用してDataKeepeリソースで障害として検知するには、データディスクに対するI/Oタイムアウトを検知できるアプリケーションリソースをDataKeeperリソースの親リソースとして依存関係を定義する必要があります。
この機能を実装するには、GenericARK開発ガイドとサンプルスクリプト に記載のサンプルスプリプトを使用して、GenericARK開発ガイドを参考に、DataKeeperでミラーされた領域にR/WするスクリプトをGenericARKのquickCheckとして登録したリソース(ここではDISK-IO-CHECK)を作成しDKリソースの親リソースとして依存関係を設定します。restore(起動)とremove(停止)のスクリプトはexit 0だけを記述したダミースクリプト、recover(復旧)は未指定でリソースを作成します。
AWS FISでEBSボリュームへのIOを一時停止すると、120秒毎に実施されるquickCheckがエラーで終了(exit 1)し、これがトリガーとなり待機系へフェイルオーバーします。
この検証はSIOS Protection Suite (SPS) for Linux v9.7.0 / RHEL9.0 / AWS EC2 (t3a.micro) / EBS (gp3) で行いました。
- EBSボリュームのIO一時停止操作
⇓
- 停止時間を3分に設定して実験
- quickCheckスクリプト(サンプルスクリプトに処理を追加)
# AWS FIS EBSボリューム障害チェック処理定義 #
#
ebs_rw () {
for i in {0..5}
do
echo $i > /mnt/DR/FIS/EBS-TST.txt
date >>/mnt/DR/FIS/EBS-TST.txt
echo STATUS=$? >> /mnt/DR/FIS/EBS-TST.txt
cat /mnt/DR/FIS/EBS-TST.txt
sleep 1;
done
}
#####################
# Main (quickCheck) #
#####################
# ステータスチェック
STAT=$(/opt/LifeKeeper/bin/ins_list -t $TAG | cut -f7 -d $'\001')
if [ $STAT != ISP ]
then
log LK_INFO 7 "resource $TAG is not ISP status"
exit 0
fi
# Set timeout
trap 'handlealarm' INT
setalarm $TIMEOUT
# R/W処理(ebs_rw)実行、タイムアウトでループ終了
while true
do
ebs_rw $START_SUCCESS_CODE
STATUS=$?
case "$STATUS" in
$START_SUCCESS_CODE) # 監視 O.K.
exit 0 ;;
$CHECK_RETRY_CODE) # リトライ
# 待ち時間
sleep 5
continue ;;
*) # 監視失敗
log LK_ERROR 8 "quickCheck FAILED ret="$STATUS""
# Go to local recovery
exit 1 ;;
esac
done
exit 1
- restore / removeスクリプト
#!/bin/bash
exit 0
関連リンク:
[Linux] DataKeeper for Linux の処理概要
[Linux] GenericARK開発ガイドとサンプルスクリプト