ファイル配布タスクに一貫性を追加するさまざまな方法を探しています。現在の状況は次のとおりです。
current
約100,000の異なるファイルを含むバージョンフォルダ
- /現在の
- /パス1
- ファイル1
- ファイル2
- ...
- / path2 - ファイルX
- ...
- /パス1
update
約100個のファイルを含むフォルダ
- /書き直す
- /パス1
- ファイル1
- / path2 - ファイルX
- ...
- /パス1
最終的な目標は、すべてのファイルをupdate
フォルダに送信することですcurrent
。私は「すべて」を選択しました。ジョブ中にエラーが発生した場合は、ジョブが成功したとマークされるようにファイルをコピーしないか、すべてのファイルを配布する必要があります。
理想的な用語として、私が探しているシナリオは、作業中に発生した状況に応じて失敗エラーコードまたは成功エラーコードを返し、元のディレクトリがシステムcurrent
にすぐに表示されるようにする「原子」rsyncです。 (rsync
作業後)最新バージョン(=潜在的な停電やその他の理由により、レプリケーション中に中間状態はありません。)
私が理解しているように、ほとんどのUNIXシステムではアトミックタスクを使用できないため、理想的な状況は明らかに達成されていないと仮定できます。私はこの動作をできるだけ近づけようとしています。
私はこれについてさまざまな解決策を探しました。
cp -al
current
ディレクトリをディレクトリにミラーリングtmp
し、そのディレクトリ内のすべてのファイルをコピーしupdate
て削除しcurrent
、次にtmp
名前を変更します。current
rsync
(これまでに最も関連性が高い)このオプションを使用して、ディレクトリファイルへのハードリンクを含む中間フォルダを作成します--link-dest
。current
基本的には前のケースと同じですがcp
。atomic-rsync
既存のPerlスクリプトを見つけました。Perl アトミック rsyncおそらくこのようなことはしますが、その結果、ディレクトリ内のファイルのみを考慮してupdate
「Delta Files」current
フォルダを削除します。
どちらのソリューションも機能しているようですが、実際の実稼働ユースケースでどちらかを使用することは確かではありません。問題は、100Kのハードリンクを作成するのが非常に遅い、またはある意味で高価な、または役に立たない可能性があることです。
また、非常に一貫した解決策はスナップショットを使用することであり、多くのオプションがあることを知っていますが、ディスクサイズ(〜70 GB、フォルダはすでに〜60 GBを占めているcurrent
)のため、私の場合はこれは許可されていません。
私が知っている限り、オプションが不足しています。目的の目標を達成するための(より良い)方法はありますか?
答え1
BTRFSとスナップショットの使用を検討してください。