非常に大きなフォルダー構造の同期


14

イントラネットには、約800,000個のファイルが約4,000個のフォルダーに分割されたフォルダー構造があります。これをDMZのマシンの小さなクラスターに同期する必要があります。構造の深さは非常に浅い(2レベルを超えない)。

ほとんどのファイルは変更されず、毎日数千の更新されたファイルと1〜2千の新しいファイルがあります。データは、ソースデータが削除された場所で保持されている履歴レポートデータです(つまり、これらはアーカイブされて削除されるほどソースデータが十分に古いファイナライズされたレポートです)。合理的な時間枠で発生する可能性があるため、1日に1回の同期で十分です。レポートは夜間に生成され、午前中にスケジュールされたタスクとして最初に同期します。

明らかに、定期的に変更されるファイルはごくわずかなので、インクリメンタルコピーの恩恵を受けることができます。Rsyncを試してみましたが、「ファイルリストの作成」操作を完了するだけで8〜12時間かかる場合があります。rsyncの能力を急速に上回っていることは明らかです(12時間の時間枠は長すぎます)。

RepliWebという別のツールを使用して構造を同期していましたが、約45分で増分転送を実行できます。ただし、制限を超えたようで、ファイルが削除されていないときにファイルが表示されるようになりました(おそらく、内部メモリ構造が使い果たされたのかどうかはわかりません)。

他の誰かがこの種の大規模な同期プロジェクトに遭遇しましたか?同期のためにこのような大規模なファイル構造を処理するように設計されたものはありますか?


同時に実行されているrsyncの複数のインスタンスに作業を分割しようとしましたか?ディレクトリ構造の実際の良い画像はありませんが、ディレクトリ名またはファイル名で分割できます。
クラッチ

私たちはそれについて考えていましたが、このようなフラットな構造では、作品を分割するための良い分割線を見つけるのは困難です。フォルダーの大部分が非常によく似た名前であるという事実によって複雑になっています(ほとんどのフォルダーが同じ6文字の初期セットで始まる命名規則があります)。
MightyE

良い解決策を見つけましたか、デイブ?私は、それぞれが65535サブdirsに、とDIRためlsyncd検討している可能性が 65 ^ 16のファイルを持っています。
マイクディーン14

1
@MikeDiehn私はここで完全に満足しているツールを見つけることができませんでした。独自のRepliWebツールを入手して、ファイルが削除されていないバグを修正するバグを修正しました。私は何年も前にその仕事を辞めました、彼らはまだそれを使っていると思います。あなたの目的のために、あなたのディレクトリが合理的に配布されている場合、ライアンのソリューションのようなもので行くことができます。トップレベルの削除には気付かないでしょうが、65535個のサブディレクトリは、おそらくそれらがないことを示唆しています。
MightyE 14年

回答:


9

ファイルシステムの最終変更タイムスタンプを信頼できる場合は、RsyncをUNIX / Linuxの「find」ユーティリティと組み合わせることにより、速度を上げることができます。「find」は、過去1日以内の最終変更時刻を示すすべてのファイルのリストを作成し、その短縮されたファイル/ディレクトリのリストのみをRsyncにパイプします。これは、Rsyncが送信側のすべての単一ファイルのメタデータをリモートサーバーと比較するよりもはるかに高速です。

要するに、次のコマンドは、過去24時間以内に変更されたファイルとディレクトリのリストに対してのみRsyncを実行します(Rsyncは、他のファイル/ディレクトリをチェックすることはありません)。

find /local/data/path/ -mindepth 1 -ctime -0 -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.

「find」コマンドに慣れていない場合は、特定のディレクトリサブツリーを再帰処理し、指定した条件に一致するファイルやディレクトリを検索します。たとえば、次のコマンド:

find . -name '\.svn' -type d -ctime -0 -print

現在のディレクトリ( "。")で開始し、すべてのサブディレクトリを再帰的に検索して、以下を探します。

  • 任意のディレクトリ(「-type d」)、
  • ".svn"( "-name '.svn'")という名前、
  • 過去24時間にメタデータが変更された(「-ctime -0」)

これらの基準に一致するもののフルパス名( "-print")を標準出力に出力します。オプション「-name」、「-type」、および「-ctime」は「テスト」と呼ばれ、オプション「-print」は「アクション」と呼ばれます。「検索」のマニュアルページには、テストとアクションの完全なリストがあります。

本当に賢くなりたい場合は、「-ctime」の代わりに「find」コマンドの「-cnewer」テストを使用して、このプロセスの耐障害性と柔軟性を高めることができます。'-cnewer'は、ツリー内の各ファイル/ディレクトリのメタデータが参照ファイルよりも最近変更されたかどうかをテストします。「タッチ」を使用して、各実行の開始時、「検索...」の直前に次の実行の参照ファイルを作成します。rsync ... 'コマンドが実行されます。基本的な実装は次のとおりです。

#!/bin/sh
curr_ref_file=`ls /var/run/last_rsync_run.*`
next_ref_file="/var/run/last_rsync_run.$RANDOM"
touch $next_ref_file
find /local/data/path/ -mindepth 1 -cnewer $curr_ref_file -print0 | xargs -0 -n 1 -I {} -- rsync -a {} remote.host:/remote/data/path/.
rm -f $curr_ref_file

このスクリプトは、最後に実行された日時を自動的に認識し、最後の実行以降に変更されたファイルのみを転送します。これはより複雑ですが、ダウンタイムまたはその他のエラーのために24時間以上ジョブを実行できなかった状況から保護します。


これは非常に賢い解決策です!私はあなたtouch $next_ref_fileが最後に意味すると思っていますか?ただし、削除されたパスに対処することはできません(これらの静的なアーカイブレポートでも、最終的には古くなってアーカイブおよび削除されます)。それはショーストッパーではないかもしれませんが。
MightyE

ただし、find . -ctime 0このディレクトリ構造ではかなり遅いこともわかります(時間の報告が完了するのを待っています)。これは実際に私を少し落胆させます。なぜなら、これはおそらくこのジョブが完了するのを期待できる最速の水準を設定するかなり低レベルの操作であるように見えるからです。ここでは、ディスクI / Oが制限要因である場合があります。
MightyE

そのスクリプトレットについては、はい、間違いを犯しました。「find ...」を実行する直前に「next_ref_file」(「curr_ref_file」ではなく)で「touch」を実行することを意味しました。rsync ... 'コマンド。(答えを修正します。)
ライアンB.リンチ

3
遅い「find」コマンドに関しては、どのようなファイルシステムを使用していますか?Ext3を使用している場合、次の2つのFS調整を検討することをお勧めします。1) 'tune2fs -O dir_index <DEVICE_NODE>'を実行して、Ext3の 'dir_index'機能を有効にして、ファイル数の多いディレクトリへのアクセスを高速化します。2)「mount -o remount、noatime、nodiratime」を実行して、アクセス時間の更新をオフにします。これにより、一般的に読み取りが高速化されます。'dumpe2fs -h <DEVICE_NODE> | grep dir_index 'は、' dir_index 'が既に有効になっているか(一部のディストリビューションではデフォルトです)、' mount | grep <DEVICE_NODE> 'は、アクセス時間の更新について通知します。
ライアンB.リンチ

悲しいことに、NTFS-findコマンドにCygwinを使用するWindows 2003 Serverです。Debianクラスターの1つで同様のものに遭遇した場合に備えて、ext3のこれらのチューニングオプション(優れたアドバイス)を覚えています。
MightyE

7

unisonを試しください。変更リスト(ビルドファイルリスト)をローカルに各サーバーに保持し、デルタを計算する時間を短縮し、その後ワイヤを介して送信される量を削減することにより、この問題を解決するために特別に設計されました。


私はUnisonを試用しています。現在「Looking for changes」ステージで約2時間実行されており、現在作業中のファイルに基づいて、約半分の処理が完了したように見えます(したがって、転送が開始されるまでに合計4時間かかります)。rsyncよりも優れているように見えますが、それでも希望する運用期間外です。
MightyE

2
両側で初めてインデックスを作成するとき、各ファイルをハッシュする必要があるため、再構築時間はrsyncに似ています。これが完了すると、ユニゾンはディレクトリの最終変更時刻を使用してファイルがいつ変更されたかを識別し、そのファイルを変更のためにスキャンするだけで済みます。
デイブチェイニー

悲しいことに、カタログが作成される前にセッションを強制終了した熱心な運用管理者の犠牲者でした(本番サーバーへの同時ログオンの数を制限します)。最初のカタログの作成で行った進捗を失ったため、最初からやり直す必要があります。どうなるかお知らせします。
MightyE

変更をスキャンするために初期カタログが作成されるまで、約2時間かかります。Unisonがこれに使用しているRAMの量にかなり驚いています。ファイルコレクションでは、ソースサーバーは635Mを使用し、リモートクライアントは366Mを使用しています。クラスタ内の複数のマシンを同期することは、特にソースサーバーにとって非常に大きなフットプリントになります!
MightyE

1
最近変更されたデータを簡単に識別できるようにデータを構造化できますか?つまり、年/月/日/ ...形式で保存しますか?
デイブチェイニー


2

rsyncで-zスイッチを使用している場合は、それなしで実行してみてください。何らかの理由で、ファイルの最初の列挙でさえ、このスピードアップを見ました。


-zフラグありとなしで試しました。「ビルドファイルリスト」の実行時間に影響を与えていないようでした。
MightyE

2

圧縮ではないrsyncコマンドから-zを削除すると、「受信ファイルリスト」が非常に高速になり、約500 GBを転送する必要がありました。-zスイッチで1日かかる前。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.