So machen Sie rsync von ~ 2M-Dateien vom Remote-Server für regelmäßige Sicherungen performant

7

Wir haben eine große Anzahl von Dateien auf einem Remote-Server, die ich für zusätzliche Redundanz regelmäßig auf einem lokalen System sichern möchte. Ein paar Details:

  • Das Remote-System ist nicht in meiner Kontrolle. Ich habe nur SSH / rsync- oder FTP-Zugang
  • Das Remote-System führt rsync 2.6.6 aus und kann nicht aktualisiert werden
  • Das Remote-System ermöglicht maximal 25 gleichzeitige Verbindungen und 5 sind für Produktionsanforderungen reserviert (also 20 verfügbar).
  • Das Remote-System enthält 2 Millionen Dateien, von denen die meisten 100 bis 200 KB groß sind
  • Dateien werden in einer Hierarchie gespeichert

Ähnlich zu:

0123456789/
        0123456
            abc/
                1.fff
                2.fff
                3.fff
            xyz/
                9.fff
                8.fff
                7.fff
9877656578/
        5674563
            abc/
                1.fff
                2.fff
                3.fff
            xyz/
                9.fff
                8.fff
                7.fff

Zehntausende dieser Stammordner enthalten nur einige der internen Ordner- / Dateistrukturen - aber alle Stammordner sind nur numerisch (0-9).

Ich bin rsync -aPdas erste Mal mit einer Straße gefahren und es hat gedauert 3196m20.040s. Dies ist teilweise auf die Tatsache zurückzuführen, dass rsyncich die in 3.xx enthaltenen inkrementellen Dateifunktionen nicht verwenden kann , da der Remote-Server auf 2.6.6 läuft. Das Kompilieren der Dateiliste dauert fast 12 Stunden - es werden ungefähr 500 Dateien pro 10 Sekunden ausgeführt. Ich gehe nicht davon aus, dass nachfolgende Läufe so lange dauern werden, da der erste Lauf alles neu herunterladen musste - jedoch sind selbst 12 Stunden nur für die Dateiliste zu lang.

Die Ordnernamen sind wie folgt aufgeteilt:

$ ls | grep "^[^67]" | wc -l
295
$ ls | grep "^6" | wc -l
14167
$ ls | grep "^7" | wc -l
14414

Ich habe das Ausführen getestet, rsync -aWP --delete-duringindem --include="/0*/" --exclude="/*/"ich es aufgeschlüsselt habe, indem ich 8 davon gleichzeitig mit 0* 1* 2* 3* 4* 5* 8* 9*und für 6 und 7 ausgeführt habe 60*- 69*und 70*-79*weil die Hauptlast der Ordner in der Hierarchie mit 6oder beginnt 7(ungefähr 1400 pro 6?*oder 7?*).

Alles , was keine 6 oder 7 ist, dauert insgesamt etwa 5 Minuten. Die 6/7-Verzeichnisse (aufgeschlüsselt in 1/10) dauern jeweils 15 Minuten.

Dies ist ziemlich performant, außer um diesen Job auszuführen, muss ich 28 gleichzeitig ausführen, rsyncund dies sättigt die verfügbare Verbindungsanzahl - ganz zu schweigen von einer möglichen Sättigung des Netzwerks.

Hat jemand eine Empfehlung für eine andere Variante rsyncoder einige zusätzliche Optionen, die ich hinzufügen könnte, um zu verhindern, dass so viele Verbindungen gleichzeitig verwendet werden, ohne dass dies nacheinander in den Grenzen von rsync2.6.6 an einem Ende erfolgen muss?

Edit # 1: Wir zahlen für die Bandbreite an / von diesem externen Anbieter, sodass wir im Idealfall nur Dinge über das Kabel senden, die gesendet werden müssen, und nicht mehr.

jimmy0x52
quelle
1
Was ist Ihr Wiederherstellungspunktziel? Wenn der Zeitpunkt der letzten Woche akzeptabel ist, dauert die Sicherung 3 Tage.
John Mahowald
täglich für 7 Tage, wöchentlich für einen Monat, monatlich für 3 Monate, einjährig darüber hinaus. Ich möchte im Falle eines Problems <24 Stunden für die Backups.
Jimmy0x52
Wie oft ändern sich vorhandene Dateien? Wie oft werden neue Dateien erstellt? IE: Sind die Unterschiede meistens aktualisierte Dateien oder neue Dateien? Nicht, dass ich eine brillante Lösung hätte, aber diese Informationen könnten einen Ansatz verbessern.
Mark Stewart
Bestehende Dateien ändern sich selten - wenn überhaupt. Es werden hauptsächlich neue nummerierte Stammordner oder Ordner der 2. Ebene hinzugefügt, wobei eindeutige Dateien in dieser 2. Ebene enthalten sind.
Jimmy0x52
1
Ich habe meine Hausaufgaben gemacht :) - Ich werde es versuchen und dich wissen lassen. Ich werde auch versuchen, diesen Job ein zweites Mal auszuführen, nachdem die Daten tatsächlich kopiert wurden - und ein Gefühl dafür zu bekommen, wie lange ein zweiter Durchgang dauert. Ich werde Ergebnisse veröffentlichen (es kann ein paar Tage dauern)
jimmy0x52

Antworten:

3

Nach einer anfänglichen Synchronisierungszeit von 40 Stunden zum Herunterladen und Synchronisieren aller Daten dauerte ein nachfolgender Scan und die Synchronisierung derselben Daten (nur um Updates abzurufen) nur 6,5 Stunden. Der Befehl zum Ausführen von rsyncwar:

rsync -a --quiet USER@REMOTE_SERVER:ROOT/FOLDER/PATH/ /LOCAL/DESTINATION

Ich denke, meine große anfängliche Zeit zum Herunterladen war zweifach:

  1. Der anfängliche Datensatz besteht aus 270 GB und ~ 2 Millionen Dateien, was viel zu scannen und über das Internet herunterzuladen ist (in unserem Fall haben wir eine synchrone 100-MBit-Verbindung und dies war eine Verbindung zu einem großen CDN-Anbieter).

  2. Ich hatte die Option -P aktiviert und -v Optionen bei der anfänglichen Synchronisierung, was zu viel lokalem Konsolen-Chatter führte, in dem jede zu synchronisierende Datei und Fortschrittsinformationen angezeigt wurden.

Also die Antwort hier: Verwenden Sie einfach rsyncnicht so viele Ausführlichkeitsoptionen (und im --quietIdealfall) und es ist ziemlich effizient - selbst bei großen Datenmengen.

jimmy0x52
quelle
1
Freut mich zu sehen, dass es so funktioniert, wie es sollte. Wenn einige Ihrer Daten komprimierbar sind, sollten Sie sie hinzufügen -z.
Roaima
1
Bei solchen Datensätzen so effizient wie möglich zu sein, ist wirklich der springende Punkt rsync. Ich betreibe einen Server, der rsynctäglich über 100 solcher Anrufe an 30 verschiedene Remote-Server tätigt. Die anfängliche Synchronisierung mit einigen davon dauerte mehrere Tage, aber die späteren inkrementellen Aktualisierungen sind nicht unangemessen lang. Ein extremes Beispiel sind 1,3 TB in 3,4 Millionen Dateien, deren anfängliche Synchronisierung fast eine Woche dauerte und die nun 4 bis 10 Stunden pro Tag dauert, um nach Updates zu suchen.
Moshe Katz
1
Angesichts der geringen Dateigröße und der hohen Anzahl können Sie (wie ich betone) eine gewisse Verbesserung -WIhres rsync-Aufrufs feststellen. Es kopiert nur ganze Dateien basierend auf Größen- / Zeitstempeländerungen und überspringt jede Delta-Übertragung. Abhängig von der Art der Änderungen kann dies Zeit sparen.
SmallClanger
1

Folgendes würde ich persönlich tun: Es gibt zwei Variationen der Lösung.

Variante 1 - die einfache Bruteforce-Option:

2 MB * 200 KB sind ungefähr 400 GB, sodass möglicherweise nicht jedes Mal ein vollständiger Schnappschuss möglich ist. Wenn es möglich ist, wäre die einfache Lösung:

ssh <remote host> 'tar -c /directory/to/backup | <gzip/xz/lz4>' > backup.tar.<gz/xz/lz4>

Auf diese Weise werden alle diese Dateien in einen einzigen Stream umgewandelt, der über die Pipe übertragen wird, anstatt Rsync / SFTP, das die Millionen von Dateien auflistet.

Von dort aus würde ich borg verwenden, um den Teerball zu deduplizieren, damit Sie mehrere Versionen effizient speichern können. Dies ist ein gängiger Trick, um Tonnen kleiner Dateien sehr schnell weiterzuleiten. Der Nachteil ist, dass Sie die von RSync durchgeführte Deduplizierung nicht durchführen können.

Wenn die 400 GB pro Intervall zu groß sind, würde ich Folgendes in Betracht ziehen:

Variante 2 - die clevere Option.

Sie können Folgendes ausführen, außer dass Sie für jedes Verzeichnis der obersten Ebene einen Tarball erstellen und den Hash mit der vorhandenen Datei auf dem Sicherungsserver vergleichen. Wenn es anders ist, übertragen Sie es, sonst tun Sie nichts.

Brennen Smith
quelle
400 GB über das Kabel, jede Nacht, könnten es schieben. Ich habe es im ersten Beitrag nicht erwähnt, aber wir zahlen für die Bandbreite dieses Anbieters. Alles, was ich tun kann, um die Übertragung von Elementen zu reduzieren, die nicht übertragen werden müssen, ist umso besser.
Jimmy0x52
1
Komprimieren die Dateien gut?
Brennen Smith
Gute Frage - ich teere sie vor Ort und werde es Sie wissen lassen. Ich habe nachgesehen und unkomprimiert, es sind ungefähr 270 GB (daher haben nicht alle 2M-Dateien die Größe 100-200k). Sie sind auch ungefähr halb binär halb Text, also werden wir sehen.
Jimmy0x52
270 GB -> 144 GB nach Teer / Zippen. Nicht schlecht. Ich werde diese Option weiter untersuchen. Vielen Dank.
Jimmy0x52
0

2M-Dateien bedeuten viele Metadaten, sodass Ihre rsyncLäufe langsam sind, da sowohl die lokale als auch die Remote-Seite alle Metadaten durchlaufen müssen.

Sie sollten den Arbeitsspeicher an beiden Enden maximieren und idealerweise mit rsyncVersion> 3.x ausführen. Die Tatsache, dass Sie rsyncam Remote-Ende nicht aktualisieren können, lässt mich jedoch denken , dass Sie den Arbeitsspeicher nicht aktualisieren können.

Ein letzter Versuch wäre , das Zwischenspeichern von Metadaten sowohl auf lokaler als auch auf entfernter Seite zu priorisieren . Sie können versuchen vfs_cache_pressure=10, die Leistung einzustellen, rsyncmindestens zweimal erneut auszuführen und die Leistung des zweiten Laufs zu vergleichen, nachdem Sie den obigen Parameter geändert haben.

Shodanshok
quelle
vfs_cache_pressuregeht von Linux aus, das Betriebssystem wurde noch nicht bereitgestellt.
John Mahowald
Keine Kontrolle über die Hardware / Software auf der Remote-Seite. Verwenden eines CDN-Anbieters eines Drittanbieters für das Remote-Teil.
Jimmy0x52