(ほぼ)2つのフォルダをアトミックにマージします。

(ほぼ)2つのフォルダをアトミックにマージします。

ファイル配布タスクに一貫性を追加するさまざまな方法を探しています。現在の状況は次のとおりです。

current約100,000の異なるファイルを含むバージョンフォルダ

  • /現在の
    • /パス1
      • ファイル1
      • ファイル2
      • ...
    • / path2 - ファイルX
    • ...

update約100個のファイルを含むフォルダ

  • /書き直す
    • /パス1
      • ファイル1
    • / path2 - ファイルX
    • ...

最終的な目標は、すべてのファイルをupdateフォルダに送信することですcurrent。私は「すべて」を選択しました。ジョブ中にエラーが発生した場合は、ジョブが成功したとマークされるようにファイルをコピーしないか、すべてのファイルを配布する必要があります。

理想的な用語として、私が探しているシナリオは、作業中に発生した状況に応じて失敗エラーコードまたは成功エラーコードを返し、元のディレクトリがシステムcurrentにすぐに表示されるようにする「原子」rsyncです。 (rsync作業後)最新バージョン(=潜在的な停電やその他の理由により、レプリケーション中に中間状態はありません。)

私が理解しているように、ほとんどのUNIXシステムではアトミックタスクを使用できないため、理想的な状況は明らかに達成されていないと仮定できます。私はこの動作をできるだけ近づけようとしています。

私はこれについてさまざまな解決策を探しました。

  • cp -alcurrentディレクトリをディレクトリにミラーリング tmpし、そのディレクトリ内のすべてのファイルをコピーしupdateて削除しcurrent、次にtmp名前を変更します。current

  • rsync(これまでに最も関連性が高い)このオプションを使用して、ディレクトリファイルへのハードリンクを含む中間フォルダを作成します--link-destcurrent基本的には前のケースと同じですがcp

  • atomic-rsync既存のPerlスクリプトを見つけました。Perl アトミック rsyncおそらくこのようなことはしますが、その結果、ディレクトリ内のファイルのみを考慮してupdate「Delta Files」currentフォルダを削除します。

どちらのソリューションも機能しているようですが、実際の実稼働ユースケースでどちらかを使用することは確かではありません。問題は、100Kのハードリンクを作成するのが非常に遅い、またはある意味で高価な、または役に立たない可能性があることです。

また、非常に一貫した解決策はスナップショットを使用することであり、多くのオプションがあることを知っていますが、ディスクサイズ(〜70 GB、フォルダはすでに〜60 GBを占めているcurrent)のため、私の場合はこれは許可されていません。

私が知っている限り、オプションが不足しています。目的の目標を達成するための(より良い)方法はありますか?

ベストアンサー1

BTRFSとスナップショットの使用を検討してください。

おすすめ記事