Schreibt rsync --inplace in die gesamte Datei oder nur in die Teile, die aktualisiert werden müssen? (für btrfs + rsync backups)

21

Ich habe mehrere Anleitungen gelesen, wie man btrfs-Snapshots mit rsync kombiniert, um eine effiziente Backup-Lösung mit dem Verlauf zu erstellen. Es hängt jedoch davon ab, ob rsync --inplacenur die Teile der Dateien geändert werden, die sich tatsächlich geändert haben, oder ob die gesamte Datei nacheinander überschrieben wird. Wenn die gesamte Datei geschrieben wird, scheint btrfs immer eine neue Kopie der Datei zu erstellen, was die Effizienz der Idee erheblich beeinträchtigen würde.

Petr Pudlák
quelle
Wie würde es überhaupt wissen, ob es vermeiden kann, auf die gesamte Datei zu schreiben? Muss nicht zuerst die gesamte Datei gelesen werden, um herauszufinden, was sich geändert hat?
Mehrdad
2
@Mehrdad ja, aber das ganze zu lesen ist kein Problem. Wenn rsyncdie gesamte Datei gelesen und dann nur die benötigten Teile gesucht und aktualisiert werden, kopiert btrfs nur diese aktualisierten Blöcke. Wenn jedoch die gesamte Datei rsyncgelesen und geschrieben wird, ist dies ein Problem.
Petr Pudlák
1
@Mehrdad rsyncweiß nicht nur, dass es das Schreiben der gesamten Datei vermeiden kann, es schafft dies auch, ohne sie vollständig über das Netz zu kopieren. Schlaues kleines Programm.
Gunther Piez

Antworten:

31

Wenn Sie zwei lokale Pfade mit rsync übergeben, wird standardmäßig "--whole-file" und keine Delta-Übertragung verwendet. Also, was Sie suchen, ist "--no-whole-file". Sie erhalten auch Delta-Transfer, wenn Sie '-c' angefordert haben.

So können Sie überprüfen:

$ mkdir a b
$ dd if=/dev/zero of=a/1 bs=1k count=64
$ dd if=/dev/zero of=a/2 bs=1k count=64
$ dd if=/dev/zero of=a/3 bs=1k count=64
$ rsync -av a/ b/
sending incremental file list
./
1
2
3

sent 196831 bytes  received 72 bytes  393806.00 bytes/sec
total size is 196608  speedup is 1.00

Berühren Sie dann eine Datei und synchronisieren Sie sie erneut

$ touch a/1
$ rsync -av --inplace a/ b/
sending incremental file list
1

sent 65662 bytes  received 31 bytes  131386.00 bytes/sec
total size is 196608  speedup is 2.99

Sie können überprüfen, ob der Inode wieder verwendet wurde, indem Sie "ls -li" eingeben. Beachten Sie jedoch, dass 64 KByte gesendet wurden. Versuchen Sie es erneut mit --no-whole-file

$ touch a/1
$ rsync -av --inplace --no-whole-file a/ b/
sending incremental file list
1

sent 494 bytes  received 595 bytes  2178.00 bytes/sec
total size is 196608  speedup is 180.54

Jetzt haben Sie nur 494 Bytes gesendet. Sie können strace verwenden, um weiter zu überprüfen, ob eine der Dateien geschrieben wurde, dies zeigt jedoch, dass mindestens die Delta-Übertragung verwendet wurde.

Beachten Sie (siehe Kommentare), dass für lokale Dateisysteme --whole-filedavon ausgegangen wird (siehe Manpage für rsync). Andererseits wird in einem Netzwerk --no-whole-filedavon ausgegangen, dass --inplacees sich als solches verhält --inplace --no-whole-file.

Datenlos
quelle
Warum --inplaceimpliziert das nicht --no-whole-file?
Geremia
Ist nicht --no-whole-filesowieso Standard?
Geremia
2
@Geremia nicht, wenn beide Pfade lokal sind. Und mein Beispiel zeigt, dass --inplacedies nicht --no-whole-filefür die Version von rsync gilt, die ich 2013 verwendet habe. Sie können dieses Experiment jedoch gerne mit Ihrer eigenen Version von rsync wiederholen.
Datum
Nun, es inplacegeht nicht darum, nach gleichen / unterschiedlichen Blöcken zu suchen, es geht nur darum, die vorhandene Datei sofort von Offset 0 aus zu überschreiben . Es ist wahrscheinlich „sicherer“ als die alte Datei zu halten , so lange wie möglich, wenn der Prozess unterbrochen wird natürlich ist schlimmer für die Leistung, Spitzenspeicherverbrauch (denken Sie große Dateien), möglicherweise Fragmentierung ...) ....
Frank Nocke
1
Ich würde davon ausgehen, dass es andersherum --no-whole-fileimmer impliziert --inplace, sonst wäre der größte Teil seines Leistungszuwachses weg. Konnte dies jedoch nicht dokumentieren ...
Frank Nocke
15

Hier die eindeutige Antwort, die ich unter Berufung auf den korrekten Teil des Handbuchs vermute:

   --inplace

          [...]

          This option is useful for transferring large files
          with  block-based  changes  or  appended data, and
          also on systems that are disk bound,  not  network
          bound.   It  can  also  help  keep a copy-on-write
                                               *************
          filesystem snapshot from diverging the entire con‐
          *******************
          tents of a file that only has minor changes.
fuujuhi
quelle
4

--inplaceüberschreibt nur Regionen, die sich geändert haben. Verwenden Sie es immer, wenn Sie in Btrfs schreiben.

Gabriel
quelle
Und haben Sie Beweise dafür, dass andere Teile von Dateien nicht überschrieben werden?
Petr Pudlák
Gilt das auch für ZFS?
Ewwhite
@ewwhite: Da ZFS wie BTRFS COW (Copy-on-Write) ist, ja.
Geremia,
@ PetrPudlák -vvvzeigt es Überspringen von passenden Blöcken
Tom Hale
3

Der Delta-Transfer-Algorithmus von rsync behandelt, ob die gesamte Datei übertragen wird oder nur die Teile, die sich unterscheiden. Dies ist das Standardverhalten beim Synchronisieren einer Datei zwischen zwei Computern, um Bandbreite zu sparen. Dies kann mit --whole-file(oder -W) überschrieben werden , um rsyncdie Übertragung der gesamten Datei zu erzwingen .

--inplacebehandelt, ob rsyncwährend der Übertragung eine temporäre Datei erstellt wird oder nicht. Standardmäßig wird eine temporäre Datei erstellt. Dies bietet ein gewisses Maß an Sicherheit, da bei einer Unterbrechung der Übertragung die vorhandene Datei auf dem Zielcomputer erhalten bleibt. --inplaceÜberschreibt dieses Verhalten und fordert Sie rsyncauf, die vorhandene Datei direkt zu aktualisieren. Auf diese Weise laufen Sie Gefahr, eine inkonsistente Datei auf dem Zielcomputer zu haben, wenn die Übertragung unterbrochen wird.

Mike T.
quelle
2

Von der Manpage:

This  option  changes  how  rsync transfers a file when its data
needs to be updated: instead of the default method of creating a
new  copy  of  the file and moving it into place when it is com-
plete, rsync instead writes the updated  data  directly  to  the
destination file.

Dies lässt mich glauben, dass es die Datei vollständig überschreibt - ich stelle mir vor, dass es für Rsync nahezu unmöglich wäre, auf andere Weise zu arbeiten.

Laxsnor
quelle
2
Nachdem Sie festgestellt haben, welche Teile aktualisiert werden müssen, können Sie diese Teile suchen und aktualisieren, anstatt die gesamte Datei zu schreiben.
Petr Pudlák
0

Die theoretische Arbeit zu In-Place-Rsync wird in diesem Artikel beschrieben .

Referenz: D. Rasch und R. Burns. In-Place Rsync: Dateisynchronisierung für mobile und drahtlose Geräte. USENIX Annual Technical Conference, FREENIX-Strecke, 91-100, USENIX, 2003.

Über den Link:

... Wir haben die vorhandene rsync-Implementierung geändert, um die direkte Rekonstruktion zu unterstützen.

Abstract: [...] Wir haben rsync so geändert, dass es auf Geräten mit eingeschränktem Speicherplatz funktioniert. Dateien auf dem Zielhost werden im selben Speicher aktualisiert, den die aktuelle Version der Datei belegt. Speicherplatzbeschränkte Geräte können traditionelles rsync nicht verwenden, da sowohl für die alte als auch für die neue Version der Datei Speicher oder Speicher erforderlich ist. Beispiele sind das Synchronisieren von Dateien auf Mobiltelefonen und Handheld-PCs mit kleinen Speichern. Der In-Place-Rsync-Algorithmus codiert die komprimierte Darstellung einer Datei in einem Diagramm, das dann topologisch sortiert wird, um die In-Place-Eigenschaft zu erzielen. [...]

Dies scheinen also die technischen Details dessen zu sein, was rsync - inplace tut. Nach dem Beginn der Arbeit:

Wir haben rsync so geändert, dass es Dateisynchronisierungsaufgaben mit direkter Rekonstruktion ausführt. [...] Anstatt temporären Speicherplatz zu verwenden, werden die Änderungen an der Zieldatei an dem Speicherplatz vorgenommen, der bereits von der aktuellen Version belegt wird. Mit diesem Tool können Geräte mit begrenztem Speicherplatz synchronisiert werden.

Wie aus der Antwort von @dataless hervorgeht , bedeutet dies, dass --inplacederselbe Speicherplatz verwendet wird, die gesamte Datei jedoch möglicherweise in diesen Speicherplatz kopiert wird. Insbesondere wenn Kopien von / zu lokalen Dateisystemen erstellt werden, geht rsync von dieser --whole-fileOption aus. Wenn es sich jedoch um ein systemübergreifendes Netzwerk handelt, wird die --no-whole-fileOption angenommen.

user92979
quelle
1
Ähm, wie lautet die Antwort?
Xen2050
Entschuldigen Sie. Ich habe nicht genug aufgepasst. Mit der Antwort von @dataless sollte dies Abhilfe schaffen.
Diagon