Übertragen von Millionen von Dateien von einem Server auf einen anderen

15

Ich habe zwei Server. Eine von ihnen hat 15 Millionen Textdateien (ca. 40 GB). Ich versuche, sie auf einen anderen Server zu übertragen. Ich überlegte, sie zu komprimieren und das Archiv zu übertragen, erkannte jedoch, dass dies keine gute Idee ist.

Also habe ich den folgenden Befehl verwendet:

scp -r usrname@ip-address:/var/www/html/txt /var/www/html/txt

Aber mir ist aufgefallen, dass dieser Befehl nur etwa 50.000 Dateien überträgt und dann die Verbindung unterbrochen wird.

Gibt es eine bessere Lösung, mit der ich die gesamte Dateisammlung übertragen kann? Ich meine, etwas rsynczu verwenden, um die Dateien zu übertragen, die nicht übertragen wurden, als die Verbindung unterbrochen wurde. Wenn ein weiterer Verbindungsabbruch auftritt, gebe ich den Befehl zum Übertragen von Dateien erneut ein und ignoriere die bereits erfolgreich übertragenen Dateien.

Dies ist bei nicht möglich scp, da immer ab der ersten Datei begonnen wird.

yuli chika
quelle

Antworten:

33

Wie Sie sagen, verwenden Sie rsync:

rsync -azP /var/www/html/txt/ username@ip-address:/var/www/html/txt

Die Optionen sind:

-a : enables archive mode, which preserves symbolic links and works recursively
-z : compress the data transfer to minimise network usage
-P : to display a progress bar and enables you to resume partial transfers

Stellen Sie, wie @aim in seiner Antwort sagt, sicher, dass /das Quellverzeichnis mit einem Trailing versehen ist (beides ist auch in Ordnung).

Weitere Informationen finden Sie auf der Manpage

garethTheRed
quelle
1
Ich schlage vor, das -hFlag hinzuzufügen , um für Menschen lesbare Einheiten zu verwenden. Und wenn Sie mehr Ausführlichkeit wünschen, haben Sie ein paar Möglichkeiten: -iund / oder -v/ -vv.
Nyuszika7h
2
Es gibt im Allgemeinen kaum einen Grund, rsync nicht immer anstelle von scp zu verwenden. Die grundlegende Verwendung ist die gleiche und es bietet viele zusätzliche nützliche Funktionen.
Pimlottc
Wenn dies sshkeine Option für Sie ist und Sie die Verschlüsselung nicht benötigen oder möchten, können Sie mein Skript s3.amazonaws.com/skaperen/rsend
Skaperen 28.03.15
7

Benutze einfach rsync über ssh!

rsync -av username@ip:/var/www/html/txt /var/www/html/

Von der Manpage:

-a , - Archiv : Dies entspricht -rlptgoD. Es ist eine schnelle Möglichkeit zu sagen, dass Sie eine Rekursion wünschen und fast alles beibehalten möchten (wobei -H eine bemerkenswerte Auslassung ist). Die einzige Ausnahme von der obigen Äquivalenz besteht darin, dass --files-from angegeben wird. In diesem Fall ist -r nicht impliziert.

-v , - ausführlich : Diese Option erhöht die Informationsmenge, die Sie während der Übertragung erhalten. Standardmäßig arbeitet rsync unbeaufsichtigt. Ein einzelnes -v gibt Auskunft darüber, welche Dateien übertragen werden, und am Ende eine kurze Zusammenfassung. Mit den Optionen -v erhalten Sie Informationen darüber, welche Dateien übersprungen werden, und am Ende etwas mehr Informationen. Mehr als zwei -v-Optionen sollten nur verwendet werden, wenn Sie rsync debuggen.

Beachten Sie, wie ich am Ende der Ordner Schrägstriche verwendet habe - das ist wichtig .

Ziel
quelle
Sie sollten wahrscheinlich weitere Informationen zur Bedeutung des abschließenden Schrägstrichs hinzufügen. Auf der rsyncHandbuchseite: "Ein abschließender Schrägstrich in der Quelle ändert dieses Verhalten, um zu vermeiden, dass am Ziel eine zusätzliche Verzeichnisebene erstellt wird. Sie können sich ein abschließendes / in einer Quelle als" Kopieren des Inhalts dieses Verzeichnisses "im Gegensatz zu" vorstellen. Kopieren Sie das Verzeichnis mit dem Namen ", aber in beiden Fällen werden die Attribute des enthaltenden Verzeichnisses in das enthaltende Verzeichnis auf dem Ziel übertragen."
Nyuszika7h
... und die Bedeutung der Flaggen -av?
MrWhite
0

Verwenden Sie lftp, es ist viel schneller als rsync und das Beste für das Spiegeln von Websites (viele kleine Dateien). Es kann auch über mehrere Verbindungen parallel übertragen werden:

lftp -u username,password sftp://ip-address -e 'mirror --only-newer --no-dereference --parallel=5 /remote/path/ /destination/;quit'

Wenn eine Verbindung unterbrochen wird, wird die Verbindung wiederhergestellt und fortgesetzt. Wenn Sie die Übertragung abbrechen, werden vorhandene Dateien übersprungen und fortgesetzt.

http://lftp.yar.ru/

Mihajlo
quelle
0

Ein anderer Weg ist, eine (optional komprimierte) tar-Datei über ssh zu leiten:

tar -czf - ./* | ssh other.host.foo "cd /tmp; tar -xzf-"
jmullee
quelle