こんにちは。松本です。
今回は、Btrfsを使ったより高度なバックアップの方法をご紹介します。
■Btrfsで増分バックアップ(Incremental Backup)
Btrfsには、Incremental Snapshot Transfer 機能があります。
直訳すると、増分スナップショット転送機能ですね。
その名の通り、スナップショットの増分データを転送することが出来ます。
増分バックアップについては、ウィキペディアの増分バックアップにわかりやすく書いてあります。
スナップショットは、あくまでも一時的なバックアップです。
スナップショットのデータは元のLinuxマシン内に作られるので、そのノードが壊れると復旧出来なくなる恐れがあります。
そのため、スナップショットは外のストレージに退避しておくと良いでしょう。
- マシンや業務システムを停止させずにバックアップするために、スナップショット使う
- そのスナップショットを外部に退避して、障害に備える。
Btrfsでは、次のような手順になります。
# btrfs subvolume snapshot -r 【btrfsのサブボリューム】 【スナップショット名】
# sync
スナップショットを"リードオンリー"で取得していることに注意してください。
また、syncでディスクキャッシュをディスクに書き込まないと、次のコマンドでエラーが発生する場合があります。
スナップショットを作ったら、今度はそのスナップショットデータを外部のストレージに送ります。
# btrfs send -v 【スナップショット名】-f 【出力先のパス】
NASを/mnt/nasにマウントしている場合の例
:
# btrfs send /.home_snp -f /mnt/nas/home_snp_1st.btrfs
ただし、残念なことに2015/02/01現在、CentOS7の "btrfs-progs-3.12-4.el7.x86_64" ではバグにより上記コマンドは失敗します。
私の自宅のArch Linuxでは、正常に動作しています。
ubuntuやdebianは未確認です。
リストアは、次のように出来ます。
# btrfs receive 【スナップショット名】-f 【リストア先のパス】
例:予め"home2"をBtrfs領域として準備していた場合
# btrfs receive /mnt/nas/home_snp_1st.btrfs /home2
出力先は、Btrfsデバイスがマウントされた領域である必要があります。
また、リストア先に作られた領域は、btrfs のリードオンリーなファイルシステムです。
リストア先を削除したい場合は、"btrfs subvolume delete" コマンドを使います。
増分バックアップは、次のように行います。
はじめに2回目のスナップショットを取ります。
# btrfs subvolume snapshot -r 【btrfsのサブボリューム】 【2回目のスナップショット名】
# sync
次に1回目との増分バックアップを行います。
# btrfs send -p 【1回目のスナップショット名】 【2回目のスナップショット名】 -f 【出力先のパス】
以降、3回目のスナップショットをとり、2回目との増分バックアップを行い・・・と繰り返していくと、増分バックアップの運用となります。
増分バックアップですので、リストアで全てのデータを戻したい場合は、1回目のスナップショットから順番に全てのスナップショットを戻す必要があります。
差分バックアップ(Differencial Backup)を行いたい場合は、毎回、1回目(つまりフルバックアップ)との増分バックアップを行えば良いです。
次のような流れですね。
- 1回目のスナップショットを取る
- 2回目のスナップショットを取り、1回目との増分バックアップを行う
- 3回目のスナップショットを取り、1回目との増分バックアップを行う
- 繰り返し・・・
■リモートマシンのBtrfs領域にバックアップ
先程は、バックアップを行うノードにNASの領域をマウントしたり、USB接続のHDDを接続した場合を想定したバックアップの例でした。
次は、別のネットワークにいるノードにバックアップする方法です。
最初のスナップショットを取ったら、次のコマンドを実行しましょう。
# btrfs send -p 【スナップショット名】 | ssh -i 【秘密鍵】 【リモートアドレス】 btrfs receive【出力先のパス】
ここでも、出力先のパスのファイルシステムは、Btrfsである必要があります。
見ての通り、ssh を使っています。
Btrfsのsendコマンドは、データをストリーミングしますので、パイプを使うとこのような使い方が出来ます。
ssh は、今回のようにコマンドを直接書いて実行することで、リモートマシンでそのコマンドを実行することが出来ます。
rootユーザ以外で接続する場合は、"sudo btrfs・・・"のように実行すると良いです。
もし、sshでは遅いので、暗号化通信が出来なくても良いので時間短縮を狙いたい、という場合には "mbuffer" を使うと良いです。
●受信ノード
# mbuffer -I 【ポート番号】 | btrfs receive【出力先のパス】
●送信ノード
# btrfs send -p 【スナップショット名】 | mbuffer -O 【ポート番号】 【リモートアドレス】
mbufferは、先に受信ノードで起動して待ち受けます。
次に、受信ノードと同じポート番号で送信します。
参考:ssh を使わない zfs send/recv
■実用的なバックアップスクリプト
Btrfsでは、コマンドで簡単にバックアップが取れますが、きちんとした運用を行うためにはもう少し工夫が必要です。
例えば、バックアップを複数世代残したい場合や、定期的に自動バックアップを行う場合には、スクリプトを作成する必要があります。
自分で作るのもいいですが、既に入手可能なものがありますので、そちらをご紹介します。
以下の3つは、BtrfsのWikiで紹介されているものです。
好みのツールを使って、cronで定期的に実行させると良いですね。
■GUI/CUIツール、Snapper
Snapperは、openSUSEで作られたスナップショットツールです。
openSUSE以外でも、CentOS7やArch Linuxにはパッケージがありますので、簡単に使うことが出来ます。
また、Snapperの公式サイトのダウンロードページには、その他のディストリビューション向けにパッケージが用意されています。
Suseの管理ガイドやArch LinuxのArchWikiを参考に、是非使ってみてください。
■Amazon S3やAzure BLOBにバックアップ
btrfsの send/receive コマンドは、ssh や mbuffer と組合せられることを書きました。
もう少し応用すると、Amazon S3やAzure BLOBといった、クラウドストレージにバックアップすることも可能です。
Azure BLOBを使うことで、安価かつ安全なストレージにバックアップを保存することが出来ます。
また、Amazon S3ではGlacierという非常に安価なストレージがあります。
その他にも、Cloudn Object Storage、IDCフロンティア オブジェクトストレージ、IIJ GIOストレージサービス、ニフティクラウドストレージなどがありますね。
それぞれ、簡単に使えるツールやAPIがありますので、試してみてください。
SSHとAmazon S3に対応したBtrfsのツールをご紹介しておきます。
最後はやや駆け足になりましたが、これで「Btrfsでバックアップ」は最終回となります。
Btrfsは、バックアップ以外にもいろいろな機能がある強力なファイルシステムです。
是非、皆様で実際に触ってみてください。