web-dev-qa-db-ja.com

同じファイルリストを使用して複数の宛先にrsyncしますか?

Rsyncが1つのディレクトリを複数のリモート宛先にすべて一度に、または並行してコピーできるかどうか疑問に思っています。 (必須ではありませんが、役に立つでしょう。)

通常、次のようなものがうまく機能します。

$ rsync -Pav /junk user@Host1:/backup
$ rsync -Pav /junk user@Host2:/backup
$ rsync -Pav /junk user@Host3:/backup

それが唯一の選択肢である場合は、それを使用します。ただし、/ junkはかなりの数のファイルがある低速ドライブにあり、毎回約12,000ファイルのファイルリストを再構築することは、実際の転送/更新と比較して苦痛なほど遅い(〜5分)。同じことを達成するために、このようなことをすることは可能ですか?

$ rsync -Pav /junk user@Host1:/backup user@Host2:/backup user@Host3:/backup 

見てくれてありがとう!

22
Jessie

これは、バッチモードに関するrsyncのマニュアルページの情報です。

バッチモード

バッチモードを使用すると、同じアップデートセットを多数の同一システムに適用できます。いくつかのホストに複製されるツリーがあるとします。ここで、このソースツリーにいくつかの変更が加えられ、それらの変更を他のホストに伝達する必要があるとします。バッチモードを使用してこれを行うには、rsyncをwrite-batchオプションで実行して、ソースツリーに加えられた変更を宛先ツリーの1つに適用します。書き込みバッチオプションを使用すると、rsyncクライアントは、他の同一の宛先ツリーに対してこの操作を繰り返すために必要なすべての情報を「バッチファイル」に格納します。

バッチファイルを一度生成すると、複数の宛先ツリーを更新するときに、ファイルステータス、チェックサム、およびデータブロックの生成を複数回実行する必要がなくなります。マルチキャストトランスポートプロトコルを使用すると、すべてのホストに個別に同じデータを送信する代わりに、バッチ更新ファイルを同時に多数のホストに同時に転送できます。

記録された変更を別の宛先ツリーに適用するには、同じバッチファイルの名前と宛先ツリーを指定して、read-batchオプションを指定してrsyncを実行します。 Rsyncは、バッチファイルに格納されている情報を使用して宛先ツリーを更新します。

便宜上、write-batchオプションを使用すると、スクリプトファイルも作成されます。このファイルには、「。sh」が追加されたバッチファイルと同じ名前が付けられます。このスクリプトファイルには、関連するバッチファイルを使用して宛先ツリーを更新するのに適したコマンドラインが含まれています。これは、Bourne(またはBourneのような)シェルを使用して実行でき、オプションで、元の宛先パスの代わりに使用される代替宛先ツリーパス名を渡します。これは、現在のホストの宛先ツリーパスがバッチファイルの作成に使用されたものと異なる場合に役立ちます。

   Examples:

          $ rsync --write-batch=foo -a Host:/source/dir/ /adest/dir/
          $ scp foo* remote:
          $ ssh remote ./foo.sh /bdest/dir/

          $ rsync --write-batch=foo -a /source/dir/ /adest/dir/
          $ ssh remote rsync --read-batch=- -a /bdest/dir/ <foo

これらの例では、rsyncを使用して/ adest/dir /を/ source/dir /から更新し、この操作を繰り返すための情報は「foo」と「foo.sh」に格納されています。その後、ホストの「リモート」は、ディレクトリ/ bdest/dirに入るバッチデータで更新されます。 2つの例の違いは、バッチの処理方法にいくつかの柔軟性があることを示しています。

  • 最初の例は、最初のコピーがローカルである必要がないことを示しています。必要に応じて、リモートシェル構文またはrsyncデーモン構文を使用して、リモートホストとの間でデータをプッシュまたはプルできます。

  • 最初の例では、リモートホストでread-batchコマンドを実行するときに、作成された「foo.sh」ファイルを使用して正しいrsyncオプションを取得します。

  • 2番目の例は、標準入力を介してバッチデータを読み取るため、最初にバッチファイルをリモートマシンにコピーする必要はありません。この例では、変更された--read-batchオプションを使用する必要があるため、foo.shスクリプトを回避しますが、スクリプトファイルを使用したい場合は編集できます(他のオプションが標準を使用しようとしていないことを確認してください) 「--exclude-from =-」オプションなどの入力)。

    警告:

    Read-batchオプションは、更新される宛先ツリーが、バッチ更新ファイルセットの作成に使用された宛先ツリーと同一であることを想定しています。宛先ツリー間の差異が発生した場合、更新は警告付きで破棄されるか(ファイルがすでに最新のように見える場合)、ファイルの更新が試行され、ファイルの検証に失敗した場合、更新はエラーで破棄されました。これは、コマンドが中断された場合に読み取りバッチ操作を再実行しても安全であることを意味します。ファイルのサイズと日付に関係なく、常にバッチ更新を強制的に実行したい場合は、-Iオプションを使用します(バッチの読み取り時)。エラーが発生した場合、宛先ツリーはおそらく部分的に更新された状態になります。その場合、rsyncを通常の(非バッチ)操作モードで使用して、宛先ツリーを修正できます。

    すべての宛先で使用されるrsyncバージョンは、少なくともバッチファイルの生成に使用されるものと同じである必要があります。バッチファイルのプロトコルバージョンが新しいため、バッチ読み取りrsyncで処理できない場合、rsyncはエラーで終了します。古いrsyncが理解できるバッチファイルを作成するrsyncに生成させる方法については、-protocolオプションも参照してください。 (バージョン2.6.3ではバッチファイルの形式が変更されているため、古いバージョンと新しいバージョンを混在させることはできません。)

    バッチファイルを読み取る際に、バッチ書き込みコマンドと同じに設定しなかった場合、rsyncは特定のオプションの値を強制的にバッチファイルのデータと一致させます。他のオプションは変更できます(変更する必要があります)。たとえば、-write-batchが--read-batchに変更され、-files-fromが削除されます。--filter /-include /-excludeオプションは、-deleteオプションのいずれかが指定されていない限り必要ありません。 。

    BATCH.shファイルを作成するコードは、filter/include/excludeオプションを単一のリストに変換し、 "here"ドキュメントとしてシェルスクリプトファイルに追加します。上級ユーザーは、これを使用して、-deleteによって削除される内容の変更が必要な場合に除外リストを変更できます。通常のユーザーはこの詳細を無視して、バッチデータに対して適切な--read-batchコマンドを実行する簡単な方法としてシェルスクリプトを使用できます。

    Rsyncの元のバッチモードは「rsync +」に基づいていましたが、最新バージョンは新しい実装を使用しています。

あなたが試すことができると思います

rsync --write-batch=foo -Pav /junk user@Host1:/backup
foo.sh user@Host2:/backup
foo.sh user@Host3:/backup
12
Chloe

rsync--batch-modeはマルチキャストをサポートします。これがネットワークで可能である場合は、調査する価値があります。

4
codecrank

nison を使用してみてください。ファイルのキャッシュを保持するため、ファイルリストの作成がはるかに高速になります。

4
Jason Axelson

ファイルシステムの変更はどうですか?

しばらく前に、私はマルチテラバイトを切り替えましたFS ext3からXFS。ディレクトリをスキャンする時間(最後にチェックしたとき、約600,000ファイル)は15〜17分から30秒!

2
Javier

この答えを私自身で探す場合、最初にrsyncを使用してバッチを作成してから、それらすべてに送信する必要があると思います。これにより、ファイルリストを一度だけクランチする必要があり、その後、 3つすべてのrsyncをバックグラウンドで実行して、それらを並行して実行します。

1
Morgan

より良い解決策は、gitを使用してリポジトリを作成し、3つのホストにプッシュすることです。より速く、あなたはファイルリスト部分を必要としないでしょう、そして、それはより少ない資源を消費します。

幸運を、
ジョアン・ミゲル・ネベス

1
jneves

直接的な回答ではありませんが、rsyncバージョン3以降を使用すると、ファイルリスト全体を生成する前に転送が開始されます。

まだあまり効率的ではない別のオプションは、それらをジョブとして実行して、いくつかを同時に実行することです。

また、tarを使用してもかまわない場合は、この絞殺について考えました。

tar cf - . | tee >(ssh localhost 'cat > test1.tar') >(ssh localhost 'cat > test2.tar') >/dev/null

もちろん、各ローカルホストは異なるサーバーになります(キーベースのログインを想定しています)。ただし、これまでに使用したことはありません。

1
Kyle Brandt

別の可能な解決策は、ホストと同じ数のrsyncプロセスを並行して実行することです(フォークなど)。

1
Alexey Tigarev

Host1、Host2、およびHost3からrsyncジョブを実行するのはどうですか?または、Host1にコピーするジョブを実行し、Host2およびHost3で実行してHost1から取得します。

1
mfinni