Übertragen Sie 15 TB winziger Dateien

79

Ich archiviere Daten von einem Server auf einen anderen. Anfangs habe ich einen rsyncJob angefangen . Es dauerte 2 Wochen, bis die Dateiliste nur für 5 TB Daten erstellt wurde, und eine weitere Woche, bis 1 TB Daten übertragen wurden.

Dann musste ich den Job beenden, da wir einige Ausfallzeiten auf dem neuen Server benötigen.

Es wurde vereinbart, dass wir es tarieren werden, da wir wahrscheinlich nicht mehr darauf zugreifen müssen. Ich dachte daran, es in 500-GB-Blöcke aufzuteilen. Nachdem ich tares dann gemacht hatte, wollte ich es durchschreiben ssh. Ich habe verwendet tarund pigzaber es ist immer noch zu langsam.

Gibt es einen besseren Weg, es zu tun? Ich denke, beide Server sind auf Redhat. Der alte Server ist Ext4 und der neue ist XFS.

Die Dateigrößen reichen von wenigen KB bis zu wenigen MB und es gibt 24 Millionen JPEGs in 5 TB. Ich schätze also auf etwa 60-80 Millionen für 15 TB.

edit: Nach ein paar Tagen mit rsync, nc, tar, mbuffer und pigz spielen. Der Engpass wird der Platten-E / A sein. Da die Daten auf 500 SAS-Festplatten und rund 250 Millionen JPEGs verteilt sind. Jetzt lernte ich all diese netten Tools, die ich in Zukunft verwenden kann.

lbanz
quelle
1
mögliches Duplikat von Linux zu Linux, 10 TB Transfer?
D34DM347,
2
Eine Möglichkeit besteht darin, die komprimierten TAR-Dateien auf einem externen Laufwerk zu erstellen und auf das neue System zu verschieben. Der zusätzliche Datenträger beschleunigt die Erstellung der TAR-Dateien (schreibt möglicherweise nicht auf vorhandene Datenträger im System, während versucht wird, 15 TB von ihnen zu lesen) und bindet den neuen Server nicht.
Brian,
4
Gibt es einen besseren Weg, dies zu tun? - Ja, die Windows Server 2012 R2-DFS-Replikation würde dies in etwa 10 Stunden vorbereiten . Und es würde Änderungen synchronisieren und dort weitermachen, wo es nach einem Neustart aufgehört hat.
TessellatingHeckler
27
@TessellatingHeckler: Sie schlagen also vor, dass OP vor der Archivierung von Redhat auf Windows migriert wird?
Thomas Weller
12
@ThomasWeller Sie fragten "Gibt es einen besseren Weg?", Und es gibt. Ich gebe keine Empfehlung ab, dass sie den besseren Weg nutzen. Sie können Befehle in einer Pipe verwenden, die sich nicht von Unterbrechungen erholen lassen, den Dateiinhalt nicht überprüfen, den Kopierstatus nicht melden können, zuvor kopierte Blöcke nicht verwenden können, um das Kopieren von Teilen von Dateien zu vermeiden unterstützt das Kopieren mit niedriger Priorität, kann nicht angehalten werden, erwähnt das Kopieren von ACLs nicht und benötigt jemanden, der angemeldet bleibt, um es auszuführen. Alle anderen, die mitmachen, könnten jedoch interessiert sein - oder aufgefordert werden, "x macht das unter Linux" zu sagen.
TessellatingHeckler

Antworten:

64

Ich habe sehr gute Ergebnisse mit tar, pigz(parallel gzip) und erzielt nc.

Quellmaschine:

tar -cf - -C /path/of/small/files . | pigz | nc -l 9876

Zielmaschine:

Extrahieren:

nc source_machine_ip 9876 | pigz -d | tar -xf - -C /put/stuff/here

So bewahren Sie das Archiv auf:

nc source_machine_ip 9876 > smallstuff.tar.gz

Wenn Sie die Übertragungsrate sehen möchten, leiten Sie sie einfach pvnach pigz -d!

h0tw1r3
quelle
3
FYI, können Sie ersetzen pigzmit gzipihnen ganz oder entfernen, aber die Geschwindigkeit wird deutlich langsamer.
h0tw1r3
10
Wie kann dies akzeptiert werden , wenn OP hat bereits versucht , tarund pigz? Ich verstehe nicht ...
Thomas Weller
5
@ThomasWeller woher hast du das er es versucht hat pigz? Aus der Frage sieht es so aus, als hätte er es bisher nur versucht rsyncund überlegt , tardie Daten zu teilen und zu bündeln. Insbesondere, wenn er die -z/ --compress-Option bei rsync nicht verwendet hat , pigzkönnte dies theoretisch erheblich helfen.
Doktor J
1
@ThomasWeller ja ich habe schon teer und pigz probiert aber nc nicht. Ich habe ssh verwendet, um den Overhead zu erhöhen.
lbanz,
2
@lbanz bedeutet einfach, dass tardie Daten nicht schnell genug produziert werden pigz, um viel CPU für die Komprimierung zu verwenden. Das Lesen vieler kleiner Dateien ist mit viel mehr Systemaufrufen, viel mehr Festplattensuchen und viel mehr Systemaufwand verbunden als das Lesen derselben Anzahl von Bytes größerer Dateien, und es sieht so aus, als ob Sie auf einer grundlegenden Ebene einfach einen Engpass haben.
Hobbs
21

Ich würde bei der Rsync-Lösung bleiben. Modern (3.0.0+) rsync verwendet eine inkrementelle Dateiliste, sodass vor der Übertragung keine vollständige Liste erstellt werden muss. Wenn Sie das Gerät neu starten, müssen Sie bei Problemen nicht die gesamte Übertragung wiederholen. Durch Aufteilen der Übertragung nach obersten oder zweiten Verzeichnissen wird dies noch weiter optimiert. (Ich würde verwenden rsync -a -Pund hinzufügen, --compresswenn Ihr Netzwerk langsamer als Ihre Laufwerke ist.)

Fuchs
quelle
Ich benutze Rsync 2.6.8 auf dem alten Server. Da es sich um eine dieser Boxen handelt, in denen wir nichts installieren / aktualisieren dürfen, wie vom Hersteller angegeben, oder die Garantie erlischt. Ich könnte es aktualisieren und sehen, ob es noch schneller ist.
lbanz,
18
Suchen (oder erstellen) Sie eine statisch verknüpfte rsync-Binärdatei und führen Sie sie einfach von zu Hause aus aus. Hoffentlich ruiniert das keine Garantie.
Fox
Wie wäre es unison? Wie ist es zu vergleichen rsync?
Gwyneth Llewelyn
15

Richten Sie ein VPN ein (sofern es über das Internet erreichbar ist), erstellen Sie ein virtuelles Laufwerk in einem bestimmten Format auf dem Remoteserver (machen Sie es zu einem ext4-Laufwerk), hängen Sie es auf dem Remoteserver an und hängen Sie es dann auf dem lokalen Server an (unter Verwendung eines Protokolls auf Blockebene wie iSCSI) ), und verwenden Sie dd oder ein anderes Tool auf Blockebene, um die Übertragung durchzuführen. Sie können die Dateien dann nach Belieben vom virtuellen Laufwerk auf das reale Laufwerk (XFS) kopieren.

Zwei Gründe:

  1. Kein Overhead des Dateisystems, was die Hauptursache für die Leistung ist
  2. Kein Suchen, Sie suchen nach sequentiellem Lesen / Schreiben auf beiden Seiten
Arthur Kay
quelle
3
Das Umgehen des Dateisystems ist gut. Das Kopieren der Blockebene eines mit Lese- und Schreibzugriff bereitgestellten Dateisystems ist eine wirklich schlechte Idee. Hängen Sie zuerst die Bereitstellung aus oder stellen Sie sie schreibgeschützt bereit.
JB.
Eine Kopie von 15 TB zu haben, ist auch zum Kotzen. Es bedeutet, dass der neue Server mindestens 30 benötigt.
Arthur Kay
3
Wenn der Server LVM verwendet, kann ein schreibgeschützter Snapshot des Dateisystems erstellt und stattdessen kopiert werden. Speicherplatzaufwand nur für die Änderungen im Dateisystem, die beim Lesen des Snapshots vorgenommen werden.
Liori
9

Wenn der alte Server außer Betrieb genommen wird und die Dateien für einige Minuten offline sein können, ist es oft am schnellsten, die Laufwerke aus der alten Box zu ziehen und sie mit dem neuen Server zu verbinden, sie zu mounten (jetzt wieder online) und die Dateien zu kopieren auf den neuen Servern native Festplatten.

Robin Hammond
quelle
2
Es geht um 1 TB 2-TB-Laufwerke, es ist also viel zu viel.
lbanz,
3

Verwenden Sie mbuffer, und wenn es sich in einem sicheren Netzwerk befindet, können Sie den Verschlüsselungsschritt vermeiden.

JamesRyan
quelle
3

(Viele verschiedene Antworten können funktionieren. Hier ist eine andere.)

Generieren Sie die Dateiliste mit find -type f(dies sollte in ein paar Stunden abgeschlossen sein), teilen Sie sie in kleine Teile auf und übertragen Sie jeden Teil mit rsync --files-from=....

pts
quelle
3

Hast du über Sneakernet nachgedacht? Damit meine ich, alles auf dasselbe Laufwerk zu übertragen und dieses Laufwerk dann physisch zu verschieben.

Vor ungefähr einem Monat hat Samsung ein 16-TB-Laufwerk vorgestellt (technisch gesehen sind es 15,36 TB), bei dem es sich auch um eine SSD handelt: http://www.theverge.com/2015/8/14/9153083/samsung-worlds-largest-hard -Laufwerk-16tb

Ich denke, dass dieser Antrieb gerade dafür tun würde. Sie müssten immer noch alle Dateien kopieren, aber da Sie keine Netzwerklatenz haben und wahrscheinlich SATA oder eine ähnlich schnelle Technik verwenden können, sollte es viel schneller sein.

Nzall
quelle
2

Wenn es eine Chance gibt, eine hohe Erfolgsquote bei der Deduplizierung zu erzielen, würde ich so etwas wie Borgbackup oder Attic verwenden.

Wenn nicht, überprüfen Sie die netcat + tar + pbzip2- Lösung, passen Sie die Komprimierungsoptionen an Ihre Hardware an - überprüfen Sie, was der Engpass ist (CPU? Netzwerk? IO?). Das pbzip2 würde sich über alle CPUs erstrecken und eine bessere Leistung liefern.

Neutrinus
quelle
lzma ( xz) dekomprimiert schneller als bzip2 und funktioniert bei den meisten Eingaben gut. Leider ist xzdie Multithread-Option von noch nicht implementiert.
Peter Cordes
Normalerweise benötigt die Komprimierungsstufe mehr PS als die Dekomprimierung. Wenn also die CPU der begrenzende Faktor ist, führt pbzip2 zu einer besseren Gesamtleistung. Dekomprimierung sollte den Prozess nicht beeinflussen, wenn beide Maschinen ähnlich sind.
Neutrinus
Ja, es war eine Schande, dass es kein Single-Stream-Multithread-LZMA gibt. Obwohl für diesen Anwendungsfall, ganze Dateisysteme von Daten zu übertragen, pigzprob. Seien Sie der langsamste Kompressor, den Sie verwenden möchten. Oder sogar lz4. (Es gibt einen lz4mtMulti-Threaded-for-a-Single-Stream. Er ist nicht sehr effizient (führt extrem oft zu neuen Threads), aber es wird eine solide Beschleunigung erreicht.)
Peter Cordes
2

Sie verwenden RedHat Linux, dies würde also nicht zutreffen, aber als eine andere Option:

Ich hatte großen Erfolg mit ZFS, um Millionen von Dateien zu speichern, da Inodes kein Problem darstellen.

Wäre dies eine Option für Sie, könnten Sie Snapshots erstellen und zfs verwenden, um inkrementelle Updates zu senden. Ich hatte viel Erfolg mit dieser Methode, um Daten zu übertragen und zu archivieren.

ZFS ist in erster Linie ein Solaris-Dateisystem, befindet sich jedoch in der Abbildung (Open Source Fork von Suns OpenSolaris). Ich weiß, dass es auch ein bisschen Glück gab, ZFS unter BSD und Linux (mit FUSE?) Zu verwenden - aber ich habe keine Erfahrung damit.

Schlafwiesel
quelle
3
Es gibt bereits seit einiger Zeit einen Linux-Port von ZFS, der nicht von FUSE stammt: zfsonlinux.org
EEAA
1

Starten Sie einen rsyncDaemon auf dem Zielcomputer. Dies beschleunigt den Übertragungsprozess erheblich.

Heiko Wiesner
quelle
-1

Sie können dies mit nur tar und ssh tun, wie folgt:

tar zcf - <your files> | ssh <destination host> "cat > <your_file>.tar.gz"

Oder, wenn Sie einzelne Dateien behalten möchten:

tar zcf - <your files> | ssh <destination host> "tar zxf -"

Fabio Brito
quelle
1
Es wird keine Deduplizierung durchgeführt, keine Möglichkeit, die Komprimierung mit nur einer CPU fortzusetzen.
Neutrinus