バックアップといえばコードはバージョン管理システムに入れて、DBデータはCloud SQLでバックアップの機能あるし、画像ファイルはGoogle Cloud Storageで管理すればいいだろ?
そんな風に考えていた時期がありました。いやもっと最小構成でいいんだこれが。DBなんかWEBサーバと同居でいいから。ていうか今そこまで手がまわらないからとりあえずサーバの定期バックアップ頼む! スナップショットでいい。とりあえずなにもないよりは断然いい!! そんな感じでバックアップ取りたいときに。
構成と仕様
- 常設サーバは1台(WEBサービス、DB同居)
- 他の管理サーバは立てたくない
- 自宅のPCすら定期的に立ち上げるかは保証できない
- つまり本番稼働しているサーバからバックアップをキックしたい。
- 常設サーバから日次でスナップショットの取得/削除を投げる
- 過去1週間分は必須だけど増やしすぎてもアレなので順次削除したい
- とはいえうっかり忙しかったときのために、過去1週間−日次、それ以上過去−月次(月末分)で保存しておこうと思う
- 月次分が増えすぎるのは、気づいた時に手動削除
事前準備
バックアップを動かすサーバで以下を実行。gcloud入ってなかったら入れてください。
gcloud auth login
gcloud config set project [project-id]
スクリプト
INSTANCE_NAME=[your-instance-name]
SNAPSHOT_ZONE_NAME=[your-snaphot-zone-id]
SNAPSHOT_PREFIX=[your-snaphot-prefix]
if [ `date -d '1 day' +'%d'` = "01" ];then
gcloud compute disks snapshot -q ${INSTANCE_NAME} --zone=${SNAPSHOT_ZONE_NAME} --snapshot-names=${SNAPSHOT_PREFIX}-${INSTANCE_NAME}-`date +'%Y%m'`
fi
for i in `seq 8 14`;do
gcloud compute snapshots delete -q ${SNAPSHOT_PREFIX}-${INSTANCE_NAME}-`date -d "${i} days ago" +'%Y%m%d'`
done
gcloud compute disks snapshot -q ${INSTANCE_NAME} --zone=${SNAPSHOT_ZONE_NAME} --snapshot-names=${SNAPSHOT_PREFIX}-${INSTANCE_NAME}-`date +'%Y%m%d'`
※毎日動くことを想定しているのなら古いsnapshotのdeleteは1日分(8日前分)だけでいいはずですけれども、なんとなく、つい、念のため。存在しないスナップショットに対し削除かけるとエラーが返ってきますが問題はないです。
cronに設定
日次で設定。時間はまあ適当に。
0 0 * * * bash /path/to/your/backup.sh
動作確認OS
Debian GNU/Linux 9 (stretch)