Frage rsync zu mehreren Zielen mit der gleichen Dateiliste?


Ich frage mich, ob es für rsync möglich ist, ein Verzeichnis auf einmal in mehrere Remote-Ziele auf einmal oder sogar parallel zu kopieren. (nicht notwendig, aber wäre nützlich.)

Normalerweise würde etwas wie das Folgende gut funktionieren:

$ rsync -Pav /junk user@host1:/backup
$ rsync -Pav /junk user@host2:/backup
$ rsync -Pav /junk user@host3:/backup

Und wenn das die einzige Option ist, werde ich das verwenden. Allerdings befindet sich / junk auf einem langsamen Laufwerk mit ziemlich vielen Dateien, und das Neuerstellen der Dateiliste von etwa 12.000 Dateien jedes Mal ist quälend langsam (~ 5 Minuten) verglichen mit der tatsächlichen Übertragung / Aktualisierung. Ist es möglich, so etwas zu tun, um dasselbe zu erreichen:

$ rsync -Pav /junk user@host1:/backup user@host2:/backup user@host3:/backup 

Danke fürs schauen!


18
2018-04-29 18:00


Ursprung




Antworten:


Hier finden Sie die Informationen auf der man-Seite für rsync zum Batch-Modus.

DOSIERMODUS

Der Batch-Modus kann verwendet werden, um den gleichen Satz von Updates auf viele identische Systeme anzuwenden. Angenommen, man hat einen Baum, der auf einer Anzahl von Hosts repliziert wird. Nehmen wir nun an, dass einige Änderungen vorgenommen wurden          Source-Tree und diese Änderungen müssen an die anderen Hosts weitergegeben werden. Um dies im Batch-Modus durchzuführen, wird rsync mit der Write-Batch-Option ausgeführt, um die Änderungen anzuwenden, die an der Quellstruktur vorgenommen wurden          einer der Zielbäume. Die Write-Batch-Option bewirkt, dass der rsync-Client alle Informationen in einer "Batch-Datei" speichert, die benötigt werden, um diese Operation mit einem anderen, identischen Ziel zu wiederholen          Bäume.

Durch das einmalige Generieren der Stapeldatei müssen der Dateistatus, die Prüfsumme und die Datenblockgenerierung beim Aktualisieren mehrerer Zielbäume mehrfach durchgeführt werden. Multicast-Transportprotokolle können          werden verwendet, um die Stapelaktualisierungsdateien parallel zu mehreren Hosts gleichzeitig zu übertragen, anstatt dieselben Daten einzeln an jeden Host zu senden.

Um die aufgezeichneten Änderungen auf eine andere Zielstruktur anzuwenden, führen Sie rsync mit der Option read-batch aus, geben Sie den Namen der gleichen Batch-Datei und die Zielstruktur an. Rsync aktualisiert das Ziel          Baum unter Verwendung der in der Stapeldatei gespeicherten Informationen.

Zu Ihrer Bequemlichkeit wird auch eine Skriptdatei erstellt, wenn die Schreib-Batch-Option verwendet wird: Sie wird genauso benannt wie die Batch-Datei mit angehängtem ".sh". Diese Skriptdatei enthält eine Befehlszeile          geeignet zum Aktualisieren eines Zielbaums mithilfe der zugehörigen Stapeldatei. Es kann unter Verwendung einer Bourne- (oder Bourne-artigen) Shell ausgeführt werden, wobei optional ein alternativer Zielbaum-Pfadname übergeben wird          wird dann anstelle des ursprünglichen Zielpfads verwendet. Dies ist nützlich, wenn der Zielstrukturpfad auf dem aktuellen Host von dem zum Erstellen der Batchdatei verwendeten Pfad abweicht.

   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

In diesen Beispielen wird rsync verwendet, um / adest / dir / from / source / dir / zu aktualisieren, und die Information, diese Operation zu wiederholen, wird in "foo" und "foo.sh" gespeichert. Der Host "remote" wird dann mit aktualisiert          Batch-Daten gehen in das Verzeichnis / bdest / dir. Die Unterschiede zwischen den beiden Beispielen zeigen, wie flexibel Sie mit Chargen umgehen können:

  • Das erste Beispiel zeigt, dass die Erstkopie nicht lokal sein muss - Sie können Daten per Remote-Shell-Syntax oder Rsync-Daemon-Syntax zu / von einem Remote-Host senden oder dorthin ziehen             gewünscht.

  • Das erste Beispiel verwendet die erstellte Datei "foo.sh", um die richtigen rsync-Optionen zu erhalten, wenn der Befehl read-batch auf dem Remote-Host ausgeführt wird.

  • Im zweiten Beispiel werden die Stapeldaten über die Standardeingabe gelesen, so dass die Stapeldatei nicht zuerst auf die entfernte Maschine kopiert werden muss. In diesem Beispiel wird das Skript "foo.sh" vermieden             Wenn Sie eine modifizierte Option --read-batch verwenden möchten, könnten Sie die Skriptdatei bearbeiten, wenn Sie sie verwenden möchten (stellen Sie sicher, dass keine andere Option versucht, die Standardeingabe zu verwenden, z. B.             die "--exclude-from = -" Option).

    Vorbehalte:

    Die Read-Batch-Option erwartet, dass die Zielstruktur, die aktualisiert wird, identisch mit der Zielstruktur ist, die zum Erstellen der Stapelaktualisierungsdateigruppe verwendet wurde. Wenn ein Unterschied zwischen den      Nation Trees wurde festgestellt, dass das Update möglicherweise mit einer Warnung verworfen wird (wenn die Datei bereits auf dem neuesten Stand ist) oder das Dateiupdate möglicherweise versucht wird und dann, wenn die Datei nicht überprüft werden kann      Update wurde mit einem Fehler verworfen. Dies bedeutet, dass es sicher sein sollte, einen Lese-Batch-Vorgang erneut auszuführen, wenn der Befehl unterbrochen wurde. Wenn Sie das Batched-Update erzwingen möchten, wird immer versucht      Unabhängig von der Größe und dem Datum der Datei verwenden Sie die Option -I (beim Lesen des Stapels). Wenn ein Fehler auftritt, befindet sich der Zielbaum wahrscheinlich in einem teilweise aktualisierten Zustand. In diesem Fall kann rsync      in seinem normalen (nicht stapelweisen) Betriebsmodus verwendet werden, um den Zielbaum zu reparieren.

    Die rsync-Version, die für alle Ziele verwendet wird, muss mindestens so neu sein wie die zum Generieren der Stapeldatei verwendete Version. Rsync wird mit einem Fehler abstürzen, wenn die Protokollversion in der Batch-Datei zu neu für ist      die Batch-Lesung rsync zu handhaben. Siehe auch die Option --protocol, mit der das Erstellende rsync eine Batch-Datei erzeugen kann, die ein älteres rsync verstehen kann. (Beachten Sie, dass Batch-Dateien für      mat in der Version 2.6.3, so dass ältere Versionen als die mit neueren Versionen nicht funktionieren.)

    Beim Lesen einer Batch-Datei erzwingt rsync, dass der Wert bestimmter Optionen den Daten in der Batch-Datei entspricht, wenn Sie sie nicht auf den gleichen Wert wie den Batch-Schreiben-Befehl gesetzt haben. Andere Optionen können (und      sollte geändert werden. Zum Beispiel --write-batch ändert sich in --read-batch, --files-from wird gelöscht, und die Optionen --filter / - include / - exclude werden nicht benötigt, es sei denn eine der Optionen --delete ist      spezifizierten.

    Der Code, der die Datei BATCH.sh erstellt, transformiert alle Filter- / Include- / Exclude-Optionen in eine einzelne Liste, die als "Here" -Dokument an die Shell-Skriptdatei angehängt wird. Ein fortgeschrittener Benutzer kann verwenden      um die Ausschlussliste zu ändern, wenn eine Änderung dessen, was von --delete gelöscht wird, gewünscht wird. Ein normaler Benutzer kann dieses Detail ignorieren und das Shell-Skript einfach dazu verwenden, das entsprechende Skript auszuführen      --read-Batch-Befehl für die Batch-Daten.

    Der ursprüngliche Stapelmodus in rsync basierte auf "rsync +", aber die neueste Version verwendet eine neue Implementierung.

Ich könnte mir vorstellen, dass du es versuchen kannst

rsync --write-batch=foo -Pav /junk user@host1:/backup
foo.sh user@host2:/backup
foo.sh user@host3:/backup

9
2018-02-28 01:34



Der vorgeschlagene Befehl funktioniert nicht: remote destination is not allowed with --read-batch - kynan
Zeigen Sie den vollständigen Befehl. - für einen Dateinamen bedeutet, von der Standardeingabe zu lesen, und STDIN wird auch gelesen foo Im Beispiel eine lokale Datei. - Chloe
Dies scheint die maximal richtige Lösung für das zu sein, was ich versucht habe, obwohl mein Anwendungsfall dafür längst im Äther verschwunden ist. : D - Jessie


Du könntest es versuchen Einklang. Es sollte viel schneller beim Erstellen der Dateiliste sein, da es einen Cache der Dateien enthält.


4
2017-08-19 20:52



Hinweis: Unison behält keinen "Cache" der Dateien. Es verwaltet nur eine Datenbank der Dateinamen, Zeitstempel, Prüfsummen. Es führt immer noch eine Überprüfung des Dateisystems durch und erstellt eine Prüfsumme zum Vergleich mit der Fernbedienung. Der einzige Vorteil von Unison ist die Zwei-Wege-Synchronisation. Ich empfehle Unison, aber es wird hier nicht helfen. - Chloe


Das rsync  --batch-mode unterstützt Multicast. Wenn dies in Ihrem Netzwerk möglich ist, lohnt es sich, dies zu untersuchen.


3
2018-05-06 19:07





Wie wäre es mit dem Ändern von Dateisystemen?

Vor einiger Zeit habe ich ein Multi-Terabyte FS von ext3 auf XFS umgestellt. Die Zeit, um die Verzeichnisse zu scannen (mit ungefähr 600.000 Dateien, die ich das letzte Mal überprüft habe), ging von 15-17 Minuten auf weniger als 30 Sekunden!


2
2018-04-29 19:53





Keine direkte Antwort, aber wenn Sie rsync Version 3+ verwenden, beginnt die Übertragung, bevor die gesamte Dateiliste generiert wird.

Eine andere Option, die immer noch nicht sehr effizient ist, wäre, sie als Jobs auszuführen, so dass einige gleichzeitig laufen.

Auch dachte ich an diese Strangness, wenn es Ihnen nichts ausmacht, Teer zu verwenden:

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

Jeder Localhost wäre natürlich ein anderer Server (setzt Key-Based Login voraus). Benutze das vorher nie.


1
2018-04-29 18:21



Hmm! Seltsamerweise scheint cwrsync (rsync 3.0.7) das nicht zu tun. Ich muss aber nachsehen, warum das so ist, denn das wäre eine große Hilfe, um diese enormen Laufzeiten zu reduzieren. Vielen Dank! - Jessie
Diese Version auf beiden Seiten? - Kyle Brandt♦
Nicht wirklich; der lokale Rechner ist cwrsync 3.0.7 und der entfernte Host (nun, der, mit dem ich gerade arbeite) ist rsync 3.0.3 auf Debian Lenny. Es sieht nicht so aus, als wäre es ein zu großer Versionsunterschied, um sich falsch zu benehmen, aber ich weiß nicht .. Ich werde nachsehen, wie ich die Debian-Seite aktualisiere. - Jessie
Was für ein seltsamer kleiner Einliner. Das würde wahrscheinlich funktionieren, wenn ich nicht die Tatsache nutzen würde, dass rsync einige Gigs von Daten nicht über mehrere langsame Verbindungen verdoppeln muss, wenn sich höchstens einige hundert kb davon geändert haben. Auch das Abrufen beider Enden von (cw) rsync 3.0.7 führte das Erstellen von Dateien und das Übertragen von Dateien seriell durch. Nicht so besorgt darüber. - Jessie
Ist nicht "tar cf -." das gleiche wie "tar c." ? - Johan Boulé


Wie wäre es mit dem Ausführen der Rsync-Jobs von Host1, Host2 und Host3? Oder führen Sie einen Job aus, um ihn auf Host1 zu kopieren, und führen Sie ihn dann auf Host2 und Host3 aus, um ihn von Host1 zu beziehen.


1
2018-04-29 19:25





Eine bessere Lösung wäre ein Repository mit Git zu erstellen und einfach auf die 3 Hosts zu schieben. Schneller benötigen Sie den Dateilisten-Teil nicht und verbrauchen weniger Ressourcen.

Viel Glück,
João Miguel Neves


1
2018-05-04 20:51



git behält keine Änderungszeiten oder Berechtigungen bei (mit Ausnahme des Ausführungsbits) und müsste eine zweite Kopie der Daten als git-Objekte speichern .git/ obwohl Push zu den Fernbedienungen, die bereits die meisten Daten hätten, schneller wäre. git ist kein Ersatz für rsync. - Dan D.
Außerdem kann Git öffentlich angezeigt werden, es sei denn, Sie bezahlen. - Chloe
@ Chloe, du verwechselst Git für GitHub. Git selbst ist frei Open Source verteilte Versionskontrollsystem, und jeder kann git-Repository mit allen Mitteln, einschließlich http, nfs und afp. GitHub ist eine Website, die sich um die Erstellung und Pflege von Git-Repos für Sie kümmert und diese öffentlich macht (sofern Sie nicht zahlen). - toriningen
@Chloe GitHub ist öffentlich sichtbar, aber BitBucket bietet private Repos. - sws
Außerdem behält Git die leeren Verzeichnisse nicht im Auge. - Flimm


Auf der Suche nach dieser Antwort, ich denke, Sie müssten einen Stapel mit rsync zuerst machen und dann senden sie an alle, die es so machen würde, dass die Dateiliste nur einmal geknirscht werden müsste, und dann könnten Sie einfach Hintergrund alle drei rsyncs, um sie parallel zu betreiben.


1
2017-12-03 19:33





Eine andere mögliche Lösung besteht darin, so viele rsync-Prozesse parallel auszuführen, wie Sie Hosts haben, z. B. fork.


1
2018-02-28 00:15