UbuntuでZFSを使ってみよう 第16回 遠隔地へバックアップしてみよう
前回は、スナップショットを使用したバックアップ/リストア方法について説明しました。今回は、ZFSを遠隔地へバックアップ・リストアする方法を説明します。
sshを使用したZFS ファイルストリームのバックアップ・リストア
前回説明したとおり、ZFSのバックアップは zfs send
で標準出力として出力されます。このファイルストリームを利用して、以下のようにssh接続先へファイルストリームをバックアップ可能です。スナップショット間の差分も同様にバックアップ可能です。
$ zfs list -rt all rpool/USERDATA/user1
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user1 296K 780G 104K /home/user1
rpool/USERDATA/user1@aaa 64K - 104K -
rpool/USERDATA/user1@ccc 64K - 104K -
rpool/USERDATA/user1@ddd 56K - 104K -
# スナップショット aaa を backup.local へ送信し、backup.local 内で圧縮して保管
$ sudo zfs send rpool/USERDATA/user1@aaa | bzip2 --compress --stdout | ssh backup.local 'cat > ./user1_aaa.bz2'
$ ssh backup.local ls -l user1_aaa.bz2
-rw-rw-r-- 1 user user 3672 2月 14 13:56 user1_aaa.bz2
# スナップショット aaa→ccc、ccc→ddd の差分をバックアップ
$ sudo zfs send -i rpool/USERDATA/user1@aaa rpool/USERDATA/user1@ccc | bzip2 --compress --stdout | ssh ubuntu4.gpm.local 'cat > ./user1_aaa_ccc.bz2'
$ sudo zfs send -i rpool/USERDATA/user1@ccc rpool/USERDATA/user1@ddd | bzip2 --compress --stdout | ssh ubuntu4.gpm.local 'cat > ./user1_ccc_ddd.bz2'
バックアップの実行ユーザuserは送信元と送信先両方に作成し、sudoersを設定しパスワード無しでのzfs実行を可能としています。また、送信元と送信先では、userのssh公開鍵を交換済みです。
では、バックアップしたデータをリストアします。
$ ls /home/user1
aaa ccc ddd eee
# user user1 を削除(スナップショットが含まれているため、再帰的に削除するオプション`-r` が必要)
$ sudo zfs destroy -r rpool/USERDATA/user1
# backup.local のバックアップファイルからリストア
$ ssh backup.local cat user1_aaa.bz2 | bzip2 --decompress --stdout | sudo zfs receive rpool/USERDATA/user1
# 差分バックアップのリストア
$ ssh backup.local cat user1_aaa_ccc.bz2 | bzip2 --decompress --stdout | sudo zfs receive rpool/USERDATA/user1
$ ssh backup.local cat user1_ccc_ddd.bz2 | bzip2 --decompress --stdout | sudo zfs receive rpool/USERDATA/user1
# zfs のマウントポイント設定などはリストアされないことに注意
$ zfs list -rt all rpool/USERDATA/user1
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user1 240K 780G 104K /user1
rpool/USERDATA/user1@aaa 64K - 104K -
rpool/USERDATA/user1@ccc 64K - 104K -
rpool/USERDATA/user1@ddd 0B - 104K -
$ ls /user1
aaa ccc ddd eee
このように、外部にバックアップファイルを保管することで、ZFS自体のバックアップを直接実施可能です。今回はbzip2による圧縮および展開を、sshでの送信後に実施しています。これはssh間の送信量を少なくするためです。
sshを使用した、ZFSファイルシステムの同期
上記ではZFSファイルストリームをバックアプしましたが、外部送信先がZFSに対応している場合はZFS間での動機が可能です。
# backup.local にもZFS が存在する
$ ssh ubuntu4.gpm.local zfs list -rt filesystem rpool/USERDATA
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA 538M 108G 96K /
rpool/USERDATA/root_8cj8ac 392K 108G 128K /root
rpool/USERDATA/user_8cj8ac 538M 108G 517M /home/user
# バックアップ対象はrpool/USERDATA/user2
$ zfs list -rt all rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2 296K 780G 104K /user2
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 64K - 104K -
rpool/USERDATA/user2@ddd 56K - 104K -
# ddd 以前のすべてのスナップショットを含めてバックアップ(ssh -C でssh通信でgzip圧縮)
$ sudo zfs send -R rpool/USERDATA/user2@ddd | ssh -C user@backup.local sudo zfs recv -F -d rpool
# user2 がホストbackup.localに同期されている
$ ssh backup.local zfs list -r t filesystem rpool/USERDATA
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA 539M 108G 96K /
rpool/USERDATA/root_8cj8ac 392K 108G 128K /root
rpool/USERDATA/user_8cj8ac 538M 108G 517M /home/s-miyaza
rpool/USERDATA/user2 104K 108G 104K /user2
# すべてのスナップショットを確認
$ ssh backup.local zfs list -r -t all rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2 240K 108G 104K /user2
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 64K - 104K -
rpool/USERDATA/user2@ddd 0B - 104K -
ここでは、-R オプションを使用したすべてのスナップショットを一度に同期しました。もちろんスナップショット間の差分バックアップを使用した同期も可能です。このとき、差分の順番を間違えると同期できないことに注意しましょう。
バックアップ先からのリストアは、バックアップと同様に行えます。
$ ls /user2
aaa ccc ddd eee
# user2 を削除
$ sudo zfs destroy -r rpool/USERDATA/user2
# backup.local の rpool/USERDATA/user2 からリストア
$ ssh -C backup.local sudo zfs send -R rpool/USERDATA/user2@ddd | sudo zfs recv -F -d rpool
# リストア完了
$ zfs list -rt all rpool/USERDATA/user2
NAME USED AVAIL REFER MOUNTPOINT
rpool/USERDATA/user2 240K 780G 104K /user2
rpool/USERDATA/user2@aaa 64K - 104K -
rpool/USERDATA/user2@ccc 64K - 104K -
rpool/USERDATA/user2@ddd 0B - 104K -
ZFSファイル同期を利用すると、重要なデータだけを遠隔地にバックアップ・リストアすることが出来ます。また特定のアプリケーション・データ領域をZFSファイルシステムで分離し、遠隔地にスナップショット差分バックアップを行うと、ディザスタリカバリにも役立ちます。
終わりに
今回は、ZFSを遠隔へバックアップ・リストアする方法について説明しました。ZFSを使用すると全てのデータのバックアップだけでなく、スナップショット間の差分も送信可能なため、バックアップ送信時間の短縮が可能です。これは大きなメリットですので覚えておきましょう。次回は、ZFSクローンを使用したリカバリ方法について説明します。次回をお楽しみに。
さて、このコラムを掲載いただいているデジタル・ヒュージ・テクノロジー社は老舗のOSSインテグレーターです。特にLinuxは強く、OSSを活用した業務システムの実績も多いです。興味がある方は以下のページもご覧ください。
DHT OSS導入コンサルティングサービス