Was sind gute Kompressionsalgorithmen für die Delta-Synchronisation?

0

Wenn Sie große Dateien über eine langsame Verbindung synchronisieren, ist es oft nützlich, die Delta-Komprimierung zu verwenden, um die verwendete Bandbreite zu reduzieren. Es ist auch nützlich, Dateien zu komprimieren, da sie viel weniger Speicherplatz beanspruchen.

Viele Komprimierungsalgorithmen haben jedoch den unerwünschten Nebeneffekt, dass große Teile der komprimierten Ausgabe geändert werden, wenn nur eine kleine Änderung an der Quelle vorgenommen wurde.

Was sind also einige Komprimierungsalgorithmen / -dienstprogramme, die ähnliche komprimierte Blobs aus ähnlichen Quelldateien erstellen?

Kevin Cox
quelle

Antworten:

2

Sie können erwägen, das Argument --rsyncable für gzip zu verwenden . Dadurch wird die Komprimierung geringfügig verringert, da der Komprimierungsalgorithmus am Anfang jeder Datei in Ihrem Tarball zurückgesetzt wird.

Beachten Sie jedoch, dass Sie auch die Option -z mit rsync verwenden können, um die übertragenen Daten zu komprimieren. Wenn Sie mit nicht komprimierten Dateien in Bezug auf Quelle und Ziel vertraut sind, kann dies für Ihre Anforderungen ausreichend sein.

Wir verwenden dies, um ein komprimiertes MySQL-Datenbank-Backup zu synchronisieren, das ungefähr 20 GB umfasst. Mit gzip --rsyncable können wir oft nur einen Bruchteil der komprimierten Datei über rsync übertragen, wenn wir bereits den Snapshot des Vortages haben. Ich habe nicht versucht, die unkomprimierte TAR-Datei zu übertragen und die Option -z von rsync zu verwenden, sodass ich die relative Effizienz nicht beurteilen kann.

ChrisInEdmonton
quelle
2
--rsyncablescheint ein reiner Debian-Patch zu sein.
Grawity
Gute Lösung, dieser Patch ist weit verbreitet und recht effektiv. Aber wie gesagt, es wird nicht übertragen. Es ist in Debian, Fedora und wahrscheinlich anderen Distributionen vorhanden.
Kevin Cox
0

Eine Lösung besteht darin, eine Datei blockweise manuell zu komprimieren. Aus einfachen Testgründen sind die folgenden Skriptdateien bei 1MiB-Blöcken nur geringfügig (~ 0,1%) größer. Es funktioniert für Algorithmen, die Verkettung unterstützen (gzip und bzip2, um nur zwei zu nennen). Es ist auch etwas langsamer, aber trivial zu parallelisieren.

#!/bin/bash

alg="${2:-gzip}"

size=$(stat -c %s "$1")
cur=0
block=$((1024*1024)) # 1M blocks.

while [ $cur -lt $size ]; do
    #echo $alg $size $block $cur >&2
    tail -c +$cur "$1" | head -c $block | $alg
    cur=$((cur+block))
done

Auf diese Weise können Änderungen nur den geänderten Block betreffen.

Kevin Cox
quelle
@Hennes, nicht der richtige Ort, sondern über deine Bearbeitung. Welches System verwenden Sie, ich hatte noch nie ein Problem und platziere den Platz immer dort, weil ich denke, dass es schöner aussieht.
Kevin Cox
Ich habe FreeBSD ausprobiert, konnte aber nicht nach / usr / local / bin / bash korrigieren (kein bash in / bin / auf vielen Systemen).
Hennes
Aber mit dem Platz klappt es? Das ist komisch. Ich werde nachlesen, wenn ich die Chance habe, immer etwas zu lernen: D
Kevin Cox
0

Vielleicht möchten Sie sich mit rdiff vertraut machen . Es ähnelt rsync, erfordert jedoch keine bidirektionale Verbindung zum Server.

Die Art, wie Sie es verwenden würden, ist

  1. Auf dem rdiff signature file.ext file.ext.sigQuellcomputer : Dadurch wird eine Signaturdatei erstellt, die die Hashes für die Blöcke enthält, die zukünftige Diffs verwenden werden. Bewahren Sie die .sig-Datei auf dem Quellcomputer auf.
  2. Komprimieren Sie die Datei wie gewohnt und senden Sie sie an das Ziel
  3. Dekomprimieren Sie die Datei am Ziel
  4. Zeit vergeht
  5. Auf dem Quellcomputer: rdiff delta file.ext.sig file.ext file.ext.deltaHiermit wird eine Delta-Datei erstellt, die nur die Änderungen enthält, bei denen die Hashes nicht mit der Signaturdatei übereinstimmen.
    • Sie werden wahrscheinlich einen anderen rdiff signature file.ext file.ext.sigVorgang ausführen, um die Signaturdatei zu aktualisieren.
  6. Senden Sie die Delta-Datei an das Ziel, die Delta-Datei ist bereits komprimiert
  7. Auf dem Ziel: rdiff patch file.ext file.ext.delta file.extDadurch wird die Zielkopie der Datei so aktualisiert, dass sie mit der Quellkopie übereinstimmt. Abhängig vom Build von rdiff müssen das 2. Argument und das 4. Argument möglicherweise unterschiedliche Dateinamen sein.
Scott Chamberlain
quelle
rdiff ist im Wesentlichen die aus dem rsync-Protokoll herausgebrochene rsync dela-Berechnung, die sehr nützlich ist, aber die Frage nicht beantwortet. Die andere Hälfte der Antwort besteht darin, das Diff unkomprimiert zu berechnen. Dies ist sinnvoll, erfordert jedoch in meinem Fall eine Dekomprimierung und jedes Mal, wenn ich ein Diff berechnen möchte. Das Ziel muss auch die vorhandene Datei dekomprimieren und nach dem Patchen erneut komprimieren. Wenn Sie nur für den Transport komprimieren (und rsync verwenden), würde ich die -zOption empfehlen , rsync die Komprimierung transparent machen zu lassen.
Kevin Cox
Sie haben rsync getaggt, es aber in Ihrer Frage nie wirklich angesprochen. Ich nahm an, dass es einen Grund gab, warum Sie es nicht verwenden konnten, und versuchte, seine Funktionalität über rdiff neu zu erstellen. Ich musste genau das tun, wo wir Kundendaten hatten, die auf einen Nur-Schreib-FTP-Server hochgeladen wurden. Wir ließen sie die Originaldatei hochladen und dann nur die Unterschiede, als wir eine Datenaktualisierung benötigten.
Scott Chamberlain
Entschuldigung für die Verwirrung. Ich habe es markiert, aber nicht erwähnt, weil die Frage allgemeiner ist als nur rsync. Ich werde rsync verwenden, aber ich plane auch, in Zukunft etwas zu tun, das xdelta oder rdiff verwendet.
Kevin Cox