Web更新

Ununtuで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導入コンサルティングサービス

関連記事一覧