Frage Synchronisieren Sie LVM-Snapshots mit dem Backup-Server


Ich habe eine Anzahl von virtuellen Xen-Maschinen, die auf einer Anzahl von Linux-Servern laufen. Diese VMs speichern ihre Datenträgerabbilder auf Linux-LVM-Volumes mit Gerätenamen in der Form / dev / xenVG / SERVER001OS und so weiter. Ich würde gerne regelmäßige Backups dieser Disk-Images machen, damit ich die VMs für den Fall wiederherstellen kann, dass wir die LVM-Geräte bereits mit DRBD zwischen zwei physischen Rechnern gespiegelt haben, ich bin nur extra paranoid hier.

Wie gehe ich vor? Der erste Schritt besteht darin, das LVM-Gerät zu speichern, aber wie übertrage ich dann die Daten so effizient wie möglich auf einen Backup-Server? Ich könnte einfach das ganze Gerät kopieren, etwas in der Art von:

dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"

... aber das würde eine Menge Bandbreite benötigen. Gibt es ein rsync-ähnliches Tool zum Synchronisieren von Inhalten ganzer Festplattenblöcke zwischen Remote-Servern? So etwas wie:

rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img

Wenn ich rsync's man-Seite richtig verstehe, wird der obige Befehl nicht funktionieren (wird es?), Aber es zeigt, was ich anstrebe. Ich verstehe, dass die Option --devices rsync Geräte selbst kopiert, nicht den Inhalt dieser Geräte. Das Erstellen einer lokalen Kopie des VM-Abbilds vor dem Synchronisieren mit dem Remoteserver ist keine Option, da nicht genügend Speicherplatz vorhanden ist.

Gibt es ein praktisches Dienstprogramm, das zwischen Blockgeräten und einer Sicherungsdatei auf einem Remote-Server synchronisieren kann? Ich kann eine schreiben, wenn ich muss, aber eine bestehende Lösung wäre besser. Habe ich eine rsync-Option vermisst, die das für mich tut?


20
2018-06-17 16:14


Ursprung




Antworten:


Standard-rsync fehlt diese Funktion, aber es gibt einen Patch dafür in den rsync-Patches Tarball (copy-devices.diff), die von heruntergeladen werden können http://rsync.samba.org/ftp/rsync/ Nach dem Anwenden und Neukompilieren können Sie Geräte mit der Option --copy-devices rsync.


11
2018-06-24 16:29



Wenn Ihr Ziel ein Gerät ist, befindet sich der Patch hier: bugzilla.redhat.com/show_bug.cgi?id=1193654 - Jason Pyeron


Es gibt zwar "write-device" - und "copy-device" -Patches für RSync, aber sie funktionieren nur gut auf kleinen Bildern (1-2GB). RSync wird ewig damit verbringen, nach passenden Blöcken auf größeren Bildern zu suchen, und es ist nahezu nutzlos für 40 GB oder größere Geräte / Dateien.

Wir verwenden das Folgende, um einen 1-MB-Prüfsummenvergleich durchzuführen, und kopieren den Inhalt einfach, wenn er nicht übereinstimmt. Damit sichern wir Server auf einem virtuellen Host in den USA zu einem Backup System in Großbritannien, über das öffentliche Internet. Sehr geringe CPU-Aktivität und Snapshot-Leistung Treffer ist erst nach Stunden:

Schnappschuss 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='root@backup.company.co.za';

Initial 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

16
2017-08-07 05:57



Ich hatte zuerst Angst, aber dann habe ich es ausprobiert und es funktioniert wirklich. - Martin
Warum read ARGV,$buf,1024 anstatt read STDIN,$buf,1024, @sysadmin1138? (Ich versuche zu antworten stackoverflow.com/q/22693823/2987828 und verstehe ARGV hier nicht). Ich benutze jeden Tag die Variante in der Frage stackoverflow.com/q/22693823/2987828 und es funktioniert gut. - user2987828
sehen perlmonks.org/bare/?node_id=492858 was besagt, dass ARGV und STDIN ähnlich sind, es sei denn, ein Dateiname wird als Argument angegeben. - user2987828


Leute, die daran interessiert sind, dies speziell mit LVM-Snapshots zu tun, mögen vielleicht meine lvmsync Werkzeug, das die Liste der geänderten Blöcke in einem Schnappschuss liest und nur diese Änderungen sendet.


9
2017-10-29 03:33





Sieh dir das an Zumastor Linux Speicherprojekt Es implementiert "Snapshot" Backup mit binären "rsync" über die ddsnap Werkzeug.

Von der Man-Seite:

ddsnap bietet die Blockgeräte-Replikation mit einer Snapshot-Funktion auf Blockebene, die mehrere gleichzeitige Snapshots effizient halten kann. ddsnap kann eine Liste von Snapshot-Chunks generieren, die sich zwischen zwei Snapshots unterscheiden, und diese Differenz dann über die Verbindung senden. Schreiben Sie die aktualisierten Daten auf einem nachgeschalteten Server in ein Snapshot-Block-Gerät.


6
2018-06-17 16:42



Ah, das sieht nach genau der Art von Dingen aus, nach denen ich gesucht habe, danke. - David Hicks
Der Link zum Zumastor-Projekt ist veraltet, ich denke, das ist der richtige: shapor.com/zumastor.org - Martin


Es gibt ein Python-Skript namens Blocksynchronisierung Dies ist eine einfache Möglichkeit, zwei Blockgeräte über ein Netzwerk über ssh zu synchronisieren und nur die Änderungen zu übertragen.

  • Kopiere blocksync.py in das Home-Verzeichnis auf dem Remote-Host
  • Stellen Sie sicher, dass Ihr Remotebenutzer entweder sudo oder root selbst ist
  • Stellen Sie sicher, dass Ihr lokaler Benutzer (root?) Das Quellgerät & ssh auf dem Remote-Host lesen kann
  • Aufrufen: python blocksync.py /dev/source user@remotehost /dev/dest

Ich habe kürzlich gehackt, um es aufzuräumen und es zu ändern, um den gleichen schnellen Prüfsummenalgorithmus wie rsync zu verwenden (Adler-32).


2
2017-11-03 23:44



Ich benutze es, funktioniert gut. Beachten Sie, dass es ein modifizierte Version Das behebt eine mögliche Quelle von Korruption und verwendet einen zuverlässigeren Hash. - cmc


Wenn Sie versuchen, die Menge an leerem Speicherplatz zu minimieren, würden Sie mit einer Ebene über das Kabel senden ddKönntest du es nicht einfach zu gzip pipen, bevor du es an ssh anschließt?

z.B. dd if = / dev / xenVG / SERVER001OS | gzip | ssh Administrator @ backupserver "dd von = / mnt / largeDisk / SERVER001OS.img.gz"


1
2018-06-24 17:37



Es würde die benötigte Bandbreite ein wenig reduzieren, aber wir haben Festplattenbilder mit 60 und 100 GB und sogar mit gzip würde es zu lange dauern. - David Hicks
@Ophidian, Sie sollten wissen, dass SSH Kompression intern behandelt, gibt es eine Option. - poige


Bedenken Sie jedoch, dass die Leistung eines Systems mit LVM-Snapshots proportional zur Anzahl der Snapshots ist.

Zum Beispiel Mysql-Leistung mit LVM-Snapshots


1
2018-06-24 17:00



In der Tat - meine ursprüngliche Lösung bestand darin, einfach einen täglichen Snapshot zu erstellen, dann einen Vergleich mit dem Snapshot des vorherigen Tages durchzuführen und ihn auf den Backup-Server zu übertragen. Ich war am meisten verärgert, um herauszufinden, dass es nicht so einfach sein würde. - David Hicks
Bei LVM-Thin-Snapshots, die sehr unterschiedlich implementiert sind, trifft dies möglicherweise nicht zu - Alex F


Zusätzlich zu David Herselmans Antwort - Das folgende Skript wird mit einem lokalen Gerät synchronisiert:

perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};print md5($_)' $dev2 |
  perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
    read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 |
   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

Soweit ich weiß, wurden beide Skripte zuerst bei lists.samba.org.


0
2017-08-28 06:07