httpd、PHPで稼動しているWebシステムについて出来るだけ少ないダウンタイムでEBSを縮小する方法について考えてみました。出来るだけ少ないダウンタイムというのは数分程度の想定です。
OSはAmazon Linux
Webサーバーはhttpd
プログラムはPHP
DBはRDS(MySQL)
EC2インスタンスにEBS(10GB)が/data(/dev/xvdf)でマウントされている想定
10GBから5GBに縮小する手順です。
- 5GBのEBSを新規作成
- 10GBのEBSをマウントしてるインスタンスにアタッチ(/dev/xvdg)
- SSHでインスタンスに接続してEBSを/data2にマウント
- 10GBのEBSを移行元、5GBのEBSを移行先としたrsyncを実行
- httpd、crond、現在稼働中のバッチ処理などを停止
- 10GB、5GBのEBSをアンマウント&デタッチ
- 5GBのEBSをアタッチ(/dev/xvdf)&マウント
- httpd、crondを起動
EBSの中には単純なファイル(ログファイル、アップロードファイルとか)だけある想定です。DBのデータディレクトリだったりするとダメなのかもしれない。まだ検証してないので近いうちに検証結果と具体的な手順について投稿したいと思います。
※2018/02/18追記
手順4のrsyncについて別途投稿するほどの内容でなかったためここに追記します。
# crontab -e 0,15,30,45 * * * * flock -n /tmp/rsync.lock rsync --delete -av --log-file=/var/log/rsync-`date +"\%Y\%m\%d"`.log /data/ /data2 >/dev/null 2>&1
15分ごとにcronによるrsyncコマンドの呼び出しを行っています。
flockコマンドによる排他制御を行い多重起動はさせない想定です。
念のためログファイルを出力しています。
DATEフォーマットは%をエスケープしないでcronに登録するとうまく実行されないため注意が必要でした。
おわり