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 -aP
das erste Mal mit einer Straße gefahren und es hat gedauert 3196m20.040s
. Dies ist teilweise auf die Tatsache zurückzuführen, dass rsync
ich 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-during
indem --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 6
oder 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, rsync
und 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 rsync
oder 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 rsync
2.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.
quelle
Antworten:
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
rsync
war:Ich denke, meine große anfängliche Zeit zum Herunterladen war zweifach:
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).
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
rsync
nicht so viele Ausführlichkeitsoptionen (und im--quiet
Idealfall) und es ist ziemlich effizient - selbst bei großen Datenmengen.quelle
-z
.rsync
. Ich betreibe einen Server, derrsync
tä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.-W
Ihres 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.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.
quelle
2M-Dateien bedeuten viele Metadaten, sodass Ihre
rsync
Lä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
rsync
Version> 3.x ausführen. Die Tatsache, dass Siersync
am 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,rsync
mindestens zweimal erneut auszuführen und die Leistung des zweiten Laufs zu vergleichen, nachdem Sie den obigen Parameter geändert haben.quelle
vfs_cache_pressure
geht von Linux aus, das Betriebssystem wurde noch nicht bereitgestellt.