ZFSで牛のコピーを作成する方法はありますか?


14

私はいくつかのファイル/ディレクトリのカウコピーを作成しようとしていますが、私が知っているいくつかの方法のうち、すべてが最適ではないようです。

たとえば、btrfsではcp --reflink=auto、ファイルのカウコピーをすばやく生成することができます。

私が試したもの:

  1. シンボリックリンク:ダメ。ファイル名が変更され、リンクが壊れています。
  2. ハードリンク:より良いが、まだ良くない。1つのファイルを変更すると、もう1つのファイルも変更されますが、必ずしも他のファイルを変更する必要はありません。
  3. データセットのスナップショットを作成してから、スナップショットのクローンを作成します。これは機能しますが、うまくいきません。多くの場合、データセット全体のコピー、または別のデータセットのように動作するコピーを探していません。次に、クローン/スナップショット/オリジナルの間に親子関係があります。これは、理解できないように、不可能ではないにしても困難です。
  4. zfs send/receive、および有効な重複除去を使用して、データセットを新しいデータセットに複製します:これにより、クローンを使用する親/子関係が回避されますが、不必要に別のデータセットが作成され、ファイルを100%読み取らなければならず、書き込まれるのではなく、再び参照されるブロック。
  5. ファイルをコピーしてdedupに任せる:これは機能しますが、ファイルを100%読み取り、書き込みではなくブロックを再度参照する必要があるため、時間がかかります。

zfsの送受信と物理的なコピーまたはrsyncの速度は、ほとんどのものが圧縮されて保存され、読み取り中に解凍する必要があるため、さらに悪化します。

私のすべての研究で、btrfsの--reflinkのシンプルさに似たものをリモートで見つけることができませんでした。

だから、ZFSで牛のコピーを作成する方法はありますか?または、「物理的に」コピーしてdedupにその仕事をさせることが唯一の本当の選択肢ですか?

回答:


4

上記のオプション3はおそらく最善の策だと思います。欲しいものの最大の問題は、ZFSが実際にこのコピーオンライトのみをデータセット/スナップショットレベルで処理することです。

正確な環境でうまく機能することを確認していない限り、dedupの使用を避けることを強くお勧めします。重複除去は、もう1人のユーザーまたはVMストアが移動され、パフォーマンスの崖から落ちて多くの問題を引き起こすまで、個人的な経験があります。最初の10人のユーザーでうまく機能しているように見えるからといって、11番目(または12番目、13番目、その他)を追加するとマシンが倒れる可能性があります。このルートを使用する場合は、実稼働環境を正確に模倣するテスト環境があり、その環境で適切に機能することを絶対に確認してください。

オプション3に戻ると、この方法で管理する各ファイルシステムツリーを保持する特定のデータセットを設定する必要があります。セットアップして最初にデータを設定したら、スナップショット(データセットごとに少しずつ異なります)を取得し、クローンにプロモートします。元のデータセットには再び触れないでください。

はい、このソリューションには問題があります。私はそれがそうではないと言っているわけではありませんが、ZFSの制限を考えると、それはおそらく最高のものです。クローンを効果的に使用している人へのこの参照を見つけました:http : //thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

私はbtrfsにあまり馴染みがありませんが、必要なオプションをサポートしている場合、そのサーバーでLinuxとbtrfsを使用して、これらのデータセットをサポートするためだけに別のサーバーをセットアップすることを検討しましたか?


これは思考に良い食べ物です。「マスター」(およびその子)に十分な大きな変更が必要な場合、マスターのクローンを作成、改善、新しいマスターの位置に昇格させることができ、十分に異なるサブクローンはrsyncが決定したバリエーションを保持できます。脇では、クローンは破壊され、新しいマスターから作り直され、変更は保留されていた素材から引き戻されました。これは素晴らしい解決策のようには見えませんが、良い解決策のように見え始めており、重複除去を有効にすることによるオーバーヘッドを節約します。これについてもっと考えなければなりません。
キラーミスト

ええ、それは素晴らしい解決策ではありませんが、あなたが説明したものの中で最も痛みが少ないようで、私は他のことを考えることができませんでした。
jlp

ポイントの概要はgithub.com/zfsonlinux/zfs/issues/405で示されています。基本的に、ZFSはファイルベースのCOWではなく、データセットCOWのみをサポートしているため、BTRFSに相当するものはありませんcp --reflink=auto
mtalexan

1

オプション5が最適です。

オプション3の親/子データセットに関しては、クローンを昇格させることができ、クローンデータセットの子ではなくなります。余分なブロックを使い切ることはありません。 編集:これは親/子関係を逆にするだけで、破壊しないことに注意してください。

圧縮/暗号化されているもの、およびコピーの速度が低下していることに関しては、完全に間違っています。プロセッサは、ブロックデバイスよりもはるかに高速です(SSDを使用している場合でも)。いくつかの例の番号については、ブロックの読み取りに10秒かかりますが、それを解凍するのに1秒、解読するのに2秒かかるとしましょう。ブロック1は10秒で読み取られ、CPUに送信されます。ディスクがブロック2の読み取りを開始している間に、CPUは圧縮解除と復号化を開始します。CPUはタスクを3秒で終了し、次の7秒間をディスクで待機します。一方、ディスクは、ブロックが圧縮されているかどうかに関係なく、これらの2つのブロックの読み取りにまったく同じ時間(20秒)を費やしています。

同様に、書き込み中、最初のブロックのみが遅延します。CPUはブロック1を圧縮/暗号化し、ディスクに送信します。ディスクがブロック1を書き込んでいる間、CPUは後続のブロックの圧縮/暗号化を開始します。CPUはブロックがディスクを書き込むよりもはるかに速くブロックを噛むため、問題にはなりません。(はい、これよりも複雑ですが、これが要点です。)

あなたの質問の軽微な点について過度に長い説明をして申し訳ありませんが、その誤解を解消したかったのです。


1
クローンのプロモートは、親と見なされる子と子と見なされる子を切り替えるだけです。元の親はスナップショットの子になり、その子は昇格されたクローンの子になるため、その間のスナップショットを破棄することは不可能です。それに加えて、データセット内のファイルをレプリケートしようとしていたところ、データセットのような構造を不必要に作成しています。
キラーミスト

さらに、重複除去が有効になっているプールでは、圧縮のスローダウンに関する結論に同意する必要があります。圧縮を有効にしたデータセットから圧縮を有効にしたデータセットにコピーすると、速度が5Mb /秒を超えることはほとんどありませんでした。一方のデータセットまたは他方のデータセットで圧縮が無効になっている場合、速度は平均で10〜15Mb /秒にジャンプします。両側の圧縮を無効にすると、20Mb / secがそれよりも高いスパイクで簡単に表示されます(おそらく、低速のメディアからプルする代わりに、ラムでデデュープテーブルにヒットするためです)。
キラーミスト

1
クローン作成に関する回答を更新しました。圧縮/暗号化/重複除去に関しては、圧縮または暗号化よりも、DDTの更新によってスローダウンが引き起こされます。私の経験では、圧縮と暗号化の影響は常に無視できます。YMMVだと思います。
バハマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.