Przesyłanie milionów plików z jednego serwera na drugi

15

Mam dwa serwery. Jeden z nich ma 15 milionów plików tekstowych (około 40 GB). Próbuję przenieść je na inny serwer. Rozważałem spakowanie ich i przeniesienie archiwum, ale zdałem sobie sprawę, że to nie jest dobry pomysł.

Więc użyłem następującego polecenia:

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

Zauważyłem jednak, że to polecenie przesyła tylko około 50 000 plików, a następnie połączenie zostaje utracone.

Czy jest jakieś lepsze rozwiązanie, które pozwala mi przenieść całą kolekcję plików? Mam na myśli coś w rodzaju rsynctransferu plików, które nie zostały przesłane po utracie połączenia. Gdy nastąpi kolejne przerwanie połączenia, ponownie wpiszę polecenie, aby przesłać pliki, ignorując te, które zostały już pomyślnie przesłane.

Nie jest to możliwe scp, ponieważ zawsze zaczyna się od pierwszego pliku.

Yuli Chika
źródło

Odpowiedzi:

33

Jak mówisz, użyj rsync:

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

Dostępne są następujące opcje:

-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

Jak mówi @aim w swojej odpowiedzi, upewnij się, że masz trailing /w katalogu źródłowym (w obu przypadkach jest w porządku).

Więcej informacji ze strony man

garethTheRed
źródło
1
Sugeruję dodanie -hflagi, aby użyć jednostek czytelnych dla ludzi. A jeśli chcesz więcej gadatliwości, masz kilka opcji: -ii / lub -v/ -vv.
nyuszika7h
2
Zasadniczo istnieje bardzo mały powód, aby nie zawsze używać rsync zamiast scp. Jego podstawowe użycie jest takie samo i oferuje wiele dodatkowych przydatnych funkcji.
pimlottc
jeśli sshnie jest to dla ciebie opcja i nie potrzebujesz lub nie chcesz szyfrowania, możesz wypróbować mój skrypt s3.amazonaws.com/skaperen/rsend
Skaperen
7

Wystarczy użyć rsync nad ssh!

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

Ze strony podręcznika:

-a , - archive : Jest to równoważne z -rlptgoD. Jest to szybki sposób na powiedzenie, że chcesz rekurencji i chcesz zachować prawie wszystko (z -H jest zauważalnym pominięciem). Jedynym wyjątkiem od powyższej równoważności jest to, że podano --files-from, w którym to przypadku nie sugeruje się -r.

-v , - verbose : Ta opcja zwiększa ilość informacji przekazywanych podczas przesyłania. Domyślnie rsync działa w trybie cichym. Pojedynczy -v poda informacje o tym, jakie pliki są przesyłane, a na końcu krótkie streszczenie. Dwie opcje -v podadzą informacje o tym, które pliki są pomijane, i nieco więcej informacji na końcu. Więcej niż dwie opcje -v powinny być używane tylko podczas debugowania rsync.

Zwróć uwagę, jak użyłem ukośników na końcu folderów - to ważne .

cel
źródło
Prawdopodobnie powinieneś dodać więcej informacji na temat znaczenia końcowego ukośnika. Ze strony rsyncpodręcznika: „Końcowy ukośnik na źródle zmienia to zachowanie, aby uniknąć utworzenia dodatkowego poziomu katalogu w miejscu docelowym. Można myśleć o końcowym / na źródle jako o„ kopiowaniu zawartości tego katalogu ”w przeciwieństwie do„ skopiuj katalog według nazwy „, ale w obu przypadkach atrybuty katalogu zawierającego zostaną przeniesione do katalogu zawierającego w miejscu docelowym”.
nyuszika7h
... i znaczenie flag -av?
MrWhite
0

Użyj lftp, jest znacznie szybszy niż rsync i najlepszy do tworzenia kopii lustrzanych stron internetowych (wiele małych plików). Może również przesyłać równolegle za pomocą wielu połączeń:

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

Jeśli jedno połączenie zostanie zerwane, zostanie ponownie połączone i będzie kontynuowane. Przerwanie transferu spowoduje pominięcie istniejących plików i kontynuowanie.

http://lftp.yar.ru/

Mihajlo
źródło
0

Innym sposobem jest przesłanie pliku tar (opcjonalnie skompresowanego) przez ssh:

tar -czf - ./* | ssh other.host.foo "cd /tmp; tar -xzf-"
jmullee
źródło