2011/01/13: zfsでバックアップ管理
おうちサーバをzfs(+mirror)構成にしたので、バックアップをzfs snapshotでとるようにしました。 ディスク構成はこんな感じ。
% zpool status pool: tank state: ONLINE scrub: scrub completed after 5h58m with 0 errors on Tue Jan 11 19:08:30 2011 config: NAME STATE READ WRITE CKSUM tank ONLINE 0 0 0 mirror ONLINE 0 0 0 gptid/b4ede3f7-7374-11df-88ce-02301b00361b ONLINE 0 0 0 gptid/195e4153-c00c-11df-bd35-02301b00361b ONLINE 0 0 0 errors: No known data errors % df -g Filesystem 1G-blocks Used Avail Capacity Mounted on /dev/ad4p2 1 0 1 24% / devfs 0 0 0 100% /dev /dev/md0 0 0 0 0% /tmp procfs 0 0 0 100% /proc tank 842 0 842 0% /tank tank/local 1623 781 842 48% /usr/local tank/obj 844 2 842 0% /usr/obj tank/ports 844 1 842 0% /usr/ports tank/src 843 0 842 0% /usr/src devfs 0 0 0 100% /var/named/dev
/usr/local以下(tank/local)を毎日バックアップします。 まず、cronで毎晩下記のシェルスクリプトをroot権限で実行します。
#!/bin/sh
zfs snapshot tank/local@`date "+%Y%m%d"`
以前に使ってたpdumpfsの場合は一時間ぐらいかかってバックアップを作成してましたが、snapshotは一瞬で出来上がります。 snapshotはzfs listで確認できます。
% zfs list -t snapshot NAME USED AVAIL REFER MOUNTPOINT tank/local@20101229 29.2M - 693G - tank/local@20101230 22.2M - 700G - tank/local@20101231 21.6M - 711G - tank/local@20110101 22.7M - 711G - tank/local@20110102 20.3M - 711G - tank/local@20110103 21.0M - 712G - tank/local@20110104 11.2G - 733G - tank/local@20110105 6.26G - 753G - tank/local@20110106 208M - 747G - tank/local@20110107 195M - 747G - tank/local@20110108 7.75G - 762G - tank/local@20110109 291M - 771G - tank/local@20110110 193M - 769G - tank/local@20110111 219M - 782G - tank/local@20110112 275M - 781G - tank/local@20110113 72.0M - 781G -
このままにしておくと、snapshotが日毎に際限なく増えていくので、過去のsnapshotは間引いていきます。 pdumpfs-cleanをベースにsnapshot-cleanというrubyスクリプトを作りました。
僕の場合、下記のルールでバックアップを保持しています。
- Daily backupを7日分
- Weekly backupを8週間分
- Monthly backupを18ケ月分
- Yearly backupを4年分
下記の引数でsnapshot-clean
を実行すると、過去のsnapshotがこのルールを元に消されていきます。
削除もあっという間に終わります。
% sudo snapshot-clean -v --keep 4Y18M8W7D Deleting tank/local@20101229 ... done. Deleting tank/local@20101230 ... done. Deleting tank/local@20101231 ... done. Deleting tank/local@20110103 ... done. Deleting tank/local@20110104 ... done. Deleting tank/local@20110105 ... done. Deleting tank/local@20110106 ... done. Keep snapshots: tank/local@20110101 tank/local@20110102 tank/local@20110107 tank/local@20110108 tank/local@20110109 tank/local@20110110 tank/local@20110111 tank/local@20110112 tank/local@20110113 tank/obj@null
バックアップは、(mountpoint)/.zfs/snapshot/からアクセスできます。
% ls -l /usr/local/.zfs/snapshot/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110101/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110102/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110107/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110108/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110109/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110110/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110111/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110112/ drwxr-xr-x 20 root wheel 20 Jul 21 22:00 20110113/
当たり前ですが、スナップショットは同一HDD内に保持するため、HDD 1台でzfsしている環境だとHDD壊れたらバックアップごと吹っ飛びます。 ミラー構成やRAID構成が前提です。
SUMIKAWA Munechika / Daydreamers On the Net