rsyncを使用したZFSプールのバックアップ


0

現在、個人ファイルを保存するためのFreeNASボックスを持っています。オフサイトのバックアップが必要ですが、ZFSを適切に実行できる2台目のコンピューターにお金を費やすつもりはありません。そのため、を使用してリモートバックアップを取ることを計画していましたrsync

バックアップ内のすべてのファイルに一貫性を持たせたいので、最初に再帰的なスナップショットを作成し、次にを使用してそれを転送することでできると考えましたrsync。ただし、データセットごとに個別のスナップショットが作成されます。

今、私はすべてのデータセットを含む再帰的なスナップショットを表示する方法があるかどうか、またはrsync全体に他の推奨される方法があるかどうか疑問に思っていますzpool。データセット自体に存在するシンボリックリンクを保持し.zfsたいので、データセット内のフォルダへのrsyncシンボリックリンクだけでは機能しないと思います。


編集

私が受け取ったコメントに基づいて、希望する構成の詳細が整っていると思います。自宅にNASを用意して、快適にデータを配置できるようにしたいと考えています。それを失うことはまずないでしょう。私にとって、これは複数のコピーをオンサイトに、複数のコピーをオフサイトに、物事が非常に悪くなった場合のオフラインコピー、偶発的な削除の場合のデータの定期的なスナップショット、およびデータエラーを防ぐ手段(ビット腐敗など)を意味します。イベントが発生する可能性が低いほど、大災害後にデータの複数のコピーを持たないことになり、スナップショットをあまり気にしなくなります。また、通常は別のデバイスにコピーがあるため、新しいデータよりも古いデータの方が重要です。最後に、ほとんどのファイルはあまり頻繁に更新されないことに注意してください。転送のほとんどは新しいファイルになります。

私の以前のセットアップは、4TBの外部ハードドライブが接続された2つのRaspberry Piのセットでした。この戦略に対する信頼を失いましたが、ハードウェアはすぐに利用できました。いくつかの調査の結果、エラーが時間を経て潜入するのを防ぐ唯一の方法は、ECC RAMやUPSなどのサーバーグレードコンポーネントと組み合わせたZFSなどのチェックサムファイルシステムを使用することであると思われました。私のローカルコピーでは、このルートに行きました。ミラーで2x4TBディスクを使用し、ここで定期的なスナップショットを作成します。

このマシンは、オフサイトバックアップとオフラインバックアップを除くすべてのケースをカバーする必要があります。私はこれらのバックアップを必要としない可能性が高いため、あまり多くの投資をするつもりはありません。したがって、私はすでに横になっていたRaspberry Piと外部ディスクを使用できると考えました。一方のディスクが常にオフラインで、もう一方のディスクがバックアップを受信するようにできます。ディスクを定期的に変更すると、古いデータのオフラインバックアップを作成できます。

簡単なルートが使用することですzfs sendし、receive二つのプール、各ディスク上の1に。ただし、Raspberry PiとハードドライブへのUSB接続を組み合わせた場合、zfs動作するための非常に信頼性の高い環境(またはそのためのファイルシステム)は提供されません。使用するディスクは1つだけなのでzfs、障害から回復するための信頼できる手段はありません。

それが私が一緒に行きたいext3ext4一緒にしたい理由rsyncです。確かに、いくつかの不良ビットがディスクに書き込まれる可能性があります。メタデータの場合、これらの問題のほとんどを修正するツールがあります。データブロックの場合、単一のファイルが失われます。また、rsync -c不正なチェックサムを検出し、ローカルマシン上の既知の正常なコピーからファイルを再度転送するため、ファイルを使用して回復できます。理想的とは言えないハードウェアを考えると、これは可能な限り最良のソリューションのようです。

それが私が使用する理由でありrsync、それがどのようにrsync反抗するかという当初の質問につながりましたzfs snapshot。私があなたのアドバイスのどれにも触れなかった場合、私は本当に代替案を受け入れているので私に知らせてください。私は現在、それらがどのように私に利点を提供しているか見ていない。

回答:


1

rsyncRaspberryPiとRaspberryPi を使用することにかなりの準備ができているように思えるので、ここで解決策を見つけるのに役立つと思われる、ちょっとした頭脳ダンプの別の答えを示します。


今、私はすべてのデータセットを含む再帰的なスナップショットを表示する方法があるのか​​、またはzpool全体をrsyncする他の推奨される方法があるのか​​疑問に思っています。

私が知っていることではありません...推奨事項は他の答えの線に沿っていることを期待しています。


rsyncマウントされたZFSプールで単純に実行することに満足している場合は、を使用して.zfsディレクトリを除外するか(表示されている場合)rsync --exclude='/.zfs/'snapdir=hiddenプロパティを設定します。

ただし、各データセットはどこにでもマウントでき、おそらく見逃したくないため、これは問題を引き起こします...


スナップショットを管理し、「」の新しいスナップショットを作成し、バックアップし、後で削除する可能性があります。(「ライブ」マウントされたファイルシステムを使用するだけでなく)このアプローチを取ることで、ある時点の一貫したバックアップが得られます。また、奇妙な階層をバックアップしたり、他の場所にマウントされているファイルシステムを見逃したりしないようにします。

$ SNAPSHOT_NAME="rsync_$(date +%s)"
$ zfs snapshot -r ${ROOT}@${SNAPSHOT_NAME}
$ # do the backup...
$ zfs destroy -r ${ROOT}@${SNAPSHOT_NAME}

次に、を実行してバックアップするデータセットの完全なリストを取得する必要がありますzfs list -Hrt filesystem -o name ${ROOT}。たとえば、usersツリーをバックアップしたい場合、以下に例を示します。

$ zfs list -Hrt filesystem -o name ell/users
ell/users
ell/users/attie
ell/users/attie/archive
ell/users/attie/dropbox
ell/users/attie/email
ell/users/attie/filing_cabinet
ell/users/attie/home
ell/users/attie/photos
ell/users/attie/junk
ell/users/nobody
ell/users/nobody/downloads
ell/users/nobody/home
ell/users/nobody/photos
ell/users/nobody/scans

これにより、興味のあるファイルシステムの再帰的なリストが得られます...

ただし、特定のデータセットをスキップすることもできますが、これを実現するためにプロパティを使用することをお勧めしますrsync:sync=false。たとえば、そのデータセットの同期を防ぐことができます。これは、最近追加しsyncoidたものと同じアプローチです。

以下のフィールドはタブ文字で区切られています。

$ zfs list -Hrt filesystem -o name,rsync:sync ell/users
ell/users   -
ell/users/attie -
ell/users/attie/archive -
ell/users/attie/dropbox -
ell/users/attie/email   -
ell/users/attie/filing_cabinet  -
ell/users/attie/home    -
ell/users/attie/photos  -
ell/users/attie/junk    false
ell/users/nobody    -
ell/users/nobody/downloads  -
ell/users/nobody/home   -
ell/users/nobody/photos -
ell/users/nobody/scans  -

また、ZFSデータセットはどこにでもマウントできるため(上記で指摘したように)、VFSに表示されるのでそれらを考えることは実際には大丈夫ではないことを理解する必要があります。そのような。

これを実現するために、スラッシュ/を3つのアンダースコア___(またはファイルシステムの名前には通常表示されないその他の区切り文字)に置き換えることにより、ファイルシステム名をフラット化します。

$ filesystem="ell/users/attie/archive"
$ echo "${filesystem//\//___}"
ell___users___attie___archive

これはすべて、単純なbashスクリプトにまとめられます。次のようなものです。

注:私はこれを簡単にテストしただけですが、さらにエラー処理が必要です。

#!/bin/bash -eu

ROOT="${ZFS_ROOT}"
SNAPSHOT_NAME="rsync_$(date +%s)"
TMP_MNT="$(mktemp -d)"

RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}"

# take the sanpshots
zfs snapshot -r "${ROOT}"@"${SNAPSHOT_NAME}"

# push the changes... mounting each snapshot as we go
zfs list -Hrt filesystem -o name,rsync:sync "${ROOT}" \
    | while read filesystem sync; do
        [ "${sync}" == "false" ] && continue
        echo "Processing ${filesystem}..."

        # make a safe target for us to use... flattening out the ZFS hierarchy
        rsync_target="${RSYNC_TARGET}/${filesystem//\//___}"

        # mount, rsync, umount
        mount -t zfs -o ro "${filesystem}"@"${SNAPSHOT_NAME}" "${TMP_MNT}"
        rsync -avP --exclude="/.zfs/" "${TMP_MNT}/" "${rsync_target}"
        umount "${TMP_MNT}"
    done

# destroy the snapshots
zfs destroy -r "${ROOT}"@"${SNAPSHOT_NAME}"

# double check it's not mounted, and get rid of it
umount "${TMP_MNT}" 2>/dev/null || true
rm -rf "${TMP_MNT}"

最初は私の意見に同意しなかったときに、多くのスクリプトを書くことさえ面倒でした。データセットを反復処理することが最善の解決策のようです。.zfs/snapshotディレクトリをコピーするだけでなく、スナップショットをマウントする特定の理由はありますか?
オクタビオール

いいえ問題は、私はそれが便利:-)願っていません
Attie

明示的だろうどこかでそれを実装するための主な理由は、「どこに搭載されている?」という質問を(上記のように)...ファイルシステムの検査なしにmountpoint財産を、およびファイルシステムが中に表示される場所あなたが確認することはできません伴うすべての問題に対処しますVFS。
Attie

2

私は非常に使用してお勧めしたいzfs sendzfs receiveオーバーrsync-それはかなり速くなると他の主要な利点(例えば:欠落していない変更、キーを必要とせずに暗号化)が付属しています。

データセットをプッシュする機能を提供するストレージサービスがあります(サポートするサービスを使用するのと同様rsync)。

私が強くお勧めする素晴らしいツールsyncoidサノイドプロジェクトの一部)もあります。スナップショットを管理し、プッシュまたはプル操作を許可します。

本講演ではとの違いについて説明zfs send/recvし、をrsync


フォローアップとして、Obnam(現在は廃止)から移行し、スナップショットを使用してZFSに落ち着きました。また、私はオフサイトストレージサービスを調査するプロセスを経たばかりで、(必要なストレージの量について)遠隔地でのマシンの構築とホスティングは、以前は専用のストレージサービスを使用するよりも安価であると結論付けました〜1年のマーク...もちろん、あなた自身の決定を下します。


声明の一部に対処するには:

ZFSを適切に実行できる2台目のコンピューターにお金を使うつもりはありません。

ZFSはECC RAMを使用する必要がなく、ZFSを単一のディスクで簡単に実行できることに注意してください。これはオフサイトバックアップなので、これで十分です。

私にとって、自分のマシンを構築することはクラウドストレージとほぼ同じ価格でした。

上記のように、いくつかの計算を実行し、安価なオフサイトマシンを構築すると、サービスプロバイダーから「クラウドストレージ」を1年間支払うよりも安くなると結論付けました...そして1年以内に節約が見られるようになります。「クラウドストレージ」は購入するものではありません。支払いを続ける必要があります。

さらに利点もあります。マシンをホストしている人にサービスとオフサイトバックアップを提供できます。


私にとって、自分のマシンを構築することはクラウドストレージとほぼ同じ価格でした。私はいじくりが好きで、自分のマシン(Plex、VPN、gitリポジトリなど)を構築することでいくつかの追加機能を取得できるので、私はそのようにすることにしました。理想的には同様のマシンにバックアップすることを理解していますが、それは高すぎます(クラウドへのバックアップと同じように)。私の場所が燃え尽きた場合や、何か2つのオフサイトバックアップが必要な場合に備えて。バージョニングなどは必要ありません。その極端な場合にファイルが欲しいだけです。だからこそ、私はこのためにrsyncなどを本当に使いたいのです。
オクタビオール

私はあなたの論理に従うかどうかわかりません。回答を更新して、いくつかのポイントを明確にしました。
Attie

不適切なハードウェアでZFSを実行するのは苦手です。悪い場所での単一のメモリエラーは、気づかないうちに大量のデータを破損する可能性があります。また、現在、Raspberry Piと外部ハードディスクを別のプロジェクトから入手できます。rsyncしたがって、道路に行くにはゼロコストが必要です。また、フォーマットをext4行うと、問題が発生した場合にドライブを簡単に読み取ることができます。
オクタビオール

不適切なハードウェア」?...リンクを読みましたか?私は... RPIは素晴らしいZFSホストになるだろうされていないことを認めるだろう
Attie

正直に言うと、私は数ヶ月前にこの記事を読みました。読み直しました。私には、ECC RAMなしでは確実に動作するファイルシステムはないように思えます。ディスクに書き込む直前に、常に少しひっくり返ることがあります。zfs悪くはありませんが、この点でも良くありません。zfsこの場合の問題は、シングルビットエラーの回復がはるかに困難になる可能性があることです。を使用して弾力性を提供する方法の詳細については、編集した元の投稿を参照してくださいext
オクタビオール

1

一般的にはを使用しzfs sendたほうがよいという他の回答に同意します。

ただし、rsync代わりに使用することが決まっていて、プール全体の一貫したスナップショットだけが必要な場合は、recursiveを使用してそれを行うことができますzfs snapshot。スナップショットは、zfs list影響を受ける各データセット/ボリュームの出力に個別に表示されますが、一定の時点で取得されます(つまり、「アトミックtxgです-ZFSの内部用語ではすべて同じです)。


またzfs send、非常に安価な機器で良い選択肢だと思いますか?
オクタビオール

再帰的なスナップショットには一貫性があることを理解しています。ただし、を使用してこのスナップショットをリモートマシンに転送する方法はわかりませんrsync。最初に、でforループを実行しbash、すべてのデータセットを反復処理することを計画しました。データセットがネストされているため、以降のの実行により、rsync以前に書き込まれたデータが削除されます。
オクタビオール

1
rsyncはzfsが送信するよりも多くのリソースを使用して、どのブロックが変更されたか(IO、メモリ、CPUの増加)を判断するため、この場合、安価な機器の使用がどうなるかわかりません。ZFSは通常、キャッシュのために大量のRAMを消費しますが、バックアップを受信して​​いるだけのシステムではそれを気にしません。
ダン

リモートホスト上のリソースは、その唯一の目的がバックアップであるため、問題ではありません。ローカルホストはおそらくもう少し作業を行いますが、rsync -c上記で説明したように組み合わせると、リモートコピーを修正するオプションが付属します。私にとって、これは余分な計算の価値があります。詳細については、編集された元の投稿をご覧ください。
オクタビオール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.