Prześlij 15 TB małych plików

79

Archiwizuję dane z jednego serwera na drugi. Początkowo zacząłem rsyncpracę. Utworzenie listy plików zajęło tylko 2 tygodnie dla zaledwie 5 TB danych i kolejny tydzień na przesłanie 1 TB danych.

Potem musiałem zabić to zadanie, ponieważ potrzebowaliśmy trochę czasu na nowym serwerze.

Uzgodniono, że będziemy go przyspieszać, ponieważ prawdopodobnie nie będziemy musieli ponownie uzyskiwać do niego dostępu. Myślałem o podzieleniu go na 500 GB. Po tartym miałem zamiar to skopiować ssh. Używałem tari pigzale wciąż jest zbyt powolny.

Czy jest na to lepszy sposób? Myślę, że oba serwery są na Redhat. Stary serwer to Ext4, a nowy to XFS.

Rozmiary plików wahają się od kilku kb do kilku mb, a 5 TB zawiera 24 miliony plików JPEG. Więc zgaduję około 60-80 milionów na 15 TB.

edycja: Po kilku dniach gry z rsync, nc, tar, mbuffer i pigz. Wąskim gardłem będzie dyskowe we / wy. Ponieważ dane są rozłożone na 500 dyskach SAS i około 250 milionach plików JPEG. Jednak teraz dowiedziałem się o tych wszystkich fajnych narzędziach, których mogę używać w przyszłości.

Lbanz
źródło
1
możliwy duplikat linux-linux, transfer 10 TB?
D34DM347
2
Jedną z opcji jest utworzenie skompresowanych plików tar na dysku zewnętrznym i przeniesienie ich do nowego systemu. Dodatkowy dysk przyspieszy tworzenie plików tar (nie będzie zapisywał na istniejące dyski w systemie, być może podczas próby odczytania z nich 15 TB) i nie będzie wiązał nowego serwera.
Brian
4
Czy jest na to lepszy sposób? - Tak, replikacja systemu plików DFS systemu Windows Server 2012 R2 przygotowałaby to za około 10 godzin . Synchronizuje zmiany i odczytuje od początku po ponownym uruchomieniu.
TessellatingHeckler
27
@TessellatingHeckler: więc sugerujesz migrację OP z Redhat do Windows przed archiwizacją?
Thomas Weller,
12
@ThomasWeller Zapytali „czy jest lepszy sposób?” I jest. Nie zalecam, aby korzystali z nich lepiej. Mogą swobodnie używać poleceń w potoku, który nie może odzyskać po przerwaniu, nie zweryfikuje zawartości pliku, nie może zgłosić stanu kopiowania, nie może użyć wcześniej skopiowanych bloków, aby uniknąć kopiowania części plików, nie ma niejawnego obsługuje kopiowanie o niskim priorytecie, nie można go zatrzymać, nie wspomina o kopiowaniu list ACL i potrzebuje kogoś, kto pozostanie zalogowany, aby go uruchomić. Jednak każdy, kto podąży za nim, może być zainteresowany - lub poproszony o powiedzenie „x robi to w Linuksie”.
TessellatingHeckler

Odpowiedzi:

64

Miałem bardzo dobre wyniki przy użyciu tar, pigz(równoległy gzip) i nc.

Maszyna źródłowa:

tar -cf - -C /path/of/small/files . | pigz | nc -l 9876

Maszyna docelowa:

Wyciągać:

nc source_machine_ip 9876 | pigz -d | tar -xf - -C /put/stuff/here

Aby zachować archiwum:

nc source_machine_ip 9876 > smallstuff.tar.gz

Jeśli chcesz zobaczyć szybkość transferu tylko przez rury pvpo pigz -d!

h0tw1r3
źródło
3
FYI, można zastąpić pigzz gziplub usunąć go całkowicie, ale prędkość będzie znacznie wolniejsze.
h0tw1r3
10
Jak można to zaakceptować, jeśli OP już próbował tari pigz? Nie rozumiem ...
Thomas Weller,
5
@ThomasWeller, skąd masz, że próbował pigz? Z pytania wynika, że ​​próbował tylko do rsynctej pory i zastanawiał się nad wykorzystaniem tardo podzielenia i powiązania danych. Zwłaszcza jeśli nie użył opcji -z/ --compressna rsync, pigzteoretycznie może znacznie pomóc.
Doktor J
1
@ThomasWeller tak, rzeczywiście próbowałem już tar i pigz, ale nie NC. Używałem ssh, więc dodałem o wiele więcej.
lbanz
2
@lbanz oznacza po prostu, że tarnie wytwarza danych wystarczająco szybko, pigzaby zużywać dużo procesora do kompresji. Odczytywanie wielu małych plików wymaga o wiele więcej wywołań systemowych, o wiele więcej operacji na dyskach i znacznie większego obciążenia jądra niż odczytywanie tej samej liczby bajtów większych plików, i wygląda na to, że po prostu wąskie gardło na podstawowym poziomie.
hobbs
21

Trzymałbym się rozwiązania rsync. Nowoczesne (3.0.0+) rsync używa przyrostowej listy plików, więc nie musi budować pełnej listy przed przesłaniem. Ponowne uruchomienie nie będzie wymagać ponownego wykonania całego transferu w przypadku problemów. Podział transferu na katalog najwyższego lub drugiego poziomu jeszcze bardziej go zoptymalizuje. (Chciałbym użyć rsync -a -Pi dodać, --compressjeśli twoja sieć jest wolniejsza niż dyski).

Lis
źródło
Korzystam z rsync 2.6.8 na starym serwerze. Ponieważ jest to jedno z tych urządzeń, w których nie wolno nam instalować / aktualizować niczego zgodnie z zaleceniami dostawcy lub unieważnia gwarancję. Mogę go zaktualizować i sprawdzić, czy będzie szybszy.
lbanz
18
Znajdź (lub zbuduj) statycznie powiązany plik binarny rsync i po prostu uruchom go z domu. Mam nadzieję, że nie zniszczy to żadnej gwarancji.
Fox,
Jak o unison? Jak to się ma do porównania rsync?
Gwyneth Llewelyn,
15

Skonfiguruj VPN (jeśli jest to Internet), utwórz dysk wirtualny o jakimś formacie na zdalnym serwerze (make ext4), zamontuj go na serwerze zdalnym, a następnie zamontuj go na serwerze lokalnym (używając protokołu na poziomie bloku, takiego jak iSCSI ) i użyj polecenia dd lub innego narzędzia na poziomie bloku, aby wykonać transfer. Następnie możesz skopiować pliki z dysku wirtualnego na dysk rzeczywisty (XFS) według własnego uznania.

Dwa powody:

  1. Brak obciążenia systemu plików, który jest głównym winowajcą wydajności
  2. Bez szukania, patrzysz na sekwencyjny odczyt / zapis po obu stronach
Arthur Kay
źródło
3
Ominięcie systemu plików jest dobre. Kopiowanie na poziomie bloku zamontowanego systemu odczytu i zapisu to naprawdę zły pomysł. Najpierw odmontuj lub podłącz tylko do odczytu.
JB.
Bani jest też kopia 15 TB. Oznacza to, że nowy serwer potrzebuje minimum 30.
Arthur Kay
3
Jeśli serwer używa LVM, można wykonać migawkę systemu plików w trybie tylko do odczytu i skopiować ją. Narzut miejsca tylko dla zmian w systemie plików, które mają miejsce podczas odczytywania migawki.
liori
9

Jeśli stary serwer jest wycofywany z eksploatacji, a pliki mogą znajdować się w trybie offline przez kilka minut, często najszybsze jest wyciągnięcie dysków ze starego urządzenia i podłączenie ich do nowego serwera, zamontowanie ich (teraz online) i skopiowanie plików na nowe serwery dyski macierzyste.

Robin Hammond
źródło
2
To około 1PB dysków 2 TB, więc to zdecydowanie za dużo.
lbanz
3

Użyj mbuffer, a jeśli jest w bezpiecznej sieci, możesz uniknąć kroku szyfrowania.

JamesRyan
źródło
3

(Wiele różnych odpowiedzi może działać. Oto kolejna.)

Wygeneruj listę plików za pomocą find -type f(powinno to zakończyć się za kilka godzin), podziel ją na małe porcje i przenieś każdą porcję za pomocą rsync --files-from=....

pkt
źródło
3

Czy rozważałeś Sneakernet? Dzięki temu mam na myśli przeniesienie wszystkiego na ten sam dysk, a następnie fizyczne przeniesienie tego dysku.

około miesiąc temu Samsung zaprezentował dysk 16 TB (technicznie 15.36 TB), który jest również dyskiem SSD: http://www.theverge.com/2015/8/14/9153083/samsung-worlds-largest-hard -drive-16tb

Myślę, że ten dysk prawie by to zrobił. Nadal będziesz musiał skopiować wszystkie pliki, ale ponieważ nie masz opóźnień w sieci i prawdopodobnie możesz użyć SATA lub podobnie szybkiej techniki, powinno to być znacznie szybsze.

Nzall
źródło
2

Jeśli jest jakaś szansa na uzyskanie wysokiego wskaźnika sukcesu podczas deduplikacji, użyłbym czegoś takiego jak borgbackup lub Attic.

Jeśli nie, sprawdź rozwiązanie netcat + tar + pbzip2 , dostosuj opcje kompresji zgodnie ze sprzętem - sprawdź, jakie jest wąskie gardło (procesor? Sieć? IO?). Pbzip2 ładnie rozciągałby się na wszystkie procesory, zapewniając lepszą wydajność.

neutrinus
źródło
lzma ( xz) dekompresuje się szybciej niż bzip2 i radzi sobie dobrze na większości danych wejściowych. Niestety xzopcja wielowątkowości nie jest jeszcze zaimplementowana.
Peter Cordes,
Zwykle stopień kompresji wymaga większej mocy niż dekompresja, więc jeśli procesor jest czynnikiem ograniczającym, pbzip2 zapewni lepszą ogólną wydajność. Dekompresja nie powinna wpływać na proces, jeśli obie maszyny są podobne.
neutrinus
Tak, chodziło mi o to, że szkoda, że ​​nie ma wielowątkowego LZM z jednym strumieniem. Chociaż w tym przypadku użycia, przenoszenie całych systemów plików danych pigzbyłoby prawdopodobne. być najwolniejszym kompresorem, którego chcesz użyć. Lub nawet lz4. (Jest to lz4mtwielowątkowy-for-a-single-stream dostępnej Nie wątku bardzo sprawnie (ikra nowych tematów bardzo często), ale robi się stałe przyspieszenie.)
Peter Cordes
2

Używasz RedHat Linux, więc nie miałoby to zastosowania, ale jako kolejna opcja:

Odniosłem wielki sukces, używając ZFS do przechowywania milionów plików, ponieważ i-węzły nie stanowią problemu.

Jeśli była to opcja dla ciebie, możesz zrobić migawki i użyć ZFS do wysyłania aktualizacji przyrostowych. Odniosłem wiele sukcesów, używając tej metody do przesyłania i archiwizowania danych.

ZFS jest przede wszystkim systemem plików Solaris, ale można go znaleźć w illumos (rozwidlenie open source Sun's OpenSolaris). Wiem, że przy odrobinie szczęścia można było używać ZFS pod BSD i Linuksem (używając FUSE?) - ale nie mam doświadczenia w próbowaniu tego.

Sleepyweasel
źródło
3
Nastąpił non-FUSE natywnego portu Linux z ZFS na dłuższą chwilę teraz: zfsonlinux.org
Umowy EOG
1

Uruchom rsyncdemona na maszynie docelowej. Przyspieszy to znacznie proces transferu.

Heiko Wiesner
źródło
-1

Możesz to zrobić za pomocą tar i ssh, w następujący sposób:

tar zcf - <your files> | ssh <destination host> "cat > <your_file>.tar.gz"

Lub jeśli chcesz zachować pojedyncze pliki:

tar zcf - <your files> | ssh <destination host> "tar zxf -"

Fabio Brito
źródło
1
Nie będzie deduplikować, nie ma możliwości wznowienia, kompresji przy użyciu tylko jednego procesora.
neutrinus