いくつかのファイル/ディレクトリのきれいなコピーを作成しようとしていますが、私が知っているいくつかの方法のどれも最適ではないと思います。
たとえば、btrfsを使用すると、cp --reflink=auto
ファイルのoxenコピーをすばやく作成できます。
私が試したこと:
- シンボリックリンク:不良。ファイル名が変更され、リンクが失われました。
- ハードリンク:良いですが、まだ悪いです。あるファイルを変更すると、他のファイルも変更されますが、必ずしも別のファイルを変更したくはありません。
- データセットのスナップショットを作成してから、スナップショットを複製します。動作しますが、それほど効果的ではありません。通常、私はデータセット全体のコピーを探したり、そのコピーを他のデータセットのように動作させたりしません。その後、レプリカ/スナップショット/ソース間の親/子関係がありますが、私が知っている限り、それを破ることは不可能ではない場合でも難しいです。
- 重複排除を有効にして
zfs send/receive
有効にして、データセットを新しいデータセットにコピーします。これにより、複製された親/子関係を使用する必要がなくなりますが、依然として不要に他のデータセットが生成され、ファイルを100%読み取る必要がある速度低下の問題が引き続き発生します。問題は再び言及されます。ブロックを書く代わりにブロックを使用してください。 - ファイルをコピーし、重複排除でその操作を実行します。これはうまくいきますが、ファイルを100%読み取る必要があり、書き込みではなくブロックから再参照する必要があるため、遅くなります。
zfsの送受信と物理コピーまたはrsyncの速度の低下は、ほとんどのコンテンツが圧縮されて保存され、読み取り中に解凍され、重複排除が重複ブロックを参照し始める前に圧縮される必要があるという事実によってさらに複雑になります。
私のすべての研究では、btrfsの--reflinkの単純さに似ているものが見つかりませんでした。
それでは、ZFSで牛のコピーを作成する方法はありますか?それとも、「物理的に」コピーして重複排除を実行することが唯一の実際のオプションですか?
答え1
上記のオプション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を使用することを検討しましたか?
答え2
オプション5が最高のオプションです。
オプション3の上位/下位データセットの場合、レプリカを昇格でき、複製されたデータセットの子孫ではなくなります。それでも余分なブロックが足りません。 編集する:これにより、親/子関係が反転するだけで破壊されることはありません。
物を圧縮/暗号化してコピー速度を遅くするという主張は完全に偽です。プロセッサはブロックデバイスよりもはるかに高速です(SSDを使用しても)。いくつかの例を挙げると、ブロックを読むのに10秒かかりますが、解凍するには1秒、解読するには2秒しかかからないとしましょう。ブロック1は10秒以内に読み取られ、CPUに送信されます。ディスクがブロック2を読み始めると、CPUは解凍と復号を開始します。 CPUは3秒で作業を完了し、次の7秒でディスクを待ちます。同時に、ディスクは、ブロックが圧縮されているかどうかにかかわらず、両方のブロックを読み取るのにまったく同じ時間(20秒)かかりました。
同様に、書き込み時に最初のブロックだけが遅延されます。 CPUはブロック1を圧縮/暗号化してディスクに送信します。ブロック1がディスクに書き込まれると、CPUは後続のブロックの圧縮/暗号化を開始します。 CPUはディスクがブロックを書き込むよりもはるかに速くブロックを読み取ることができるため、これは問題ではありません。 (はい、それよりも複雑ですが、これがポイントです。)
質問の些細な部分について説明が長くなって申し訳ありませんが、誤解を解決したかったです。