Kopieren großer Dateien zwischen zwei Remotecomputern - Effizient

7

Ich habe ein Shell-Skript, das weiterhin große Dateien (2 GB bis 5 GB) zwischen Remote-Systemen kopiert. Die schlüsselbasierte Authentifizierung wird bei der Agentenweiterleitung verwendet und alles funktioniert. Zum Beispiel: Angenommen, das Shell-Skript wird auf Maschine A ausgeführt und kopiert Dateien von Maschine B nach Maschine C.

"scp -Cp -i privater Schlüssel ssh_user @ Quell-IP: Quellpfad ssh_user @ Ziel-IP: Zielpfad"

Jetzt ist das Problem, dass der Prozess sshd kontinuierlich viel CPU beansprucht.
Zum Beispiel: top -c auf dem Zielcomputer (dh Computer-C) wird angezeigt

  PID BENUTZER PR NI VIRT RES SHR S% CPU% MEM ZEIT + BEFEHL                                                                         
14580 ssh_user 20 0 99336 3064 772 R 85,8 0,0 0: 05,39 sshd: ssh_user @ notty                                                            
14581 ssh_user 20 0 55164 1984 1460 S 6.0 0.0 0: 00.51 scp -p -d -t / home / binär / instanzen / instanz-1 / benutzer-2993 /

Dies führt zu einem hohen Lastdurchschnitt.

Ich glaube, dass scp so viel CPU benötigt, weil es Daten verschlüsselt / entschlüsselt. Aber ich brauche nicht verschlüsselte Datenübertragung als auch Maschine-B und Maschine-C ist in einem LAN.

Welche anderen Optionen habe ich? Ich dachte über 'rsync' nach. Aber die rsync-Manpage sagt:

ALLGEMEINES
       Rsync kopiert Dateien entweder auf oder von einem Remote-Host oder lokal auf dem aktuellen Host (das Kopieren von Dateien zwischen zwei wird nicht unterstützt
       Remote-Hosts).

Edit 1: Ich benutze bereits ssh cipher = arcfour128. Kleine Verbesserung, aber das löst mein Problem nicht.

Bearbeiten 2: Auf den Computern werden andere Binärdateien (meine Hauptanwendung) ausgeführt, und ein hoher Lastdurchschnitt führt zu einer schlechten Leistung.

Varun
quelle
3
"rsync unterstützt das Kopieren von Daten zwischen Remotecomputern nicht" - ähm ... warum denken Sie das? das ist genau das, was die meisten Leute benutzen es für
Chopper3
1
@ Chopper3: IIRC, rsync unterstützt seine sehr ungewöhnliche Methode zum Kopieren mit zwei Remotecomputern nicht. Entweder Quelle oder Ziel müssen lokal sein.
Sven
@Varun: Wenn die Dateien nicht schnell kopiert werden müssen, können Sie -l limitdie Übertragungsgeschwindigkeit mit der Option begrenzen. Dies sollte auch die CPU-Auslastung verringern.
Khaled
Dies ist ohnehin irrelevant, da das übliche Transport-Backend von rsyncssh ist, genau wie bei scp.
Sven
1
@ Chopper3: Die 'rsync'-Manpage sagt das :)
Varun

Antworten:

11

Dieses Problem kann mit gelöst werden rsync. Zumindest sollte diese Lösung hinsichtlich der Leistung wettbewerbsfähig sein.

Erstens rsynckann von einem der entfernten Systeme aufgerufen werden, um die Einschränkung der Unfähigkeit zu überwinden, direkt zwischen zwei entfernten Systemen zu kopieren.

Zweitens kann die Verschlüsselung / Entschlüsselung vermieden werden, indem rsyncim Daemon Access-Modus anstelle des Remote Shell Access-Modus ausgeführt wird.

Im Daemon-Zugriffsmodus rsyncwird der Datenverkehr nicht über eine SSH-Verbindung getunnelt. Stattdessen verwendet es ein eigenes Protokoll zusätzlich zu TCP.

Normalerweise führen Sie den rsync-Daemon von inet.d oder eigenständig aus. Dies erfordert jedoch Root-Zugriff auf eines der Remote-Systeme. Vorausgesetzt, der Root-Zugriff ist nicht verfügbar, kann der Daemon weiterhin gestartet werden.

Starten Sie den rsyncDaemon als nicht privilegierten Benutzer auf dem Zielcomputer

ssh -i private_key ssh_user@destination-IP \
       "echo -e 'pid file = /tmp/rsyncd.pid\nport = 1873' > /tmp/rsyncd.conf

ssh -i private_key ssh_user@destination-IP \
       rsync --config=/tmp/rsyncd.conf --daemon

Kopieren Sie die Dateien tatsächlich

ssh -i private_key ssh_user@source_ip \
       "rsync [OPTIONS] source-path \
              rsync://ssh_user@destination-IP:1873:destination-path"
Dmitri Chubarov
quelle
Ich wähle dies als richtige Antwort. Die von @mulaz bereitgestellte 'netcat'-Lösung ist ebenfalls gut, aber rsync bietet viel mehr Optionen wie das Beibehalten von Berechtigungen, Zeitstempeln usw. Vielen Dank.
Varun
8

Die am wenigsten überschattete Lösung wäre die Verwendung von Netcat:

destination$ nc -l -p 12345 > /path/destinationfile
source$ cat /path/sourcfile | nc desti.nation.ip.address 12345

(Einige Netcat-Versionen benötigen das "-p" -Flag für den Port nicht.)

Dazu werden lediglich die unverschlüsselten Daten, die nicht authentifiziert sind, über das Netzwerk von einem PC zum anderen gesendet. Natürlich ist es nicht die "bequemste" Art, dies zu tun.

Andere Alternativen wären der Versuch, die SSH-Verschlüsselung (ssh -c) zu ändern, oder die Verwendung von FTP.

PS: rsync funktioniert gut mit Remote-Maschinen, wird aber meistens in Kombination mit ssh verwendet, daher hier keine Beschleunigung.

Mulaz
quelle
3

Wenn die Verschlüsselung kein Problem darstellt, aktivieren Sie einen NFS-Dämon Cund stellen Sie das Verzeichnis bereit B. Verwenden Sie rsync run on B, geben Sie jedoch die lokalen Verzeichnispfade an.

Ignorieren Sie Aeinfach ssh user@B rsync...den Befehl , bevor Sie den Anwendungsfall für die Einbeziehung ignorieren .

Überträgt Daten ohne Verschlüsselungsaufwand und überträgt nur die verschiedenen Dateien.

Außerdem wurde FTP mit Server-zu-Server-Übertragungen von Drittanbietern als Protokollfunktion erstellt.

Jeff Ferland
quelle
1

Sie können eine Methode mit geringer Verschlüsselung verwenden: Sie können rsync --rsh="ssh -c arcfour"die Geschwindigkeit erhöhen. Ich habe meine Tests, ich warte auf Festplatten und nicht mehr auf die Netzwerkverbindung. Und benutze rsync, es ist gut!

Dom
quelle
0

Probieren Sie es gemeinsam aus. Ist die beste Option zum Synchronisieren von Dateien.

jordiv
quelle
0

Vielleicht finden Sie http://rightsock.com/~kjw/Ramblings/tar_v_cpio.html so interessant.

Es parallelisiert Datenübertragungen zwischen zwei Hosts. Achten Sie besonders auf Punkt nr. 5, und passen Sie sich entsprechend Ihren Bedürfnissen an.

Luis
quelle
0

Ich weiß, das würde ein bisschen Arbeit erfordern , aber würde DRDB für Sie funktionieren? Es ist wie bei einem netzwerkbasierten RAID, und es ist viel einfacher, zwei Server synchron zu halten, wenn der Fall Ihrem ähnlich ist, zumindest wenn Sie nur Server A zum Kopieren auf Server B und nicht immer auch von B nach A benötigen.

Janne Pikkarainen
quelle