アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

btrfs のスナップショットを使った差分バックアップ

こんにちは、tahara です。

おかげさまで、いこーよ 月間一千万ページビューこえました。ありがとうございます。 AWS のオートスケールの出番ができて嬉しいです。

今回は btrfs のスナップショットを使ったバックアップについて書いてみたいと思います。

以前は rsync の —link-dest オプションを使って、変更のないファイルは前日のバックアップからハードリンクをはって、差分バックアップを行っていました。 この方法だと前日のバックアップが失敗していた場合、フルバックアップになってしまい、あっとういまにディスクを使いきってしまいます。

その対策として btrfs のスナップショットを使った差分バックアップに切り替えました。

今回は既にバップアップディスクが ext4 になっていたので、それを btrfs に変換しました。

こんな感じのバックアップディスクになっていました。

/dev/sde1 on /backup type ext4 (rw,commit=0)

btrfs に変換します。

sudo apt-get install btrfs-tools
sudo umount /backup/
sudo btrfs-convert /dev/sde1

これで btrfs に変換できました。

次にスナップショットをとるためにサブボリュームを作ります。

sudo mkdir /btrfs
sudo mount -t btrfs -o compress /dev/sde1 /btrfs
sudo btrfs subvolume create /btrfs/backup

確認してみます。

sudo btrfs subvolume list /btrfs
ID 256 top level 5 path ext2_saved
ID 257 top level 5 path backup

ext2_saved の方は ext4 から btrfs に変換した時に作られたバップアップファイルです。 きちんと変換できていればいらないので消してしまいます。

sudo btrfs subvolume delete /btrfs/ext2_saved/

sudo blkid で UUID を確認し sudo vi /etc/fstab を書き換えます。

UUID=b20c3f2a-37e0-47ac-96df-3051d30f917a /btrfs btrfs compress 0 0
UUID=b20c3f2a-37e0-47ac-96df-3051d30f917a /backup btrfs subvol=backup,compress 0 0

パックアップスクリプトはこんな感じのシンプルなものになります。 rsync でファイルをバックアップして、btrfs のスナップショットをとります。 /backup の下は常に最新のバックアップで、/btrfs/backup-snapshot の下に日毎にバックアップのスナップショットが作られます。

#!/bin/sh

rsync -azv --delete foo@example.com:/var/www/app /backup
rsync -azv --delete bar@hoge.jp:/var/www/hoge-ap /backup
/sbin/btrfs subvolume snapshot /backup /btrfs/backup-snapshot/`date +%Y%m%d`

シンプルでディスク容量を節約できるバックアップになりました。

最後に、弊社ではエンジニアを募集しています。