Verbesserung der rsync-Sicherungsleistung


8

Was sind die besten Techniken, um rsync gegenüber ssh-Spiegelung zwischen Unix-Boxen zu verbessern, vorausgesetzt, ein System verfügt immer über die Masterkopie und das andere System immer über eine aktuelle Kopie (weniger als 48 Stunden alt).

Was müsste man auch tun, um diesen Ansatz zu skalieren und Dutzende von Maschinen zu handhaben, die diese Änderungen vorantreiben?

Antworten:


6

Wenn :

  • Die Änderungszeit Ihrer Dateien ist richtig
  • Die Dateien sind nicht wirklich groß
  • Es kann kein Push übersehen werden (oder es gibt eine Art Rückstandsverarbeitung).

Sie können eine Liste der seit der letzten Ausführung geänderten Dateien verwenden find -ctimeoder file -cnewererstellen und nur die geänderten Dateien kopieren (nur ein verherrlichter Differential-Push).

Dies hat sich für mehrere Hosts recht gut übersetzt: Führen Sie einfach einen differenziellen Teer für die Quelle aus und entpacken Sie ihn für alle Hosts.

Es gibt Ihnen so etwas:

find -type f -cnewer /tmp/files_to_send.tar.gz > /tmp/files_to_send.txt
tar zcf /tmp/files_to_send.tar.gz --files-from /tmp/files_to_send.txt 
for HOST in host1 host2 host3 ...
do
    cat /tmp/files_to_send.tar.gz | ssh $HOST "tar xpf -"
done

Das Skript muss verfeinert werden, aber Sie haben die Idee.


Ups: eine weitere nutzlose Verwendung von Katze :-)
Steve Schnepp

Eigentlich könnte das fast genau so gemacht werden; die Befugnisse der Annahme , dass wäre mit dem Hinzufügen dieser in Ordnung sein Recht , nachdem die Skripte auszuführen, die die Daten - Dateien pflegen
sal

4

Unter der Annahme, dass die Daten, die Sie synchronisieren, noch nicht komprimiert sind, wird das Aktivieren der Komprimierung (-z) wahrscheinlich die Übertragungsgeschwindigkeit auf Kosten einiger CPUs an beiden Enden verbessern.


Die Komprimierung wurde bereits über ssh
sal

3
Die Komprimierung über rsync ist normalerweise effektiver als die Komprimierung im SSH-Tunnel. Grund dafür ist, dass rsync über mehr Wissen verfügt und dieses nutzen kann. Beispielsweise kann die Komprimierung auf Teile von Dateien verweisen, die nicht übertragen wurden.
Derobert

5
@derobert Verschiebung der Komprimierung von ssh nach rsync verbesserte die Leistung um fast 20%
sal

2

Wenn Sie sehr große Dateien mit vielen Änderungen übertragen, verwenden Sie die Optionen --inplace und --whole-file. Ich verwende diese für meine 2-GB-VM-Images und es hat sehr geholfen (hauptsächlich, weil das rsync-Protokoll nicht viel bewirkt hat mit der Weitergabe inkrementeller Daten mit diesen Dateien). Ich empfehle diese Optionen jedoch in den meisten Fällen nicht.

Verwenden Sie --stats, um zu sehen, wie gut Ihre Dateien mithilfe des inkrementellen Protokolls rsync übertragen werden.


2

Eine andere Strategie besteht darin, ssh und rsync schneller zu machen. Wenn Sie über ein vertrauenswürdiges Netzwerk (sprich: privat) gehen, ist eine Verschlüsselung der tatsächlichen Nutzdaten nicht erforderlich. Sie können HPN ssh verwenden . Diese Version von ssh verschlüsselt nur die Authentifizierung. Außerdem beginnt rsync Version 3 beim Übertragen der Dateiliste mit der Übertragung von Dateien. Dies ist natürlich eine enorme Zeitersparnis gegenüber rsync Version 2. Ich weiß nicht, ob Sie danach gesucht haben, aber ich hoffe, es hilft. Außerdem unterstützt rsync Multicasting in gewisser Weise, obwohl ich nicht vorgeben werde, zu verstehen, wie.


Vor einigen Jahren, als ich Systeme mit viel langsameren Prozessoren verwendete, habe ich alle verfügbaren OpenSSH-Komprimierungsmethoden verglichen und "arcfour" war ungefähr die schnellste. In Kombination mit dem Einschalten von Jumbo-Frames bei Verwendung von Gig-E werden die Übertragungsgeschwindigkeiten erheblich verbessert.
Derek Pressnall

2

Wenn Sie als Sicherungsmethode eine Synchronisierung durchführen, besteht das größte Problem darin, dass Sie viele Dateien sichern, die Sie sichern. Rsync kann große Dateien problemlos verarbeiten. Wenn jedoch die Anzahl der zu sichernden Dateien zu groß wird, werden Sie feststellen, dass rsync nicht in angemessener Zeit abgeschlossen wird. In diesem Fall müssen Sie das Backup in kleinere Teile zerlegen und dann diese Teile durchlaufen, z

find /home -mindepth 1 -maxdepth 1 -print0 | xargs -0 -n 1 -I {} -- rsync -a -e ssh {} backup@mybackupserver:/backup/

oder Teern der Dateigruppe, um die Anzahl der Dateien zu verringern.

Wenn Dutzende von Computern einen Spiegel dieser Änderungen erhalten, hängt dies davon ab, wie aktuell das Backup sein muss. Ein Ansatz wäre, die Änderungen vom Primärserver auf den Sicherungsserver zu spiegeln und dann die anderen Server ihre Änderungen entweder durch einen rsync-Dämon auf dem anfänglichen Sicherungsserver vom Sicherungsserver abrufen zu lassen und dann die anderen Server so zu planen, dass sie geringfügig abgerufen werden Zu anderen Zeiten oder indem Sie ein Skript verwenden, verwenden Sie passwortloses ssh, um eine Verbindung zu jedem der Server herzustellen, und weisen Sie sie an, eine neue Kopie des Backups abzurufen, um zu verhindern, dass Ihr anfänglicher Backup-Server überlastet wird. Ob Sie jedoch zu so vielen Problemen wechseln, hängt davon ab Auf wie vielen anderen Computern haben Sie eine Kopie der Sicherung abgerufen?


Würdest du den Unterschied kennen zwischen: für f in /Backup/*.bak; rsync -e ssh $ f backup @ mybackupserver; erledigt und rsync -re ssh /Backup/*.bak backup @ mybackupserver?
Osama ALASSIRY

Es scheint mir, dass der Unterschied nur darin besteht, dass die erste rsync für jede .bak-Datei (vorausgesetzt, dass * .bak nur mit Dateien übereinstimmt) im Verzeichnis / Backup / ausführt, während die zweite eine rsync ausführt, um sie überall zu übertragen. Wenn * .bak mit Verzeichnissen übereinstimmen soll, wird das erste nicht in die Unterverzeichnisse zurückgeführt (vorausgesetzt, Sie haben das -r absichtlich weggelassen). Im Allgemeinen möchten Sie die zweite und nicht die erste ausführen, bis Sie zu viele Dateien haben, um sie ordnungsgemäß verarbeiten zu können.
Rodney Amato

1
Beachten Sie, dass die Verwendung von for-Looks zum Durchlaufen von Verzeichnissen oder Dateien im Allgemeinen keine gute Idee ist. Es wird schrecklich kaputt gehen, wenn es auf ein Verzeichnis oder eine Datei mit einem Leerzeichen trifft.
Nathan

@ Nathan, also so etwas wie find /Backup/ -name '*.bak' -print0 | xargs -0 -n 1 rsync -e ssh?
Hark

Ich habe das Beispiel aktualisiert, um den xargs-Ansatz zu verwenden. Ich musste das nie selbst tun, weil ich noch nie ein Verzeichnis unter / home hatte, in dem ein Leerzeichen steht, aber wir sollten dort das beste Beispiel haben.
Rodney Amato

2

rsync bietet die Möglichkeit, getrennte Kopien zu erstellen . Mit anderen Worten, kann rsync (konzeptuell) diff einen Verzeichnisbaum und erzeugen eine Patch - Datei , die Sie dann später können anwenden auf eine beliebige Anzahl von Dateien , die auf die ursprüngliche Quelle identisch sind.

Es erfordert, dass Sie rsync mit dem Master aufrufen und mit spiegeln --write-batch; es erzeugt eine Datei. Anschließend übertragen Sie diese Datei auf eine beliebige Anzahl anderer Ziele und wenden den Stapel dann mit jedem dieser Ziele an --read-batch.

Wenn Sie eine lokale Kopie des letzten synchronisierten Status (dh eine Kopie des aktuellen Aussehens der Spiegel) auf demselben Computer wie der Master aufbewahren, können Sie diesen "Patch" auf dem Master generieren, ohne einen Spiegel zu kontaktieren:

Auf dem Meister:

rsync --write-batch=my-batch.rsync /master/data /current/mirror

Fügen Sie beliebige andere Optionen hinzu. Dies wird zwei Dinge tun:

  1. Es wird sich /current/mirrorändern, um zu reflektieren/master/data
  2. Es wird eine binäre Patch-Datei (oder Batch-Datei) erstellt, die my-batch.rsynczur späteren Verwendung aufgerufen wird .

Übertragen Sie die my-batch.rsyncDatei vom Master auf alle Ihre Spiegel und wenden Sie dann auf den Spiegeln sozusagen den Patch an:

rsync --read-batch=my-batch.rsync /local/mirror

Vorteile dieses Ansatzes:

  • Meister ist nicht überflutet
  • Sie müssen nicht gleichzeitig den Master / die Spiegel koordinieren / darauf zugreifen
  • Verschiedene Personen mit unterschiedlichen Berechtigungen können die Arbeit am Master und an den Spiegeln ausführen.
  • kein TCP-Kanal erforderlich (ssh, netcat, was auch immer; die Datei kann per E-Mail gesendet werden ;-))
  • Offline-Spiegel können später synchronisiert werden (schalten Sie sie einfach online und wenden Sie den Patch an).
  • Alle Spiegel sind garantiert identisch (da sie denselben "Patch" anwenden)
  • Alle Spiegel können gleichzeitig aktualisiert werden (da die --read-batchnur auf dem Spiegel selbst CPU- / Io-intensiv ist)
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.