Frage So kopieren Sie eine große Anzahl von Dateien schnell zwischen zwei Servern


Ich muss eine große Menge mp3s zwischen zwei Aufschlägen (Ubuntu) übertragen. Mit riesig meine ich ungefähr eine Million Dateien, die im Durchschnitt 300K sind. Ich habe es versucht scp aber es hätte ungefähr eine Woche gedauert. (ca. 500 KB / s) Wenn ich eine einzelne Datei per HTTP übertrage, bekomme ich 9-10 MB / s, aber ich weiß nicht, wie ich sie alle übertragen soll.

Gibt es eine Möglichkeit, sie alle schnell zu übertragen?


81
2018-06-02 19:55


Ursprung


Welche Art von Netzwerk haben Sie zwischen den Servern? Ich habe eine GB-Ethernet-Frequenzweiche zwischen 1 NIC in jedem Gerät verwendet. Ich bin sehr gut durch diese Konfiguration mit SCP - Jim Blizard
Vielleicht möchten Sie untersuchen, warum scp so langsam ist. Es ist möglicherweise langsamer als Dinge wie ftp wegen der Verschlüsselung, aber es sollte nicht so viel langsamer sein. - Zoredache
Ich habe 100 Mbps zwischen ihnen. scp ist langsamer auf den kleinen Dateien (die meisten von ihnen sind klein) - nicudotro


Antworten:


Ich würde Teer empfehlen. Wenn die Dateibäume bereits ähnlich sind, führt rsync aus sehr Gut. Da rsync jedoch mehrere Analysedurchläufe für jede Datei durchführt und dann die Änderungen kopiert, ist dies viel langsamer als tar für die erste Kopie. Dieser Befehl wird wahrscheinlich tun, was Sie wollen. Es kopiert die Dateien zwischen den Rechnern und bewahrt sowohl Berechtigungen als auch Benutzer- / Gruppeneigentümer.

tar -c /path/to/dir | ssh remote_server 'tar -xvf - -C /absolute/path/to/remotedir'

Gemäß dem Kommentar von Mackintosh unten ist dies der Befehl, den Sie für rsync verwenden würden

rsync -avW -e ssh /path/to/dir/ remote_server:/path/to/remotedir

109
2018-06-02 20:04



+1 Die tar-Option ist bei einer großen Anzahl kleiner Dateien wesentlich effizienter, da sowohl scp als auch rsync im Netzwerk viele weitere Rundläufe pro Datei ausführen. - Sekenre
rsync hat für mich besser funktioniert als tar - nicudotro
Wenn Sie über genügend CPU-Kapazität verfügen (an beiden Enden), aber (zumindest) eine langsame Verbindung zwischen den Hosts, ist es möglicherweise sinnvoll, die Komprimierung (gzip oder bzip) im tar-Befehl zu aktivieren. - Vatine
@Jamie: Wenn Sie ssh-agent verwenden, sollte es verwendet werden. Andernfalls geben Sie mit der Option '-i' an, wo der private Schlüssel gefunden werden soll. Details finden Sie auf der Manpage. - Scott Pack
@niXar Die ~ Escape-Zeichen sind nur aktiviert, wenn SSH ein Terminal verwendet. Dies ist nicht der Fall, wenn Sie einen Remote-Befehl angeben (es sei denn, Sie übergeben den Befehl -t Möglichkeit). Deine Sorge ist also ungültig. - Gilles


Externe Festplatte und Lieferung am selben Tag


32
2018-06-02 20:00



Heh heh ... keine Netzwerktechnologie übertrifft die Bandbreite eines mit Bändern beladenen Kombis, der 90 MPH leistet, oder? (Kichern) Ich nahm an, dass er in einem LAN war, weil er sagte, dass er mit HTTP 9-10 MB / Sek. - Evan Anderson
Ich bekomme diese Art von Geschwindigkeit über das Internet, aber ich habe Glück, wo ich wohne! Wenn es in einem LAN ist, dann billiger! - Adam
Ahh-- hat deinen Standort nicht angesehen. Ja-- Ich habe gehört, dass die Internetverbindung in Korea ziemlich spektakulär ist. Stuck hier in den USA, ich bin glücklich, 900KB / sec über das Netz zu bekommen ... - Evan Anderson
Ja, aber Sie können leckere Burritos bekommen, während Sie auf einen Download warten, und es gibt nur ungefähr drei halbwegs anständige mexikanische Restaurants, sogar in Seoul ... - Adam


Ich würde rsync verwenden.

Wenn Sie sie über HTTP mit verfügbaren Verzeichnislisten exportiert haben, können Sie auch wget und das Argument --mirror verwenden.

Sie sehen bereits, dass HTTP schneller als SCP ist, da SCP alles verschlüsselt (und somit Engpässe auf der CPU). HTTP und rsync werden sich schneller bewegen, weil sie nicht verschlüsseln.

Hier sind einige Dokumente zum Einrichten von rsync unter Ubuntu: https://help.ubuntu.com/community/rsync

Diese Dokumente sprechen über Tunneling rsync über SSH, aber wenn Sie nur Daten in einem privaten LAN bewegen, brauchen Sie SSH nicht. (Ich nehme an, Sie sind in einem privaten LAN. Wenn Sie 9-10 MB / Sek über das Internet bekommen, dann möchte ich wissen, welche Art von Verbindungen Sie haben!)

Hier sind einige andere sehr einfache Dokumente, mit denen Sie einen relativen unsicheren rsync-Server einrichten können (ohne SSH-Abhängigkeit): http://transamrit.net/docs/rsync/


16
2018-06-02 19:57



Während SCP tatsächlich einige CPUs zum Verschlüsseln der Daten verwendet, glaube ich nicht, dass er eine 100% ige CPU-Auslastung hat, so dass die CPU kein Flaschenhals ist. Ich habe zu oft bemerkt, dass SCP ineffizient ist, wenn es um schnelle Transfers geht. - Cristian Ciupitu
Angesichts der Tatsache, dass er 300K für SCP und 9MB für HTTP sah, ging ich davon aus, dass ein SCP-bedingter Engpass (normalerweise CPU) ins Spiel kommen würde. Es könnte aber auch etwas anderes sein. Ohne die Hardware-Spezifikationen der betreffenden Maschinen zu kennen, ist es schwer zu sagen. - Evan Anderson
rsync wird fast sicher ssh für den Transport verwenden, da dies das Standardverhalten ist, so dass jeder Overhead, der durch die Verschlüsselung in scp verursacht wird, auch in rsync vorhanden ist - Daniel Lawson
"Sie sehen bereits, dass HTTP schneller ist als SCP, weil SCP alles verschlüsselt" → FALSCH. Wenn er keine 10 Jahre alten Server hat, ist er für diese Aufgabe nicht an die CPU gebunden. - niXar
@ RamazanPOLAT - Sie haben eine Befehlszeile, die zu lang ist. Geben Sie die Dateiauswahl anders an und es funktioniert für Sie. In der Regel können Sie am Ende nur das Quellverzeichnis ohne Platzhalter angeben. Sie können auch die --include und --exclude Argumente, um nuancierter zu werden. - Evan Anderson


Ohne viel Diskussion verwenden Sie netcat, Netzwerk swissarmy Messer. Kein Protokoll-Overhead, Sie kopieren direkt in den Netzwerk-Socket. Beispiel

srv1$ tar cfv - *mp3 | nc -w1 remote.server.net 4321

srv2$ nc -l -p 4321 |tar xfv -

14
2018-06-02 20:17



Leider ist Netcat aus dem, was mir aufgefallen ist, sehr ineffizient, auch wenn es nicht sein sollte. - Cristian Ciupitu
Ich verurteile dich, weil das wirklich, wirklich schrecklicher Rat ist. Es gibt eine richtige Antwort: rsync. Ich könnte alle Gründe aufzählen, warum es besser ist, aber es würde nicht auf diese Seite passen, geschweige denn diese kleine Kommentarbox. - niXar
@niXar: Wenn du nur eine Dateiübertragung durchführen willst (keine Notwendigkeit für weitere Synchronisierung), dann ist Tarpipe wirklich alles was du brauchst. - Witiko
@niXar netcat ist in Ordnung, wenn Sie dies in einer sicheren Umgebung wie private vlan und / oder über VPN tun. - Lester Cheung


Mit vielen Dateien, wenn Sie mit rsync gehen, Ich würde versuchen, Version 3 oder höher an beiden Enden zu bekommen. Der Grund dafür ist, dass eine niedrigere Version jede Datei vor dem Start der Übertragung aufzählt. Die neue Funktion wird aufgerufen inkrementelle Rekursion.

Ein neuer inkrementeller Rekursionsalgorithmus   wird jetzt verwendet, wenn rsync spricht         zu einer anderen Version 3.x. Dies startet den Transfer schneller         (bevor alle Dateien gefunden wurden), und benötigt viel weniger Speicher.         Beachten Sie die Option --recursive in der Hilfeseite für einige Einschränkungen.


8
2018-06-02 20:41





rsync, wie andere bereits empfohlen haben. Wenn der CPU-Overhead aus der Verschlüsselung ein Flaschenhals ist, verwenden Sie einen anderen, weniger CPU-intensiven Algorithmus wie blowfish. Z.B. so etwas wie

rsync -ax -e 'ssh -c blowfish' /local/path user@host:/remote/path


7
2018-06-02 20:56



+1 für Punkt über das Ändern der Chiffre - Daniel Lawson
Die CPU wird kein Flaschenhals sein, es sei denn, Sie haben 10G Ethernet und eine 10 Jahre alte CPU. - niXar
nur kommentieren: cipher "-c arcfour" ist schneller. - Arman
@niXar: Aber wenn Sie bereits eine CPU-intensive Aufgabe auf Ihrem Rechner haben, ist das ein Problem. - Isaac


Beim Kopieren einer großen Anzahl von Dateien stellte ich fest, dass Tools wie tar und rsync aufgrund des Aufwands beim Öffnen und Schließen vieler Dateien ineffizienter sind, als sie sein müssten. Ich habe ein Open-Source-Tool namens Fast-Archiver geschrieben, das für diese Szenarien schneller ist als tar: https://github.com/replicon/fast-archiver; Es funktioniert schneller, indem mehrere gleichzeitige Dateivorgänge ausgeführt werden.

Hier ist ein Beispiel für Fast-Archiver vs. tar auf einem Backup von mehr als zwei Millionen Dateien; Fast Archiver benötigt 27 Minuten für die Archivierung, während Tear 1 Stunde und 23 Minuten dauert.

$ time fast-archiver -c -o /dev/null /db/data
skipping symbolic link /db/data/pg_xlog
1008.92user 663.00system 27:38.27elapsed 100%CPU (0avgtext+0avgdata 24352maxresident)k
0inputs+0outputs (0major+1732minor)pagefaults 0swaps

$ time tar -cf - /db/data | cat > /dev/null
tar: Removing leading `/' from member names
tar: /db/data/base/16408/12445.2: file changed as we read it
tar: /db/data/base/16408/12464: file changed as we read it
32.68user 375.19system 1:23:23elapsed 8%CPU (0avgtext+0avgdata 81744maxresident)k
0inputs+0outputs (0major+5163minor)pagefaults 0swaps

Um Dateien zwischen Servern zu übertragen, können Sie fastarchiver mit ssh wie folgt verwenden:

ssh postgres@10.32.32.32 "cd /db; fast-archive -c data --exclude=data/\*.pid" | fast-archiver -x

4
2017-08-26 20:51





Beim Verschieben von 80 TB Daten (Millionen von winzigen Dateien) gestern, Wechsel von rsync zu tar  erwies sich als viel schnellerals wir aufhörten zu versuchen

# slow
rsync -av --progress /mnt/backups/section01/ /mnt/destination01/section01

und wechselte zu tar stattdessen...

# fast
cd /mnt/backups/
tar -cf - section01 | tar -xf - -C /mnt/destination01/ 

Da sich diese Server im selben LAN befinden, ist das Ziel NFS-mounted auf dem Quellsystem, das den Push ausführt. Nein mach es noch schneller, wir haben uns entschieden das nicht zu konservieren atime von Dateien:

mount -o remount,noatime /mnt/backups
mount -o remount,noatime /mnt/destination01

Die folgende Grafik zeigt den Unterschied, den die Änderung von rsync zu tar macht. Es war mein Chefs Idee und mein Kollege beide haben es ausgeführt und das Große gemacht schreibe auf seinem Blog. ich mag nur schöne Bilder. :)

rsync_vs_tar


3
2018-04-04 10:32



Ein Hacker, dem ich vertraue, sagt mir, "tar over tc statt nfs könnte sogar schneller sein". d.h. tar cf - directory | ttcp -t dest_machine von ftp.arl.mil/mike/ttcp.html - Philip Durbin
Unverknüpfte Frage, aber woher kommt dieser Graph? - CyberJacob


Ich benutze den Teer durch netcat Ansatz auch, außer ich bevorzuge zu verwenden socat - viel mehr Power für Ihre Situation zu optimieren - zum Beispiel, indem Sie mss optimieren. (Lachen Sie auch, wenn Sie wollen, aber ich finde socat Argumente leichter zu merken, weil sie konsistent sind). Für mich ist das in letzter Zeit sehr üblich, da ich die Dinge auf neue Server verlagert habe:

host1$ tar cvf - filespec | socat stdin tcp4:host2:portnum

host2$ socat tcp4-listen:portnum stdout | tar xvpf -

Aliase sind optional.


3
2018-06-03 06:38





Eine andere Alternative ist Einklang. Kann in diesem Fall etwas effizienter als Rsync sein, und es ist etwas einfacher, einen Listener einzurichten.


2
2018-06-02 20:00