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).
rsync -av --delete --progress --stats
. Manchmal benutze ich einen Rsync-Serverrsync --daemon --verbose --no-detach
. Das Ergebnis ist aber immer das gleiche.rsync
ist , dass es nur die Teile findet, die sich geändert haben , und sendet sie nur.rsync
Vielleicht ist dies das, was bereits getan wird, vielleicht ist dies die Antwort)Antworten:
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:
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:
quelle
rsync://remote.local:/myFile /myFile;
Aus dem Abschnitt BESCHREIBUNG von
man rsync
:Das wäre also ein "Nein".
quelle
-W
Schalter? Welche Schalter verwenden Sie? Und welche Dateisysteme? Bearbeiten Sie diese Informationen in Ihrer Frage, da alles relevant ist.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
rsync
seltsam. Sie sollten erklären, wie damit umzugehen ist.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.losetup /dev/loop5 /path/to/syncfile.img
).nbd
).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-bitmap
wenn Sie das Array später zusammenstellen.mke2fs -j /dev/md5
und hängen Sie es irgendwo ein.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
--build
anstelle 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.
quelle