2012-11-04 8 views
5

Zmieniam dostawców hostingu i muszę przesłać miliony przesłanych plików na nowy serwer. Wszystkie pliki znajdują się w tym samym katalogu. Tak. Czytałeś to poprawnie. ;)Jak skutecznie przenieść wiele plików na nowy serwer?

W przeszłości robiłem to:

  1. Zip wszystkie pliki z serwera źródłowego
  2. scp zip do nowego serwera
  3. Rozpakuj katalog
  4. przejść do odpowiednia lokalizacja
    • z dowolnego powodu moje zamki z kroku 1 zawsze przynoszą ścieżkę wraz z nimi i wymagają ode mnie do mv.

Ostatni raz zrobiłem to zajęło około 4-5 dni, aby zakończyć i to było około 60% tego, co mam teraz.

Mam nadzieję na lepszy sposób. Co sugerujesz?

Struktura pliku jest mieszana. Coś takiego: AAAAAAAAAA.jpg - ZZZZZZZZZZ.txt

Oto jeden pomysł jesteśmy rzucając wokół:

podzielić zamki na język ton mini suwakami na podstawie 3 prefiksów liter. Coś jak:

AAAAAAAAAA.jpg - AAAZZZZZZZ.gif => AAA.zip 

Teoretycznej Plusy:

  • mogłoby przyspieszyć przenoszenie, dzięki czemu wiele zamki przenieść naraz
  • może ograniczyć czas tracony na nieudanej transferu. (Oczekiwanie na 2 dni za przelew do ostatecznie nie jest straszne)

Teoretyczne Wady:

  • może spowolnić początkową zip znacznie od zip ma wyglądać zapasowej plików przez asterisk (AAA*) , być może skompensowany przez uruchomienie wielu wątków zip na raz, przy użyciu wszystkich procesorów zamiast tylko jednego.
  • Złożoność?

Pomyśleliśmy także o rsync i scp, ale martwimy się o koszt ręcznego przenoszenia każdego pliku. A ponieważ serwer zdalny jest pusty, nie muszę się martwić o to, co już tam jest.

Co myślisz? Jak byś to zrobił?

(Tak, będę przesuwając je do Amazon S3 w końcu, a ja po prostu wysłać je do dysku, ale w międzyczasie muszę je wczoraj!)

+3

Co powiesz na rsync? –

+1

W takiej sytuacji moim głównym zmartwieniem byłoby nie powtarzanie przelewu, niż szybkie przekazywanie. Kiedyś musiałem przenieść pliki o pojemności 100GB z lokalizacji oddalonych o 7 mórz. Próbowałem z dużym plikiem i przesyłanie nie powiodło się z powodu jakiegoś losowego błędu i musiałem zrobić to jeszcze raz. Zrobiłem więc podział plików na porcje 6 gb i wysyłałem je równolegle (3-4) na raz. To było dużo szybsze i bardziej niezawodne. Możesz po prostu utworzyć skrypt, który wykona to automatycznie. – specialscope

Odpowiedz

10

rzeczywiście mają wiele opcji, mój ulubiony będzie używał rsync.

rsync [dir1] [dir2] 

To polecenie faktycznie porówna katalogi i zsynchronizuje tylko różnice między nimi.

Z tym, byłbym najbardziej likeley używać następujących

rsync -z -e ssh [email protected]:/var/www/ /var/www/ 

-z pocztowy
-e Shell poleceń

Można również użyć SFTP, FTP przez SSH.

Lub nawet wget.

wget -rc ssh://[email protected]:/var/www/ 
+1

Czy rsync nie wymaga wysiłku w celu porównania każdego pliku? Katalog zdalny jest pusty, więc po co dodawać te wydatki? Co więcej, przesyłanie milionów plików jest wydajniejsze niż jeden (lub nawet 1000) skompresowanych plików? – Ryan

+0

Nie jestem pewien co do porównania.Początkowo sugerowałeś kompresję, więc po prostu wrzuciłem ją tutaj jako opcję dla ciebie. Dlaczego nie tylko standardowe połączenie FTP ...? Lub nawet wget -rc ssh: //[email protected]:/var/www/ –

+0

Porównanie Rsync opiera się na haszu dla bloków dyskowych (dla istniejących plików) Dla nieistniejących plików nie ma nic do porównania (z wyjątkiem * może * ostateczna weryfikacja po kopii) – wildplasser

1

Pochodzę ze świata Linux/Unix. Użyłbym tar do utworzenia wielu plików tar o rozmiarze ustalonym. Np .:

tar -cML $MAXIMUM_FILE_SIZE_IN_KILOBYTES --file=${FILENAME}}_{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}.tar ${THE_FILES} 

Pominąłbym rekompresję, chyba że twoje pliki .txt są ogromne. Nie będziesz mieć zbyt wiele czasu na rekompresowanie plików .jpeg, a to pochłonie dużo czasu procesora (i rzeczywistego).

Sprawdzam, jak działa kształtowanie ruchu. Ile równoczesnych połączeń możesz mieć? Ile przepustowości na połączenie? Ile razem?

Widziałem kilka interesujących rzeczy z scp. Testowanie sieci domowej, scp zapewnia znacznie niższą przepustowość niż kopiowanie przez podłączony system plików udostępnionego systemu plików smbfs. Nie do końca wiem, dlaczego. Chociaż może to być pożądane, jeśli weryfikacja kopii i żądanie retransmisji przy błędach jest sprawdzana. (Istnieje bardzo małe prawdopodobieństwo popełnienia błędu w pakiecie transmitowanym przez Internet, bez jakiegoś późniejszego etapu weryfikacji, który jest poważnym problemem z dużymi zbiorami danych. Może być konieczne uruchomienie skrótów md5 ...)

Jeśli jest to serwer internetowy, zawsze możesz po prostu użyć polecenia wget. Chociaż wydaje się to wysoce nieefektywne ...

+0

Zgoda na kompresję. Większość naszych plików to obrazy i nie kompresują. Jednak problem dotyczy transferu wielu plików (10M +) zamiast tylko jednego (lub 1000). Czy myślisz, że scp poradziłby sobie z tym lepiej niż kompresowanie z przodu? Jak powinienem oszacować wydatek I/O i koszty połączeń? – Ryan

0

Co z wykorzystaniem BitTorrenta? Konfiguracja może nie być łatwa, ale gdy już to zrobisz, powinnaś zrobić dokładnie to, co chcesz. BitTorrent został opracowany w celu ułatwienia przesyłania dużych plików. Potrzebny byłby klient na komputerze źródłowym i jeden na komputerze docelowym. Utwórz metaplik na komputerze źródłowym. Skopiuj go do komputera docelowego i załaduj go do klienta BitTorrent. Ręcznie wprowadź adres IP do komputera źródłowego. Dopóki nie będziesz blokował Cię przez zapory, transfer powinien się rozpocząć. Opcjonalnie możesz skompresować wszystkie pliki, najpierw bez kompresji, a następnie przesłać suwak za pomocą BitTorrenta.

Powiązane problemy