Wie synchronisieren Sie große Dateien mit geringer Dichte (VM-Images) zwischen Computern?


22

Gibt es einen Befehl wie rsync, mit dem große, spärliche Dateien von einem Linux-Server auf einen anderen synchronisiert werden können?

Es ist sehr wichtig, dass die Zieldatei dünn bleibt. Es kann länger (aber nicht größer) sein als das Laufwerk, auf dem es sich befindet. Nur geänderte Blöcke sollten über die Leitung gesendet werden.

Ich habe rsync ausprobiert, aber keine Freude bekommen. https://groups.google.com/forum/#!topic/mailing.unix.rsync/lPOScZgFE9M

Wenn ich dazu ein Programm schreibe, erfinde ich dann nur das Rad neu? http://www.finalcog.com/synchronise-block-devices

Vielen Dank,

Chris.


rsync ist mit riesigen Dateien äußerst ineffizient. Auch bei --inplace es wird zunächst die gesamte Datei auf dem Ziel - Host lesen und DANN beginnen auf dem lokalen Rechner die Datei zu lesen und die Unterschiede übertragen (nur laufen dstat oder ähnliches während rsync laufen und beobachten)
ndemou

Antworten:


21
rsync --ignore-existing --sparse ...

So erstellen Sie neue Dateien im Sparse-Modus

gefolgt von

rsync --inplace ...

So aktualisieren Sie alle vorhandenen Dateien (einschließlich der zuvor erstellten spärlichen) an ihrem Platz.


3
Kehren Sie es um, um zu haben rsync --existing --inplaceund dann rsync --ignore-existing --sparseeine Synchronisierungsbeschleunigung zu haben
Mike

2
Kann jemand Mikes Kommentar erklären und wie dies die Synchronisation beschleunigen soll?
Preexo

Ich denke, Mike bedeutet, zuerst den Ort zu ändern und dann einen neuen hinzuzufügen, so dass die neuen nicht wieder an Ort und Stelle sein müssen, da zwischen dem ersten und dem zweiten Anruf ein Zeitunterschied besteht. Dies ist nur dann der Fall, wenn Sie die Synchronisierung direkt vom Datenspeicher aus durchführen und VMs ausgeführt werden. Es sei denn, er meint etwas anderes?
Yuan

Ich stimme Yuan zu. Mit Steves zweitem Befehl werden die neuen Dateien erneut synchronisiert. Sie können dies mit Mikes Befehlssequenz sichern.
Falstaff

rsync ist mit riesigen Dateien äußerst ineffizient. Siehe meinen Kommentar zu der Frage.
26.

5

Rsync überträgt nur Änderungen an jede Datei und mit --inplace sollten nur die geänderten Blöcke überschrieben werden, ohne die Datei neu zu erstellen. Von ihrer Eigenschaftsseite .

rsync ist ein Dateiübertragungsprogramm für Unix-Systeme. rsync verwendet den "rsync-Algorithmus", der eine sehr schnelle Methode zum Synchronisieren von Remote-Dateien bietet. Dazu werden nur die Unterschiede in den Dateien über die Verknüpfung gesendet, ohne dass beide Dateisätze zuvor an einem der Enden der Verknüpfung vorhanden sein müssen.

Die Verwendung von --inplace sollte für Sie funktionieren. Dies zeigt Ihnen den Fortschritt, komprimiert die Übertragung (auf der Standardkomprimierungsstufe), überträgt den Inhalt des lokalen Speicherverzeichnisses rekursiv (der erste abschließende Schrägstrich ist wichtig), nimmt die Änderungen an den vorhandenen Dateien vor und verwendet ssh für den Transport.

rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
user@remote.machine:/path/to/remote/storage/ 

Ich benutze oft auch das Flag -a, das ein paar Dinge mehr macht. Es ist gleichbedeutend mit -rlptgoD. Ich überlasse das genaue Verhalten Ihnen, damit Sie es in der Manpage nachschlagen können.


1
Das '-S' ist für spärliche Dateien, nicht für das 'Zerhacken langer Zeilen'. Von der Manpage: -S, --sparse sparsame Dateien effizient behandeln. Ich werde es versuchen, danke.
Fadedbee

Danke, dass ich das behoben habe - ich habe etwas falsch gemacht, was in dem von Ihnen angegebenen Link gesagt wurde.
Reconbot

Nein, das löst das Problem leider nicht. Es tut Synchronisierung der Datei, aber es stellt sich die spärliche Datei am Ende in eine nicht-Datei mit geringer Dichte. Ich verwende ssh / rsync, das mit Ubuntu 9.04 geliefert wird.
Fadedbee

Mein obiger Kommentar war falsch. Das Problem war, dass rsync bei seiner ersten Kopie nicht-sparsame Dateien erstellt. --Inplace rsync funktioniert ordnungsgemäß, vorausgesetzt, die Zieldatei ist bereits vorhanden und so lang (nicht groß) wie die Ursprungsdatei. Ich habe jetzt eine Lösung, aber ich muss überprüfen, ob jede Datei bereits auf dem Zielserver vorhanden ist. Wenn ja, mache ich ein --inplace, wenn nicht, verwende ich --sparse. Das ist nicht ideal, aber es funktioniert.
Fadedbee

rsync ist mit riesigen Dateien äußerst ineffizient. Siehe meinen Kommentar zu der Frage
ndemou

4

Am Ende habe ich Software geschrieben, um dies zu tun:

http://www.virtsync.com

Hierbei handelt es sich um kommerzielle Software für 49 USD pro physischem Server.

Ich kann jetzt eine 50-GB-Sparse-Datei (mit 3 GB Inhalt) in weniger als 3 Minuten über das private Breitband replizieren.

chris@server:~$ time virtsync -v /var/lib/libvirt/images/vsws.img backup.barricane.com:/home/chris/
syncing /var/lib/libvirt/images/vsws.img to backup.barricane.com:/home/chris/vsws.img (dot = 1 GiB)
[........>.........................................]
done - 53687091200 bytes compared, 4096 bytes transferred.

real    2m47.201s
user    0m48.821s
sys     0m43.915s 

4
TBH, der Zeitpunkt, zu dem Sie synchronisieren können, ist ziemlich bedeutungslos, da er offensichtlich von der Menge der geänderten Daten abhängt. Genauer gesagt: Ihre Software benötigt 3 Minuten, um herauszufinden, welche Blöcke geändert wurden, und selbst diese Geschwindigkeit hängt wahrscheinlich von Ihrer Festplatten-E / A und möglicherweise den verfügbaren CPU-Zyklen ab.
Reality Extractor

6
Sie sollten angeben, dass dies kommerzielle Software ist, deren Netzwerkfunktionalität mindestens 98 US-Dollar kostet.
Reid

Vielen Dank, dass Sie uns auf eine Software hingewiesen haben, die für Sie gut funktioniert hat und die die Benutzer jetzt berücksichtigen und verwenden oder nicht nach Bedarf verwenden können. Nicht danke für die beiden anderen Personen für den Beitrag nichts Neues.
Florian Heigl

3

Werfen Sie einen Blick auf Zumastor Linux Storage Project , das über das ddsnapTool ein "Snapshot" -Sicherungsprogramm unter Verwendung der Binärdatei "rsync" implementiert .

Von der Manpage:

ddsnap bietet eine Block-Device-Replikation mit einer Block-Level-Snapshot-Funktion, mit der mehrere Snapshots gleichzeitig effizient gespeichert werden können. ddsnap kann eine Liste von Snapshot-Chunks erstellen, die sich zwischen zwei Snapshots unterscheiden, und diese Differenz dann über die Leitung senden. Schreiben Sie auf einem Downstream-Server die aktualisierten Daten auf ein Snapshot-Block-Gerät.


2

lvmsync macht das.

Hier ist ein Nutzungsprotokoll . Es wird ein LVM-Snapshot auf der Quelle erstellt und die logische Partition übertragen. Sie können inkrementelle Aktualisierungen der Änderungen seit der Snapshot-Erstellung beliebig oft übertragen.


Ich habe es versucht, aber es funktioniert nicht, und der Autor ist nicht bereit zu unterstützen
user1007727

1
@ user1007727 nicht bereit zu unterstützen oder nicht bereit, kostenlos zu unterstützen?
Fadedbee

Ich habe in der Vergangenheit lvmsync verwendet, es hat funktioniert, aber es ist keine "Prod Grade" -Software imo. :-)
Florian Heigl

1

Könnte das Replizieren des gesamten Dateisystems eine Lösung sein? DRBD? http://www.drbd.org/


Ich denke nicht, dass drbd hier eine gute Lösung ist, aber die Idee des Synchronisierens - anstelle der Disk-Image-Dateien die gesamte fs einzufügen, ist interessant. Ich bin mir nicht sicher, ob rsync dies zulässt - ich werde es versuchen und
zurückmelden

1

Vielleicht ein bisschen seltsam hier, aber ich habe kürzlich herausgefunden, dass NFS das in Ordnung bringt.

Sie exportieren also ein Verzeichnis auf einen Rechner und hängen es dann auf den anderen und kopieren die Dateien einfach mit einfachen Hilfsprogrammen wie cp. (Einige alte / alte Dienstprogramme können Probleme mit spärlichen Dateien haben.)

Ich fand es rsyncbesonders ineffizient, spärliche Dateien zu übertragen.


1

Um große Dateien oder Blockgeräte mit geringen bis mäßigen Unterschieden zu synchronisieren, können Sie entweder eine einfache Kopie erstellen oder bdsync verwenden . Rsync ist für diesen speziellen Fall absolut nicht geeignet *.

bdsyncArbeitete für mich, scheint ausgereift genug, es ist die Geschichte der Fehler ermutigend (kleine Probleme, schnelle Lösung). In meinen Tests lag die Geschwindigkeit in der Nähe des theoretischen Maximums, das Sie ** erreichen konnten (dh Sie können ungefähr in der Zeit synchronisieren, in der Sie die Datei lesen müssen). Endlich ist es Open Source und kostet nichts.

bdsyncLiest die Dateien von beiden Hosts und tauscht Prüfsummen aus, um sie zu vergleichen und Unterschiede zu erkennen. All dies zur gleichen Zeit . Schließlich wird eine komprimierte Patch-Datei auf dem Quellhost erstellt. Anschließend verschieben Sie diese Datei auf den Zielhost und führen bdsync ein zweites Mal aus, um die Zieldatei zu patchen.

Bei der Verwendung über eine relativ schnelle Verbindung (z. B. 100-Mbit-Ethernet) und bei Dateien mit geringen Unterschieden (wie dies häufig bei VM-Festplatten der Fall ist) verkürzt sich die Synchronisierungszeit auf die Zeit, die zum Lesen der Datei erforderlich ist. Über eine langsame Verbindung benötigen Sie etwas mehr Zeit, da Sie die komprimierten Änderungen von einem Host auf den anderen kopieren müssen (anscheinend können Sie mit einem netten Trick Zeit sparen , haben ihn aber nicht getestet).


*: rsync ist bei großen Dateien äußerst ineffizient. Auch wenn --inplace zuerst die gesamte Datei auf dem Zielhost liest, beginnt AFTERWARDS, die Datei auf dem Quellhost zu lesen und schließlich die Unterschiede zu übertragen (führen Sie einfach dstat oder ähnliches aus, während Sie rsync ausführen und beobachten). Das Ergebnis ist, dass selbst bei Dateien mit kleinen Unterschieden etwa doppelt so viel Zeit erforderlich ist, um die Datei zu lesen und zu synchronisieren.

**: Unter der Annahme, dass Sie keine andere Möglichkeit haben, festzustellen, welche Teile der Dateien geändert wurden. LVM-Snapshots verwenden Bitmaps, um die geänderten Blöcke aufzuzeichnen, sodass sie extrem schneller sind (die Readme- Datei von lvmsync enthält weitere Informationen).


0

Mir ist ein solches Dienstprogramm nicht bekannt, nur die Systemaufrufe, die es verarbeiten können. Wenn Sie also ein solches Dienstprogramm schreiben, kann es hilfreich sein.

Was Sie tatsächlich tun können, ist qemu-img convert, um die Dateien zu kopieren, aber es wird nur funktionieren, wenn das Ziel-FS Sparse-Dateien unterstützt

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.