Kopieren Sie große Dateien von einem Linux-Server auf einen anderen

20

Ich versuche, einen 75-Gigabyte-Gigabyte-Gigabyte-Gigabyte-Gigabyte-Gigabyte-Gigabyte-Gigabyte-Gigabyte-Gigabyte (mysql lvm snapshot) von einem Linux-Server in unserem Rechenzentrum in LA auf einen anderen Linux-Server in unserem Rechenzentrum in New York über eine 10-MB-Verbindung zu kopieren.

Ich erhalte ungefähr 20-30Kb / s mit rsync oder scp, das zwischen 200-300 Stunden schwankt.

Im Moment ist es eine relativ leise Verbindung, da das zweite Rechenzentrum noch nicht aktiv ist und ich durch kleine Dateiübertragungen hervorragende Geschwindigkeiten erzielt habe.

Ich habe verschiedene TCP-Tuning-Anleitungen befolgt, die ich vergeblich über Google gefunden habe (vielleicht lese ich die falschen Anleitungen, habe eine gute?).

Ich habe den tar + netcat-Tunneltipp gesehen, aber ich verstehe, dass er nur für VIELE kleine Dateien geeignet ist und Sie nicht aktualisiert, wenn die Übertragung der Datei effektiv abgeschlossen ist.

Hat jemand eine gute Eingabe, bevor ich eine Festplatte versende?

UPDATE: Naja ... es könnte der Link sein :( Siehe meine Tests unten ...

Transfers von NY nach LA:

Eine leere Datei abrufen.

[nathan@laobnas test]$ dd if=/dev/zero of=FROM_LA_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.412 seconds, 164 MB/s
[nathan@laobnas test]$ scp -C obnas:/obbkup/test/FROM_NY_TEST .
FROM_NY_TEST                                    3%  146MB   9.4MB/s   07:52 ETA

Den Snapshot-Tarball abrufen.

[nathan@obnas db_backup]$ ls -la db_dump.08120922.tar.gz
-rw-r--r-- 1 root root 30428904033 Aug 12 22:42 db_dump.08120922.tar.gz

[nathan@laobnas test]$ scp -C obnas:/obbkup/db_backup/db_dump.08120922.tar.gz .
db_dump.08120922.tar.gz            0%   56MB 574.3KB/s 14:20:40 ET

Transfers von LA nach NY:

Eine leere Datei abrufen.

[nathan@obnas test]$ dd if=/dev/zero of=FROM_NY_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.2501 seconds, 165 MB/s
[nathan@obnas test]$ scp -C laobnas:/obbkup/test/FROM_LA_TEST .
FROM_LA_TEST                                    0% 6008KB 497.1KB/s 2:37:22 ETA

Schnappschuss abrufen.

[nathan@laobnas db_backup]$ ls -la db_dump_08120901.tar.gz
-rw-r--r-- 1 root root 31090827509 Aug 12 21:21 db_dump_08120901.tar.gz

[nathan@obnas test]$ scp -C laobnas:/obbkup/db_backup/db_dump_08120901.tar.gz .
db_dump_08120901.tar.gz                0%  324KB  26.8KB/s 314:11:38 ETA

Ich nehme an, ich werde es mit den Leuten aufnehmen, die unsere Einrichtungen betreiben. Die Verbindung ist als MPLS / Ethernet 10MB-Verbindung gekennzeichnet. (zucken)

Nathan Milford
quelle
Nur ein Kommentar, ich habe kürzlich eine Freigabe von einem Softwarehersteller auf einem Seagate FreeAgent (USB-Datenträger) erhalten, die ungefähr 50 GByte betrug. Das fragliche Unternehmen hatte eine Webpräsenz und forderte die Kunden normalerweise auf, diese einfach von ihrer Website herunterzuladen. Dachte, dass es eine interessante Lösung war, und dachte, dass dies einige Informationen hinzufügen könnte, um bei Ihrer Entscheidung zu helfen.
mdpc
Welche Latenz sehen Sie?
Rückzug
Ca. 80 ms über die Verbindung.
Nathan Milford
Ja, jetzt bin ich nur verwirrt und frustriert. Ich habe es in 50-MB-Stücke aufgeteilt und es geht immer noch langsam! Aber andere Daten zu synchronisieren bringt 500kb / s ... da muss etwas furchtbar falsch sein, ehre ich vermisse ...
Nathan Milford
Untersuchen Sie Ihren Verkehr mit tcpdump. Es kann Ihnen helfen herauszufinden, was die Übertragung verlangsamt.
Lexsys

Antworten:

16

Sneakernet jemand?

Angenommen, es handelt sich um eine einmalige Kopie, ist es nicht möglich, die Datei einfach auf eine CD (oder ein anderes Medium) zu kopieren und über Nacht an den Zielort zu bringen.

Dies ist möglicherweise die schnellste Option, da eine Dateiübertragung dieser Größe über diese Verbindung möglicherweise nicht korrekt kopiert wird. In diesem Fall können Sie von vorne beginnen.


rsync

Meine zweite Wahl / mein zweiter Versuch wäre Rsync, da es fehlgeschlagene Übertragungen, teilweise Übertragungen usw. erkennt und dort weitermachen kann, wo es aufgehört hat.

rsync --progress file1 file2 user@remotemachine:/destination/directory

Das Flag --progress gibt Ihnen ein Feedback, anstatt nur dort zu sitzen und sich selbst zu überlassen. :-)


Vuze (Bittorrent)

Die dritte Möglichkeit wäre wahrscheinlich, Vuze als Torrent-Server zu verwenden und Ihren Remote-Standort dann mit einem Standard-Bitorrent-Client herunterladen zu lassen. Ich kenne andere, die dies getan haben, aber Sie wissen schon ... als sie alles in Betrieb genommen haben, etc ... hätte ich die Daten über Nacht haben können ...

Kommt auf deine Situation an, denke ich.

Viel Glück!


AKTUALISIEREN:

Weißt du, ich habe ein bisschen mehr über dein Problem nachgedacht. Warum muss die Datei ein einziger riesiger Tarball sein? Tar ist perfekt in der Lage, große Dateien in kleinere zu teilen (zum Beispiel, um Medien zu überspannen). Warum also nicht das riesige Archiv in handlichere Teile aufteilen und die Teile stattdessen übertragen?

KPWINC
quelle
3
+1, obwohl in diesem Fall wahrscheinlich nicht wirtschaftlich. Unterschätzen Sie niemals die Bandbreite eines 747 voller Festplatten :)
Chad Huneycutt
2
Ich konnte den Link nicht finden, aber vor ein paar Jahren hat Google die Versandkisten mit Laufwerken untersucht. Wenn Sie eine Kiste mit Laufwerken von insgesamt 500 TB von Punkt A nach Punkt B verschieben können, bedeutet dies auf jede Art und Weise eine hohe Bandbreite
STW
2
Vielleicht beziehen Sie sich auf diesen Artikel: arstechnica.com/science/news/2007/03/…
KPWINC
1
Ja, am Ende habe ich eine Festplatte verschickt. Das eigentliche Problem, so wurde mir gesagt, war die Flusskontrolle an den Schaltern.
Nathan Milford
Bittorrent funktioniert nur dann besser als eine direkte Übertragung, wenn Sie mehrere Sämaschinen haben. Auch wenn OP bt auf mehreren Rechnern installiert, hat er nur eine Verbindung. Und er hat bereits festgestellt, dass mehrere kleine Dateien nicht schneller sind als eine große, was den Finger auf die Netzwerkverbindung richtet.
Xalorous
7

Ich habe das in der Vergangenheit mit einer 60-GB-TBZ2-Datei gemacht. Ich habe das Skript nicht mehr, aber es sollte leicht umzuschreiben sein.

Teilen Sie zuerst Ihre Datei in Stücke von ~ 2 GB auf:

split --bytes=2000000000 your_file.tgz

Berechnen Sie für jedes Teil einen MD5-Hash (dies dient zur Überprüfung der Integrität) und speichern Sie ihn an einem beliebigen Ort. Beginnen Sie dann, die Teile und ihre md5 mit dem Tool Ihrer Wahl (me: netcat-tar-pipe in einem Bildschirm) auf die entfernte Site zu kopieren Session).

Überprüfen Sie nach einer Weile mit dem md5, ob Ihre Stücke in Ordnung sind, dann:

cat your_file* > your_remote_file.tgz

Wenn Sie auch eine MD5 der Originaldatei erstellt haben, überprüfen Sie diese ebenfalls. Wenn es in Ordnung ist, können Sie Ihre Datei entpacken, alles sollte in Ordnung sein.

(Wenn ich die Zeit finde, werde ich das Skript umschreiben)

Edomaur
quelle
5

Normalerweise bin ich ein großer Verfechter von rsync, aber wenn ich zum ersten Mal eine einzelne Datei übertrage, scheint das nicht viel Sinn zu machen. Wenn Sie jedoch die Datei mit nur geringen Unterschieden erneut übertragen würden, wäre rsync der klare Gewinner. Wenn Sie trotzdem rsync verwenden möchten, empfehle ich dringend, ein Ende im --daemonModus auszuführen, um den leistungsbeeinträchtigenden ssh-Tunnel zu beseitigen. Die Manpage beschreibt diesen Modus recht ausführlich.

Meine Empfehlung? FTP oder HTTP mit Servern und Clients, die die Wiederaufnahme unterbrochener Downloads unterstützen. Beide Protokolle sind schnell und unkompliziert, wodurch der ssh-Tunnel-Nachteil vermieden wird. Apache + wget würde schnell schreien.

Der netcat Pipe-Trick würde auch gut funktionieren. Tar ist nicht erforderlich, wenn eine einzelne große Datei übertragen wird. Und der Grund, warum es Sie nicht benachrichtigt, wenn es fertig ist, ist, dass Sie es nicht gesagt haben. Wenn Sie -q0der Serverseite ein Flag hinzufügen, verhält es sich genau so, wie Sie es erwarten würden.

server $ nc -l -p 5000> outfile.tgz

client $ nc -q0 server.example.com 5000 <infile.tgz

Der Nachteil des Netcat-Ansatzes besteht darin, dass Sie den Vorgang nicht fortsetzen können, wenn Ihre Übertragung auf 74 GB in ...

Insyte
quelle
+1 für rsyncd. Ich verwende es tatsächlich für Übertragungen in meinem LAN, da ich im Vergleich zu CIFS oder NFS einen höheren Durchsatz sehe.
Ophidian
1
Während FTP und HTTP die "ssh-Tunnel-Strafe" vermeiden, muss die "Strafe" für das Nichtverschlüsseln der Daten berücksichtigt werden.
J. Money
3

Geben Sie netcat (manchmal auch nc genannt) eine Chance. Das Folgende funktioniert in einem Verzeichnis, aber es sollte einfach genug sein, nur eine Datei zu kopieren.

Auf dem Zielfeld:

netcat -l -p 2342 | tar -C /target/dir -xzf -

Auf der Quellbox:

tar czf * | netcat target_box 2342

Sie können versuchen, die Option 'z' in beiden Befehlen zu entfernen, um die Geschwindigkeit zu erhöhen, da die Datei bereits komprimiert ist.

David
quelle
1

Standard-SCP und Rsync (die SCP verwenden) sind für große Dateien sehr langsam. Ich denke, ich würde versuchen, ein Protokoll mit geringerem Overhead zu verwenden. Haben Sie versucht, einen einfacheren oder gar keinen Verschlüsselungscode zu verwenden? Schauen Sie sich die --rshOption für rsync an, um die Übertragungsmethode zu ändern.

Warum nicht FTP oder HTTP?

cmcginty
quelle
1
Ich habe den alten "Python-m SimpleHTTPServer" von CommandlineFU auf der Quelle und wget'd die Datei auf dem Ziel. Ich erhalte immer noch "18.5K / s eta 15d 3h"
Nathan Milford
1

Obwohl dies die Situation ein wenig überfordert, ist BitTorrent eine wirklich gute Lösung für die Übertragung großer Dateien. BitTorrent hat viele nette Funktionen wie das native Chunking einer Datei und das Checksumming jedes Chunks, das bei Beschädigung erneut übertragen werden kann.

Ein Programm wie Azureus [jetzt bekannt als Vuze] enthält alle Teile, die Sie zum Erstellen, Servern und Herunterladen von Torrents in einer App benötigen. Ich denke, Azureus ist nicht die schlankste Lösung, die für BitTorrent verfügbar ist, und ich denke, es ist auch eine grafische Benutzeroberfläche erforderlich. Es gibt jedoch viele befehlszeilengesteuerte Torrent-Tools für Linux.

DisabledLeopard
quelle
bt geht nur dann schneller als der direkte Transfer, wenn es mehrere Seeds gibt. Er hat eine einzige Quelle. Noch wichtiger ist, dass er ein Single-Source-Netzwerk mit einer schlechten Netzwerkverbindung hat. Sogar das Kopieren der Datei an mehrere Speicherorte vor Ort und das Einrichten von BT mit mehreren Seeds ist aufgrund dieser schlechten Verbindung kontraproduktiv. Wenn Sie mehrere Kopien erstellen und als Startwerte einrichten, wird die Kopierzeit vervielfacht, anstatt sie zu reduzieren. BT ist möglicherweise eine praktikable Lösung, wenn OP versucht, eine große Datei mehreren Empfängern zur Verfügung zu stellen.
Xalorous
0

Nun, persönlich scheinen 20-30Kb / s für einen 10Mb-Link (unter der Annahme von 10Mb und nicht 10Mb) ziemlich niedrig zu sein.

Wenn ich Sie wäre, würde ich eines von zwei Dingen tun (vorausgesetzt, der physische Zugang ist nicht verfügbar) -

In beiden Fällen empfehle ich Ihnen, die große Datei in kleinere Blöcke zu unterteilen, die etwa 500 MB groß sind.

Wenn Sie die kleineren Chunks haben, verwenden Sie entweder wieder rsync oder ich persönlich bevorzuge eine private sichere FTP-Sitzung und dann CRC der Dateien nach Abschluss.

William Hilsum
quelle
0

Ein paar Fragen könnten in den Diskussionen hilfreich sein: Wie kritisch sind die zu übertragenden Daten? Ist dies für Disaster Recovery, Hot Backup, Offline-Speicher oder was? Möchten Sie die Datenbank sichern, während sie hoch oder runter ist? Was ist mit dem Einrichten einer Datenbank auf dem Remote-System und dem Synchronisieren dieser Datenbanken mithilfe von Clustern oder Aktualisierungen über Änderungsprotokolle? Dies kann dazu beitragen, die Datenmenge zu reduzieren, die über den Link übertragen werden muss.

mdpc
quelle
Es ist eine LVM-Momentaufnahme eines anderen MYSQL-Replikats (unserer Haupt-MYSQL-Instanz an anderer Stelle). Einmal übertragen und positioniert, kann die Ziel-MySQL-Instanz einfach den Unterschied zwischen diesem Snapshot (als Delta verwenden) und dem aktuellen Status des Masters aktualisieren. Dass es sich um ein MYSQL-Backup handelt, ist nicht relevant, es ist nur ein großer Datenblock, den ich nur einmal verschieben muss.
Nathan Milford
0

bbcp wird die Datei für Sie zerlegen und mit mehreren Streams kopieren.

Zaur
quelle
0

Späte Antwort für Googler:

Beim Übertragen großer Datenmengen kann mit rsync die Quelle und das Ziel verglichen werden. Anschließend kann mit dem Flag --only-write-batch eine Stapeldatei auf ein lokales Wechselmedium geschrieben werden. Anschließend senden Sie den lokalen Datenträger an den Remote-Speicherort, schließen ihn an und führen rsync erneut aus. Verwenden Sie dazu --read-batch, um die Änderungen in das Remote-Dataset zu übernehmen.

Wenn sich die Quelldateien während des physischen Transports ändern oder das Transportmedium voll ist, können Sie einfach den Befehl --only-write-batch | wiederholen Schiff | --Batch-Lesezyklus, bis das Ziel erreicht ist.

(Ref: Ich war einer der Autoren dieses Features in rsync. Weitere Hintergrundinformationen und Anwendungsfälle finden Sie in der folgenden Diskussion zur Implementierung des Prototyps: https://lists.samba.org/archive/rsync/2005-March/011964 .html )

stevegt
quelle