Lösung 1:
Obwohl es 'Write-Device'- und 'Copy-Device'-Patches für RSync gibt, funktionieren sie nur bei kleinen Images (1-2 GB) gut. RSync wird ewig damit verbringen, auf größeren Bildern nach übereinstimmenden Blöcken zu suchen, und es ist fast nutzlos für Geräte/Dateien mit 40 GB oder mehr.
Wir verwenden Folgendes, um einen Prüfsummenvergleich pro 1 MB durchzuführen und kopieren dann einfach den Inhalt, wenn er nicht übereinstimmt. Wir verwenden dies, um Server auf einem virtuellen Host in den USA über das öffentliche Internet auf ein Sicherungssystem in Großbritannien zu sichern. Sehr wenig CPU-Aktivität und Snapshot-Performancehit nur nach Stunden:
Snapshot erstellen:
lvcreate -i 2 -L 25G /dev/vg_kvm/company-exchange -n company-exchange-snap1
export dev1='/dev/mapper/vg_kvm-company--exchange--snap1';
export dev2='/dev/mapper/vg_kvm-company--exchange';
export remote='[email protected]';
Anfängliches Seeding:
dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"
Inkrementelles nächtliches Backup (sendet nur geänderte Blöcke):
ssh -i /root/.ssh/rsync_rsa $remote "
perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" |
lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c |
ssh -i /root/.ssh/rsync_rsa $remote "lzop -dc |
perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"
Schnappschuss entfernen:
lvremove -f company-exchange-snap1
Lösung 2:
Dem Standard-rsync fehlt diese Funktion, aber es gibt einen Patch dafür im rsync-patches-Tarball (copy-devices.diff), der von http://rsync.samba.org/ftp/rsync/After appling and recompiling heruntergeladen werden kann , können Sie Geräte mit der Option --copy-devices rsyncen.
Lösung 3:
Personen, die daran interessiert sind, dies speziell mit LVM-Snapshots zu tun, könnten mein lvmsync-Tool mögen, das die Liste der geänderten Blöcke in einem Snapshot liest und nur diese Änderungen sendet.
Lösung 4:
Werfen Sie einen Blick auf das Zumastor Linux Storage Project, es implementiert eine „Snapshot“-Sicherung mit binärem „rsync“ über das ddsnap-Tool.
Von der Manpage:
ddsnap bietet Blockgerätereplikation mit einer Snapshot-Funktion auf Blockebene, die in der Lage ist, mehrere gleichzeitige Snapshots effizient zu speichern. ddsnap kann eine Liste von Snapshot-Chunks generieren, 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-Blockgerät.
Lösung 5:
Es gibt ein Python-Skript namens blocksync, das eine einfache Möglichkeit darstellt, zwei Blockgeräte über ein Netzwerk per ssh zu synchronisieren und nur die Änderungen zu übertragen.
- Kopieren Sie blocksync.py in das Home-Verzeichnis auf dem Remote-Host
- Stellen Sie sicher, dass Ihr Remote-Benutzer entweder sudo kann oder selbst root ist
- Stellen Sie sicher, dass Ihr lokaler Benutzer (root?) das Quellgerät lesen und ssh auf den Remote-Host senden kann
- Aufruf:
python blocksync.py /dev/source [email protected] /dev/dest
Ich habe es kürzlich gehackt, um es zu bereinigen und es so zu ändern, dass es denselben schnellen Prüfsummenalgorithmus wie rsync (Adler-32) verwendet.