はじめに
レンタルサーバやVPSを借りていると不意にデータが飛ぶことがたまにありますよね。
そんなときに備えて自宅サーバにリモートサーバのデータを差分でバックアップしておけると安心です。
有償/無償/商用も含めて様々なソリューションがあると思いますが、自分はお手軽にrsyncだけで実施しています。
方針
リモートのサーバAから、手元のサーバBにバックアップします。
- リモートサーバA(IPアドレスaaa.bbb.ccc.ddd)
- [cron]リモートサーバA内のバックアップ対象データを /for_backup/ に集める
- 手元のサーバB
- [cron]rsyncで A:/for_backup/ を /remote_a_backup/latest に転送する
- [cron]rsyncで /remote_a_backup/latest を /remote_a_backup/YYYYMMDD に差分バックアップする
スクリプト
リモートサーバA内のバックアップ対象データを /for_backup/ に集める
まあ適当に。
gather_for_backup.sh
# !/bin/sh
rsync --progress -av --delete /etc /for_backup/
rsync --progress -av --delete /data /for_backup
rsync --progress -av --delete /root/bin /for_backup/root
rsync --progress -av --delete /var/lib/mysql /for_backup/var/lib
...
# chown for rsync
chown -R takeuchi.rsync /for_backup
rsyncで A:/for_backup/ を /remote_a_backup/latest に転送する
rsync_from_remote_server.sh
# !/bin/sh
rsync --progress -avz -e ssh --delete --bwlimit=150 takeuchi@aaa.bbb.ccc.ddd:/for_backup/ /remote_a_backup/latest
rsyncで /remote_a_backup/latest を /remote_a_backup/YYYYMMDD に差分バックアップする
rotation.sh
# !/bin/sh
# 世代バックアップ
# ROTATE_DAYS : LATEST_DIR を含めて何世代バックアップするか
ROTATE_DAYS=30
#
BASEDIR=/remote_a_backup
LATEST_DIR=${BASEDIR}/latest/
NEW_DIR=${BASEDIR}/`date -d '-1 day' +%Y%m%d`/
LINK_DIR=${BASEDIR}/`date -d '-2 day' +%Y%m%d`/
OLDEST_DIR=${BASEDIR}/`date -d "-$ROTATE_DAYS day" +%Y%m%d`/
rm -rf $OLDEST_DIR
rsync -avz --progress --delete --link-dest=$LINK_DIR $LATEST_DIR $NEW_DIR
crontab(ローカルサーバ)
crontab
0 7 * * * /remote_a_backup/rsync_from_remote_server.sh > /tmp/a-backup-rsync.log; /remote_a_backup/rotation.sh > /tmp/a-backup-rotation.log
本当はもう少し異常系の処理が必要とは思いますけど 30 日以内に気づくという前提で。。