Intelligentere Filetransfers als rsync? [geschlossen]

7

Ich habe eine große Datei (2-3 GB, binäres, undokumentiertes Format), die ich auf zwei verschiedenen Computern verwende (normalerweise verwende ich sie auf einem Desktop-System, aber auf Reisen lege ich sie auf meinen Laptop). Ich benutze rsync, um diese Datei hin und her zu übertragen.

Ich mache von Zeit zu Zeit kleine Aktualisierungen an dieser Datei und ändere weniger als 100 kB. Dies geschieht auf beiden Systemen.

Das Problem mit rsync ist meines Wissens, dass, wenn es glaubt, dass sich eine Datei zwischen Quelle und Ziel geändert hat, die gesamte Datei übertragen wird. In meiner Situation fühlt es sich wie eine große Zeitverschwendung an, wenn sich nur ein kleiner Teil einer Datei ändert. Ich stelle mir ein Protokoll vor, bei dem die Übertragungsagenten auf Quelle und Ziel zuerst die gesamte Datei prüfen und dann das Ergebnis vergleichen. Wenn sie feststellen, dass die Prüfsumme für die gesamte Datei unterschiedlich ist, teilen sie die Datei in zwei Teile, A und B, auf und prüfen sie separat.

Aha, B ist auf beiden Maschinen identisch, ignorieren wir diese Hälfte. Jetzt teilt es A in A1 und A2. Ok, nur A2 hat sich geändert. Teilen Sie A2 in A2I und A2II auf und vergleichen Sie usw. Führen Sie dies rekursiv durch, bis z. B. drei Teile mit jeweils 1 MB gefunden wurden, die sich zwischen Quelle und Ziel unterscheiden. Übertragen Sie dann nur diese Teile und fügen Sie sie an der richtigen Position in die Zieldatei ein. Bei schnellen SSDs und Multicore-CPUs sollte eine solche Parallelisierung heute sehr effizient sein.

Meine Frage ist also, ob es heute Tools gibt, die so funktionieren (oder auf eine andere Art und Weise, die ich mir nicht vorstellen kann, aber mit einem ähnlichen Ergebnis).

Eine Bitte um Klarstellung wurde veröffentlicht. Ich benutze meistens Mac, daher ist das Dateisystem HFS +. Normalerweise starte ich rsync so

rsync -av --delete --progress --stats- In diesen Fällen verwende ich manchmal SSH und manchmal rsyncd. Wenn ich rsyncd benutze, starte ich es so rsync --daemon --verbose --no-detach.

Zweite Klarstellung: Ich frage entweder nach einem Tool, das nur das Delta für eine Datei überträgt, die an zwei Speicherorten mit kleinen Änderungen vorhanden ist, und / oder ob rsync dies wirklich bietet. Meine Erfahrung mit rsync ist, dass es die Dateien vollständig überträgt (aber jetzt gibt es eine Antwort, die dies erklärt: rsync benötigt einen rsync-Server, um nur die Deltas übertragen zu können, andernfalls (z. B. mit ssh-shell) überträgt es das Ganze Datei hat sich jedoch viel geändert).

db
quelle
1
Ich würde sagen, es ist das Beste.
DisplayName
1
Rsync sollte nicht die gesamte Datei erneut übertragen, wenn nur ein kleiner Teil geändert wird. Standardmäßig werden nur die Änderungen übertragen. Haben Sie bestätigt, dass die gesamte Datei tatsächlich erneut übertragen wird? Wie rufst du rsync auf?
Marco
1
Typischerweise so etwas rsync -av --delete --progress --stats. Manchmal benutze ich einen Rsync-Server rsync --daemon --verbose --no-detach. Das Ergebnis ist aber immer das gleiche.
DB
3
Der ganze Punkt von rsyncist , dass es nur die Teile findet, die sich geändert haben , und sendet sie nur.
Psusi
@db fragt, ob es ein Tool gibt, mit dem eine Datei effizient neu kopiert werden kann. Das heißt, Datei a wird so synchronisiert, dass sie mit Datei b identisch ist. ( rsyncVielleicht ist dies das, was bereits getan wird, vielleicht ist dies die Antwort)
Strg-Alt-Delor

Antworten:

8

Rsync verwendet keine Deltas, überträgt jedoch die gesamte Datei in ihrer Gesamtheit, wenn es als einzelner Prozess für die Quell- und Zieldateien verantwortlich ist. Es kann Deltas übertragen, wenn auf den Quell- und Zielcomputern ein separater Client- und Serverprozess ausgeführt wird.

Der Grund, warum rsync keine Deltas sendet, wenn dies der einzige Prozess ist, besteht darin, dass zum Bestimmen, ob ein Delta gesendet werden muss, die Quell- und Zieldateien gelesen werden müssen. Bis es fertig ist, könnte es genauso gut die Datei direkt kopiert haben.

Wenn Sie einen Befehl dieses Formulars verwenden, haben Sie nur einen rsync-Prozess:

rsync /path/to/local/file /network/path/to/remote/file

Wenn Sie einen Befehl dieses Formulars verwenden, haben Sie zwei rsync-Prozesse (einen auf dem lokalen Host und einen auf der Fernbedienung) und Deltas können verwendet werden:

rsync /path/to/local/file remote_host:/path/to/remote/file
Roaima
quelle
1
Interessant. Wusste das nicht. Wie Sie in meinem Kommentar hier sehen können, starte unix.stackexchange.com/questions/180992/… manchmal den rsync-Server auf einem der Computer (wenn ich Prüfsummen verwenden möchte). Ich habe nicht bemerkt, dass es schneller ist (aber bisher habe ich rsync nur verwendet, wenn ich sehr sichere Übertragungen möchte und Prüfsummen verwende, und dann dauert die Prüfsumme viel Zeit).
DB
1
Hmm, nach einem zweiten Gedanken, wenn die Prüfsumme die Übertragung verlangsamt, kann sie wieder einfach die gesamte Datei übertragen!? Gibt es eine Möglichkeit, Rsync-Übertragungen zu vergleichen?
db
1
Ich sehe nirgendwo Beispiele für den lokalen und entfernten Pfad. Geben Sie einen Hostnamen in einem der Pfade an? Wenn nicht, wird der Deltas-Algorithmus nicht aktiviert. Beachten Sie auch, dass zur Berechnung der Deltas die gesamte Datei (auf beiden Seiten) gelesen werden muss, was bei großen Dateien eine erhebliche Zeit in Anspruch nimmt.
Roaima
2
Ja, ich benutze Hostnamen, entweder über ssh- oder rsync-Protokoll (dh nicht file: //), wiersync://remote.local:/myFile /myFile;
db
1
rsync ist so programmiert, dass der Netzwerkverkehr minimiert wird, auch wenn dies bedeutet, dass viele lokale Festplatten-E / A-Vorgänge ausgeführt werden müssen. Für rsync sind Netzwerkdateisysteme ebenfalls lokal, da rsync diese Dateien mit einem einfachen Systemaufruf öffnen kann.
Wurtel
2

Aus dem Abschnitt BESCHREIBUNG von man rsync:

Rsync ist ein schnelles und außerordentlich vielseitiges Tool zum Kopieren von Dateien. Es kann lokal, über eine beliebige Remote-Shell zu / von einem anderen Host oder von / zu einem Remote-rsync-Daemon kopieren. Es bietet eine Vielzahl von Optionen, die jeden Aspekt seines Verhaltens steuern und eine sehr flexible Spezifikation des zu kopierenden Dateisatzes ermöglichen. Es ist berühmt für seinen Delta-Transfer-Algorithmus, der die über das Netzwerk gesendete Datenmenge reduziert, indem nur die Unterschiede zwischen den Quelldateien und den vorhandenen Dateien im Ziel gesendet werden.

Das wäre also ein "Nein".

Jasonwryan
quelle
1
Aber wie berechnet es das Delta? Nach meiner Erfahrung überträgt entweder ein Verzeichnis mit Tausenden von Dateien oder diese große Datei immer die gesamte Datei, wenn sich etwas ändert. ZB übertrage ich manchmal auch Verzeichnisse mit MP3s hin und her. Wenn ich ein ID-Tag in einem solchen MP3 ändere und vielleicht 500 kB / s erhalte, dauert es 8-10 Sekunden, um die Datei zu übertragen, obwohl sich nur wenige Bytes geändert haben.
DB
2
@ user23122 Verwenden Sie den -WSchalter? Welche Schalter verwenden Sie? Und welche Dateisysteme? Bearbeiten Sie diese Informationen in Ihrer Frage, da alles relevant ist.
Jasonwryan
1
Frage mit den angeforderten Informationen aktualisiert.
DB
0

Sie können RAID-1 (Spiegelung) verwenden, um dies zu optimieren. Dies wird seltsam, wenn Änderungen an beiden Seiten vorgenommen werden, aber das macht auch die Verwendung rsyncseltsam. Sie sollten erklären, wie damit umzugehen ist.

  1. Sie können eine Datei ( dd if=/dev/zero of=/path/to/syncfile.img bs=1M count=3500) erstellen, die etwas größer ist als die, auf die Ihre Synchronisierungsdatei in naher Zukunft anwachsen wird.
  2. Dann legen Sie ein Loop-Gerät über diese Datei ( losetup /dev/loop5 /path/to/syncfile.img).
  3. Sie tun dies auf beiden Systemen.
  4. Auf dem System, von dem aus die Änderungen mit dem anderen synchronisiert werden sollen, stellen Sie das Blockgerät des anderen Systems mit Netzwerkblockgeräten zur Verfügung ( nbd).
  5. Erstellen Sie ein RAID-1-Array über beide Blockgeräte : mdadm create /dev/md5 --raid-devices=2 --level=raid1 --bitmap=/path/to/ext3volume/sync-bitmap --assume-clean /dev/loop5 --write-mostly /dev/path/to/nbd. Sie müssen angeben, --bitmap=/path/to/ext3volume/sync-bitmapwenn Sie das Array später zusammenstellen.
  6. Erstellen Sie ein Dateisystem auf dem RAID mke2fs -j /dev/md5und hängen Sie es irgendwo ein.
  7. Kopieren Sie die Datei auf das Volume. Dies sollte mit einer guten Netzwerkverbindung erfolgen. Vielleicht gibt es eine cleverere Möglichkeit, den Dateiinhalt direkt in das Blockgerät zu schreiben, was lokal erfolgen könnte, aber da der Dateiinhalt mit Dateisystem-Metadaten gemischt wird, weiß ich nicht, wie das geht.

Jetzt können Sie das Netzwerkblockiergerät trennen. Dies führt auf beiden Seiten zu einem verschlechterten RAID-1. Wenn Sie synchronisieren möchten, müssen Sie: 1. das RAID auf dem System, mit dem Sie synchronisieren möchten, aushängen und übersteigen. 2. den nbd erneut einrichten. 3. den nbd dem RAID auf dem Sync-Quellsystem hinzufügen.

Dann werden beide Blockgeräte synchronisiert. Aufgrund der Bitmap weiß das Quellsystem jedoch, ohne auf der anderen Seite lesen zu müssen, welche Daten übertragen werden müssen.

Probleme

F * ck. Nachdem ich alles geschrieben habe, merke ich, dass dies bei Änderungen auf beiden Seiten (in verschiedenen Bereichen) nicht (gut) funktioniert. Es kann funktionieren, wenn Sie --buildanstelle von verwenden --create(wodurch Sie vorgeben können, dass auf beiden Hosts das lokale Blockgerät das Master-Gerät ist).

Abhängig davon, wie die Änderungen in beide Richtungen behandelt werden sollen, können Sie versuchen, Backups der Bitmap-Dateien zu erstellen (wenn beide RAIDs gestoppt sind!) Und einfach Synchronisierungen in beide Richtungen ausführen. Oder (wenn Sie Änderungen nur in eine Richtung schreiben möchten), noch schlimmer, Sie führen die Synchronisierung aus, stoppen das RAID, ersetzen die lokale Bitmap durch die Remote-Bitmap und synchronisieren sie erneut (und synchronisieren die Bitmap-Dateien anschließend). Das verspricht viel Spaß zu machen.

LVM-Schnappschüsse

Ähnliches kann mit LVM-Snapshots gemacht werden.

Hauke ​​Laging
quelle