at posts/single.html

10分でできる簡単バックアップ環境 (rdiff-backup)

少し時間ができたので、こないだ借りた VPS サーバにバックアップ環境を作った。 Joyent (旧TextDrive) を借りていたときは付属のストレージに rsync でミラーリングしていただけ(一世代のみのバックアップ)だった。

もう少しちゃんとバックアップしようと思い、WEB+DB PRESS Vol.47で紹介されていた rdiff-backup を使うことにした。 これまでは dar を使っていたんだけど、 rdiff-backup のほうがお手軽だった。

  • tar や dar のように1つのファイルに固めることなく、バックアップ先にそのままミラーリングされる。
  • 何もしなくても自動的に増分バックアップしてくれる。

rsync に世代管理機能が付いたような感じかな。

インストール

CentOS5 なので rpmfind.net から rpm を取得してインストールした。 依存関係になる librsync, pylibacl, pyxattr も合わせて取得。

  • librsync-0.9.7-11.el5.i386.rpm
  • pylibacl-0.2.1-6.el5.i386.rpm
  • pyxattr-0.2.1-4.el5.i386.rpm
  • rdiff-backup-1.0.5-2.el5.i386.rpm

バックアップ

以下のコマンドでバックアップできる。

rdiff-backup [保存元ディレクトリ] [保存先ディレクトリ]

保存先ディレクトは保存元ディレクトリと同じ内容になる。 唯一異なるのは、 rdiff-backup-data/ という管理用のディレクトリが追加されていること。 同じコマンドをもう1回実行すると、今度は変更のあったファイルだけがコピーされる(増分バックアップ)。 ファイルの増分は、 rdiff-backup-data/increments に圧縮されて保管しているみたい。 例えば test/dummy.txt というファイルが変更されると、前のバージョンへの差分が rdiff-backup-data/increments/test/dummy.txt.2008-11-16T22:41:31+09:00.diff.gz に保管される。

オプション

--print を付けるとバックアップ結果を表示してくれる。

$ rdiff-backup --print /var/www /var/backup/www

今回は、変更になったファイルが250個で、増加したファイルが252個あったみたい。

--------------[ Session statistics ]--------------
StartTime 1226844149.00 (Sun Nov 16 23:02:29 2008)
EndTime 1226844224.73 (Sun Nov 16 23:03:44 2008)
ElapsedTime 75.73 (1 minute 15.73 seconds)
SourceFiles 113281
SourceFileSize 327498824 (312 MB)
MirrorFiles 113281
MirrorFileSize 327314564 (312 MB)
NewFiles 0
NewFileSize 0 (0 bytes)
DeletedFiles 0
DeletedFileSize 0 (0 bytes)
ChangedFiles 250
ChangedSourceSize 8491522 (8.10 MB)
ChangedMirrorSize 8307262 (7.92 MB)
IncrementFiles 252
IncrementFileSize 54599 (53.3 KB)
TotalDestinationSizeChange 238859 (233 KB)
Errors 0
--------------------------------------------------

特定のディレクトリやファイルをバックアップから除外するときは --exclude オプションを付ける。

$ rdiff-backup --exclude '**.gz' /var/www /var/backup

現在のバックアップ状態を確認するには -l オプションを付ける。

$ rdiff-backup -l /var/backup/

いまは22:41と23:02の2世代分のバックアップが存在している。

Found 1 increments:
    increments.2008-11-16T22:41:31+09:00.dir   Sun Nov 16 22:41:31 2008
Current mirror: Sun Nov 16 23:02:29 2008

古い世代のバックアップを削除するには --remove-older-than オプションを付ける。 日付は 3D, 4W, 1M などで指定できる。詳しくは man rdiff-backup で確認できる。 1ヶ月前までの増分を保存するなら、以下のようになる(ちょっと嘘を書いていたので訂正)。

$ rdiff-backup /var/www /var/backup
$ rdiff-backup --remove-older-than 1M /var/backup

普通のバックアップだと、定期的にフルバックアップするけど、 rdiff-backup だと難しいことを考えなくていいのが楽。 ただ、増分バックアップだけだとちょっと怖いので、個人レベルでしかまだ使わないけどね。 当然、バックアップするとディスク容量が2倍+α(保存期間の差分)必要になるので、どれくらいディスクが必要かは考える必要がある。 個人レベルなら、バックアップを取りながら、保存期間を決めてもいいかも。

リモートバックアップ

[サーバ名::ディレクトリ名]とすることでリモートサーバのバックアップも可能。 ただし、バックアップ先のマシンにも rdiff-backup コマンドが必要。 ssh はコロンが1つなのに、 rdiff-backup は2つなのはなんでだろ?

$ rdiff-backup machu.jp::/var/www /var/backup

リストア

-r オプションを付けることで元に戻せる。

$ rdiff-backup -r now /var/backup /var/www

特定のバージョンに戻すなら 1D のように日付で指定できる。

$ rdiff-backup -r 1D /var/backup /var/www
$ rdiff-backup -r 2008-11-15 /var/backup /var/www

自動バックアップ

/etc/cron.daily に rdiff-backup.cron というファイルを作った。

/usr/bin/rdiff-backup --print --exclude '**/*.gz' --remove-older-than 1M machu.jp::/var/www /var/backup

まとめ

インストールさえできれば、あとは直感的に使えるのがいいところ。 個人レベルで使うにはちょうどいいお手軽さだね。 ディスクはいつか壊れるものなので、何もしないよりは rdiff-backup を使ってバックアップしておくといい。

参考

関連する日記