Tar-Archive ohne lokalen Speicher zwischen Servern streamen
Das Übertragen von Dateien zwischen Servern kann anspruchsvoll sein, besonders wenn der lokale Speicher begrenzt ist. Glücklicherweise können Sie den lokalen Speicher vollständig umgehen, indem Sie tar-Archive mithilfe von SSH-Tunneln direkt zwischen Servern streamen. Diese Methode ist besonders nützlich für Servermigrationen, Backups und die Verwaltung großer Datensätze.
Grundlagen des Tar-Streamings verstehen
Der Befehl tar ist vielseitig und kann Daten direkt über Pipes streamen. Wenn Sie ein
tar-Archiv erstellen, das an anderer Stelle entpackt werden soll, ist es entscheidend, zuerst in das
Quellverzeichnis zu wechseln oder die Option -C für tar cf zu verwenden. Andernfalls enthält das
Archiv den vollständigen Pfad ab dem Wurzelverzeichnis des Quellservers, was auf dem Zielserver in
der Regel nicht erwünscht ist. Die grundlegende Syntax, um Archive mit Pipes korrekt zu erstellen
und zu entpacken, lautet:
tar cf - -C /path/to/source . | tar xf - -C /path/to/destination
Hier erstellt tar cf - -C /path/to/source . ein Archiv des Inhalts von /path/to/source (mit
Pfaden relativ zu diesem Verzeichnis, mithilfe von .) und streamt es nach stdout. Anschließend
liest tar xf - -C /path/to/destination von stdin und entpackt das Archiv nach
/path/to/destination. So wird sichergestellt, dass die Dateien in die vorgesehene
Verzeichnisstruktur entpackt werden.
Direkte Server-zu-Server-Übertragungen mit ssh
Um Dateien direkt zwischen zwei entfernten Servern zu übertragen, kombinieren Sie tar mit SSH:
ssh user@source-server "tar cf - -C /path/to/source ." | ssh user@destination-server "tar xf - -C /path/to/destination"
Dieser Befehl streamt das Archiv direkt vom Quellserver zum Zielserver, ohne Zwischenspeicherung.
Fortgeschrittene Techniken: ssh proxyjump
Wenn Ihre Server hinter einem Bastion-Host stehen, nutzen Sie die Funktion ProxyJump von SSH:
ssh -J user@bastion-host user@source-server "tar cf - -C /path/to/source ." | ssh -J user@bastion-host user@destination-server "tar xf - -C /path/to/destination"
Damit wird Ihr tar-Stream sicher durch den Bastion-Host getunnelt.
Fortschritt mit Pipe Viewer (pv) überwachen
Bei großen Übertragungen ist es hilfreich, den Fortschritt zu überwachen. Verwenden Sie pv, um die Übertragung zu visualisieren:
ssh user@source-server "tar cf - -C /path/to/source ." | pv | ssh user@destination-server "tar xf - -C /path/to/destination"
pv liefert in Echtzeit Rückmeldung zu Übertragungsgeschwindigkeit und Fortschritt.
Streams im laufenden Betrieb verschlüsseln
Um Ihre Daten während der Übertragung zu schützen, verschlüsseln Sie den Stream. In
Produktionsumgebungen ist es in der Regel besser, Schlüsseldateien zu verwenden oder ein Passwort
abzufragen (indem Sie -pass weglassen), statt Passwörter fest im Code zu hinterlegen. Wenn
Sie openssl enc für die symmetrische Verschlüsselung verwenden, sollten Sie für zusätzliche
Sicherheit eine Schlüsselableitungsfunktion wie PBKDF2 einsetzen, die über die Option -pbkdf2 (in
modernen OpenSSL-Versionen verfügbar) aktiviert wird:
# Consider prompting for password or using key files for better security
ssh user@source-server "tar cf - -C /path/to/source . | openssl enc -aes-256-cbc -pbkdf2 -salt -pass pass:yourpassword" | ssh user@destination-server "openssl enc -d -aes-256-cbc -pbkdf2 -pass pass:yourpassword | tar xf - -C /path/to/destination"
Alternativ können Sie gpg zur Verschlüsselung verwenden. Für --recipient können Sie jede gültige
GPG-Schlüsselkennung angeben (etwa eine Schlüssel-ID, einen Fingerabdruck oder eine mit dem
Schlüssel verknüpfte E-Mail-Adresse). Der Empfänger muss den zugehörigen privaten Schlüssel
besitzen, um den Stream zu entschlüsseln.
ssh user@source-server "tar cf - -C /path/to/source . | gpg --encrypt --recipient your-key-identifier" | ssh user@destination-server "gpg --decrypt | tar xf - -C /path/to/destination"
Praxisbeispiel: Migration einer Webanwendung
Stellen Sie sich vor, Sie migrieren eine Webanwendung zwischen Cloud-Anbietern. Sie können das gesamte Anwendungsverzeichnis direkt streamen:
ssh user@old-server "tar cf - -C /var/www/html ." | pv | ssh user@new-server "tar xf - -C /var/www/html"
Dieser Ansatz minimiert Ausfallzeiten und sorgt für einen reibungslosen Übergang.
Leistungsaspekte und Optimierungstipps
- Komprimierung: Verwenden Sie Komprimierungs-Flags mit
tar, um die Bandbreitennutzung zu reduzieren. Zum Beispielzfür gzip,jfür bzip2 oderJfür xz. Der folgende Befehl verwendet gzip (z):
ssh user@source-server "tar czf - -C /path/to/source ." | ssh user@destination-server "tar xzf - -C /path/to/destination"
Für bzip2 würden Sie cjf auf der Quelle und xjf auf dem Ziel verwenden. Für xz nutzen Sie
entsprechend cJf und xJf. Wählen Sie den Algorithmus je nach gewünschtem Verhältnis
zwischen Komprimierungsrate und CPU-Auslastung (gzip ist schnell, xz bietet eine stärkere
Komprimierung).
- Netzwerkgeschwindigkeit: Stellen Sie sicher, dass Ihre Netzwerkverbindung stabil und schnell genug für große Übertragungen ist.
- Ressourcenverwaltung: Überwachen Sie während der Übertragungen die CPU- und Speicherauslastung, um Ihre Server nicht zu überlasten.
Häufige Probleme beheben
- Berechtigungsfehler: Stellen Sie sicher, dass der Benutzer über passende Leserechte für alle Quelldateien und -verzeichnisse sowie über Schreibrechte für das Zielverzeichnis verfügt.
- Netzwerkunterbrechungen: Verwenden Sie Tools wie
screenodertmux, um Sitzungen bei Netzwerkunterbrechungen aufrechtzuerhalten. So läuft der Befehl im Hintergrund weiter und Sie können sich wieder mit der Sitzung verbinden, selbst wenn Ihre lokale Verbindung abbricht. - Beschädigte Archive: Prüfen Sie die Integrität anhand der Dateigrößen. Für zuverlässigere
Prüfungen vergleichen Sie nach der Übertragung die Prüfsummen (etwa mithilfe von
md5sumodersha256sum) einiger wichtiger Dateien auf Quelle und Ziel.
Fazit
Das direkte Streamen von tar-Archiven zwischen Servern ist eine leistungsstarke Technik für
effiziente Dateiübertragungen, besonders wenn der lokale Speicher begrenzt ist. Bei Transloadit
bietet unser Robot
🤖 /file/compress eine robuste serverseitige Archivierung von Dateien in
Formate wie tar (optional gzip-komprimiert) und zip, die Teil eines größeren Workflows
für die effiziente Verwaltung und Übertragung von Dateien sein kann.
