web-dev-qa-db-ja.com

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

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

たとえば、btrfsは、cp --reflink=autoを使用して、ファイルの牛のコピーをすばやく生成できます。

私が試したこと:

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

ほとんどのものが圧縮されて格納され、読み込み中に解凍され、重複が参照重複ブロックを開始する前に圧縮される必要があるため、zfsの送受信と物理的なコピーまたはrsyncingの速度がさらに悪化します。

私のすべての調査で、btrfsの--reflinkの単純さにリモートで似ているものを見つけることができませんでした。

それで、ZFSで牛のコピーを作成する方法はありますか?または、「物理的に」コピーして重複除去をその仕事に任せることが唯一の現実的な選択肢ですか?

14
killermist

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

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

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

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

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

4
jlp

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

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

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

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

あなたの質問のマイナーな点についての説明が長すぎて申し訳ありませんが、私はその誤解を解消したいと思いました。

1
bahamat