Frage Der schnellste Weg, um 55 GB Bilder auf einen neuen Server zu übertragen


Ich habe derzeit zwei CentOS-Server. Ich muss wissen, wie und was der schnellste Weg wäre, das Bilderverzeichnis zu "tarnen" und SCP es über?

Ist das der schnellste Weg, den ich gerade vorgeschlagen habe, weil das Tarieren ewig dauert ... Ich habe den Befehl ausgeführt:

tar cvf imagesbackup.tar images

Und ich würde es einfach überlesen.

Lass mich wissen, ob es einen schnelleren Weg gibt. Ich habe Remote- / SSH-Zugriff auf beide Maschinen.


61
2017-12-02 12:39


Ursprung


Sneaknet? - Nick T
Sehen unix.stackexchange.com/questions/227951/ ... - rogerdpack


Antworten:


Anstatt tar zu verwenden, um auf Ihre lokale Festplatte zu schreiben, können Sie mit ssh direkt über das Netzwerk auf den Remote-Server schreiben.

server1$ tar -zc ./path | ssh server2 "cat > ~/file.tar.gz"

Jede Zeichenfolge, die Ihrem "ssh" -Befehl folgt, wird auf dem Remote-Server anstelle der interaktiven Anmeldung ausgeführt. Sie können Eingabe / Ausgabe zu und von diesen Remote-Befehlen über SSH leiten, als wären sie lokal. Wenn Sie den Befehl in Anführungszeichen setzen, vermeiden Sie Verwirrung, insbesondere bei der Umleitung.

Oder Sie können die TAR-Datei direkt auf dem anderen Server extrahieren:

server1$ tar -zc ./path | ssh server2 "tar -zx -C /destination"

Beachten Sie die selten verwendeten -C Möglichkeit. Es bedeutet "Wechsel zu diesem Verzeichnis zuerst, bevor Sie etwas tun."

Oder vielleicht möchten Sie vom Zielserver "ziehen":

server2$ tar -zx -C /destination < <(ssh server2 "tar -zc -C /srcdir ./path")

Notiere dass der  <(cmd)  construct ist neu in bash und funktioniert nicht auf älteren Systemen. Es führt ein Programm aus und sendet die Ausgabe an eine Pipe und ersetzt diese Pipe in den Befehl, als wäre es eine Datei.

Ich hätte das obige einfach so schreiben können:

server2$ tar -zx -C /destination -f <(ssh server2 "tar -zc -C /srcdir ./path")

Oder wie folgt:

server2$ ssh server2 "tar -zc -C /srcdir ./path" | tar -zx -C /destination

Oder Sie können sich etwas Leid ersparen und einfach rsync verwenden:

server1$ rsync -az ./path server2:/destination/

Denken Sie daran, dass durch das Komprimieren der Daten vor der Übertragung die Bandbreite verringert wird. Bei einer sehr schnellen Verbindung kann die Operation jedoch tatsächlich ausgeführt werden mehr Zeit. Dies liegt daran, dass Ihr Computer möglicherweise nicht schnell genug komprimiert werden kann, um Schritt zu halten: if komprimieren 100 MB dauert länger als es dauern würde senden 100MB, dann ist es schneller, es unkomprimiert zu senden.

Alternativ können Sie in Betracht ziehen, sich selbst zu gzip zu pipen (anstatt die Option -z zu verwenden), damit Sie eine Komprimierungsstufe angeben können. Meine Erfahrung ist, dass bei schnellen Netzwerkverbindungen mit komprimierbaren Daten die Verwendung von gzip auf Level 2 oder 3 (der Standardwert ist 6) den besten Gesamtdurchsatz in den meisten Fällen ergibt. Wie so:

server1$ tar -c ./path | gzip -2 | ssh server2 "cat > ~/file.tar.gz"

90
2017-12-03 10:44



Rsync hat wunderbar funktioniert - komprimiert im laufenden Betrieb, kopiert ganze Ordner, geht auf defekten Link zurück. Alles in einem einfachen Befehl. Liebe es. Dies sind die Optionen, die ich nützlich fand: z: komprimiere r: recurse = kopiere den Unterordner v: verbose. Beispiel für mein Rsync-Kommando: rsync -azvr / src-pfad / benutzername @ dest_server: / dest / pfad / - Bastion


Ich wäre versucht, rsync es über mich selbst - es macht Komprimierung und behandelt Link Verlust gut.


67
2017-12-02 12:47



rsync ist genau das richtige Werkzeug. - Rich
+1 - Ja rsync! - Evan Anderson
+1, nur um anzuhäufen. Außerdem mag ich Rsync sehr. - Steven Monday
Aber wenn Sie rsync verwenden, müssen Sie die Daten trotzdem manuell komprimieren (wenn Sie Ihre Daten komprimiert speichern möchten) - wlk
Wie können Sie die komprimierten Dateien mit rsync speichern? - Dolan Antenucci


Wenn man sie nur tariert und nichts anderes, wird das Tonnen von Zeit mit nur minimalem Geschwindigkeitsgewinn verschwenden.

Das Tarieren der Dateien mit den cvf-Switches kostet also effektiv die Zeit, die zum Lesen aller 55-GB-Bilder und zum Zurückschreiben auf die Festplatte benötigt wird. (Effektiv wird es noch mehr Zeit verschwendet, da es einen beträchtlichen Overhead geben wird).

Es gibt nur einen Vorteil, den Sie hier haben, der Aufwand für das Hochladen vieler Dateien wird reduziert. Sie können schnellere Übertragungszeiten erhalten, wenn Sie die Bilder komprimieren (aber da ich glaube, dass sie bereits in einem komprimierten Format vorliegen, wird dies nicht viel helfen). Nur mehr Rechenzeitverschwendung.

Der größte Nachteil bei der Übertragung eines riesigen Tear-Archivs über Kabel ist, dass wenn etwas schief geht, es bedeuten kann, dass du von vorne anfangen musst.

Ich würde es so benutzen:

md5sum /images/* > md5sum.txt
scp -r images/* user@host:/images/

Auf dem neuen Server

md5sum /images/* > md5sum_new.txt

Und dann einfach diff. Und da scp die Komprimierung im laufenden Betrieb unterstützt, sind keine separaten Archive erforderlich.

Bearbeiten

Ich werde die MD5-Informationen behalten, da sie für das OP nützlich waren. Aber ein Kommentar traf mich mit neuen Einsichten. Ein bisschen Suche lieferte also diese nützliche Information. Bitte beachten Sie, dass das Thema hier SFTP nicht direkt SCP ist.

Im Gegensatz zu FTP fügt SFTP der Übertragung von Dateien zusätzlichen Aufwand hinzu. Wenn eine Datei zwischen Client und Server übertragen wird, wird sie in kleinere Blöcke unterteilt, die als "Pakete" bezeichnet werden. Angenommen, jedes Paket ist 32 KB groß. Das SFTP-Protokoll führt eine Prüfsumme für jede 32 KB-Datei aus, während es gesendet wird, und schließt diese Prüfsumme zusammen mit diesem Paket ein. Der Empfänger empfängt das Paket und entschlüsselt die Daten und überprüft dann die Prüfsumme. Die Prüfsumme selbst ist "stärker" als die CRC32 Prüfsumme. (Da SFTP eine 128-Bit- oder höhere Prüfsumme verwendet, wie z. B. MD5 oder SHA, und weil dies für jedes einzelne Paket ausgeführt wird, gibt es eine sehr granulare Integritätsprüfung, die als Teil der Übertragung durchgeführt wird.) Also das Protokoll selbst ist langsamer (wegen des zusätzlichen Overhead), aber der erfolgreiche Abschluss einer Übertragung bedeutet de facto, dass es integral übertragen wurde und es keine Notwendigkeit für eine zusätzliche Überprüfung gibt.


12
2017-12-02 12:47



Vielen Dank, was macht die md5sum? und was ist diff? Danke, spiel jetzt! - Andrew Fashion
md5sum (oder md5) benötigt eine Prüfsumme der Dateien. Diff sucht nach Unterschieden in den Dateien (man diff). Die Prüfsumme erzeugt eine Zeichenkette, einen Hash, wenn die Datei während der Übertragung geändert wird ... ein umgedrehtes Bit, ein Fehler ... wird nicht übereinstimmen, wenn Sie es auf der anderen Seite wieder aufnehmen. Bei großen Dateien erhöht sich die Wahrscheinlichkeit von Fehlern. Wenn Sie Websites sehen, auf denen Sie .iso-Dateien herunterladen können, verfügen sie daher häufig über eine MD5-Prüfsumme, mit der Sie Ihre heruntergeladene Datei vergleichen können, um sicherzustellen, dass sie übereinstimmt und nicht beschädigt ist. - Bart Silverstrim
Oh wow, das habe ich nie gewusst. Vielen Dank! - Andrew Fashion
scp ist verschlüsselt und garantiert Integrität über die Leitung. Es besteht immer noch eine geringe Chance, dass die Daten im Speicher oder auf der Festplatte natürlich beschädigt sind, aber das ist ziemlich selten. - EvilRyry
Spielt der Overhead von SFTP-Checksummen tatsächlich eine Rolle? Das kann ich mir nicht vorstellen. 4 Bytes pro 32768 klingen nicht signifikant. Das sind 128 kB pro GB. Wenn man das "langsamer" nennt, erscheint es als eine Übertreibung in allem außer einem langweiligen theoretischen Sinn. - underscore_d


Zusätzlich zu Paceys md5sum-Vorschlag würde ich Folgendes verwenden:

Auf dem Ziel: nc -w5 -l -p 4567 | tar -xvf -

Dann auf der Quelle: tar -cvf - /path/to/source/ | nc -w5 destinationserver 4567

Es ist immer noch ein tar / untar, und es gibt keine Verschlüsselung, aber es ist direkt auf den anderen Server. Beginne beide im Tandem (-w5 gibt dir 5 Sekunden Gnade.) und beobachte es. Wenn die Bandbreite knapp ist, fügen Sie an beiden Enden -z dem Teer hinzu.


8
2017-12-02 13:42



Ich denke, es ist umgekehrt, zuerst muss er am Ziel ausführen (um den Socket zu öffnen) und dann an der Quelle (um zu versenden) - Dimitrios Mistriotis
anstelle von Zielserver, stelle ich einfach root@1.1.1.1? - Andrew Fashion
Nein, nur die IP. netcat verwendet kein anderes Protokoll als TCP :) Dieser Befehl ist auch der schnellste aller oben angegebenen Befehle. Es gibt genau einen Lesevorgang pro Datei auf der Quelle, den genauen minimalen Netzwerkverkehr zum Übertragen der Dateien und genau einen Schreibvorgang pro Datei am Ziel. Wenn Sie freie CPU-Zyklen haben, wird das Hinzufügen des Flags -z (für die Komprimierung) es weiter beschleunigen, da weniger Netzwerkdaten übertragen werden müssen. - Jeff McJunkin
@ user36845 - Wahr. Ich unterstellte nicht eine Chronologie mit der obigen Reihenfolge, aber Sie haben Recht, die Steckdose muss zuerst geöffnet werden. Ich werde es bearbeiten, um zu klären. :) - SmallClanger
Ich bin mir nicht sicher, warum ssh / scp 125MB / s bis 133MB / s erreicht hat, aber Netcat kann diese Daten mit ~ 380MB / s einfach weiterleiten (gleicher Link) - ThorSummoner


Ein Punkt - nicht alle Hosts haben rsync und möglicherweise Hosts haben möglicherweise verschiedene Versionen von tar. Aus diesem Grund könnte man als erste Anlaufstelle das oft vernachlässigte cpio empfehlen.

Sie können cpio über ssh ausführen, um Ad-hoc-Replikationen von Datei- / Verzeichnisstrukturen zwischen Hosts durchzuführen. Auf diese Weise haben Sie eine bessere Kontrolle darüber, was über das Sehen gesendet wird, da Sie cpio, nom-nom, "füttern" müssen. Es ist auch mehr Argument tragbar, cpio ändert sich nicht viel - das ist ein wichtiger Punkt, wenn Sie sich um mehrere Hosts in einer heterogenen Umgebung kümmern.

Beispiel Kopieren / Exportieren / Home und Unterverzeichnisse zum Remote-Host:

cd /export/ find . home -print | cpio -oaV | ssh 10.10.10.10 'cd /export/home; cpio -imVd'

Das obige würde den Inhalt von / export / home und alle Unterverzeichnisse nach / export / home auf dem entfernten Host kopieren.

Hoffe das hilft.


1
2017-12-02 14:54



Er hat erwähnt, dass es zwei CentOS-Boxen waren, also würden sie rsync- und dateikompatible Versionen von tar haben. Tools wie rsync wurden erstellt, um Tools wie cpio zu ersetzen :). Sie können nicht mit cpio "fortsetzen", zumindest ohne zu wissen, wo genau Sie beginnen möchten und filtern Sie Ihren Fund als geeignet. Was ist ein unnötiger Zeitaufwand. Nachdem das gesagt wurde, nützliche Informationen für "alte" UNIX-Boxen :) - Rafiq Maniar
Ja, dieser Kitt hat mich verloren, haha - Andrew Fashion


Ich habe ssh Zugriff, Sie haben rsync Zugriff.

rsync -av -e ssh /storage/images/ user@[ip or domain name]:/storage/images/

oder

rsync -av -e "ssh -l user" /storage/images/ [ip or domain name]:/storage/images/

Wenn Sie einen Fehler wie "rsync error: einige Dateien konnten nicht übertragen werden (Code 23) auf main.c (977) [sender = 2.6.9]" erhalten, überprüfen Sie Ihre Benutzer und Gruppen zwischen den Servern; Sie haben möglicherweise eine Diskrepanz.

Verwenden Sie die Option rsync "-z", wenn rsync die Übertragung komprimieren soll. Diese Option verwendet mehr CPU, aber weniger Bandbreite, beachten Sie dies.

Es gibt eine "--progress" -Option, die Ihnen einen Prozentsatz übertragen wird, was nett ist, wenn Sie solche Dinge mögen.


1
2017-12-03 22:01





Sind sie in einem gemeinsamen Netzwerk, anstatt das Internet für die Übertragung von Dateien zu benötigen? NFS oder FTP ist möglicherweise viel schneller als der Aufwand von SCP, obwohl Sie die Verschlüsselung während der Übertragung verlieren würden.


0
2017-12-02 13:20



verschiedene Server an entfernten Standorten - Andrew Fashion