Próbuję skopiować 75 gigabajtowy plik tgz (migawka mysql lvm) z serwera Linux w naszym centrum danych LA na inny serwer Linux w naszym centrum danych NY przez łącze 10 MB.
Dostaję około 20-30 Kb / s z rsync lub scp, który płynie od 200 do 300 godzin.
W tej chwili jest to stosunkowo ciche łącze, ponieważ drugie centrum danych nie jest jeszcze aktywne i uzyskałem doskonałe prędkości z małych transferów plików.
Postępowałem zgodnie z różnymi przewodnikami tuningu tcp, które znalazłem za pośrednictwem Google bezskutecznie (może czytam niewłaściwe przewodniki, mam dobry?).
Widziałem końcówkę tunelu tar + netcat, ale rozumiem, że jest to dobre tylko dla DUŻYCH małych plików i nie aktualizuje cię, gdy plik zostanie skutecznie przesłany.
Czy zanim zacznę wysyłać dysk twardy, czy ktoś ma jakiś dobry wkład?
AKTUALIZACJA: Cóż ... może to być mimo wszystko link :( Zobacz moje testy poniżej ...
Transfery z NY do LA:
Uzyskiwanie pustego pliku.
[nathan@laobnas test]$ dd if=/dev/zero of=FROM_LA_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.412 seconds, 164 MB/s
[nathan@laobnas test]$ scp -C obnas:/obbkup/test/FROM_NY_TEST .
FROM_NY_TEST 3% 146MB 9.4MB/s 07:52 ETA
Pobieranie tarballa migawki.
[nathan@obnas db_backup]$ ls -la db_dump.08120922.tar.gz
-rw-r--r-- 1 root root 30428904033 Aug 12 22:42 db_dump.08120922.tar.gz
[nathan@laobnas test]$ scp -C obnas:/obbkup/db_backup/db_dump.08120922.tar.gz .
db_dump.08120922.tar.gz 0% 56MB 574.3KB/s 14:20:40 ET
Transfery z LA do NY:
Uzyskiwanie pustego pliku.
[nathan@obnas test]$ dd if=/dev/zero of=FROM_NY_TEST bs=1k count=4700000
4700000+0 records in
4700000+0 records out
4812800000 bytes (4.8 GB) copied, 29.2501 seconds, 165 MB/s
[nathan@obnas test]$ scp -C laobnas:/obbkup/test/FROM_LA_TEST .
FROM_LA_TEST 0% 6008KB 497.1KB/s 2:37:22 ETA
Pobieranie tarballa migawki.
[nathan@laobnas db_backup]$ ls -la db_dump_08120901.tar.gz
-rw-r--r-- 1 root root 31090827509 Aug 12 21:21 db_dump_08120901.tar.gz
[nathan@obnas test]$ scp -C laobnas:/obbkup/db_backup/db_dump_08120901.tar.gz .
db_dump_08120901.tar.gz 0% 324KB 26.8KB/s 314:11:38 ETA
Myślę, że porozmawiam z ludźmi, którzy prowadzą nasze obiekty, link jest oznaczony jako łącze MPLS / Ethernet 10 MB. (wzruszać ramionami)
tcpdump
. Pomoże Ci dowiedzieć się, co spowalnia transfer.Odpowiedzi:
Sneakernet ktoś?
Zakładając, że jest to kopia jednorazowa, nie sądzę, że można po prostu skopiować plik na płytę CD (lub inny nośnik) i z dnia na dzień do miejsca docelowego?
To może być Twoja najszybsza opcja, ponieważ przesyłanie plików o tym rozmiarze przez to połączenie może nie zostać poprawnie skopiowane ... w takim przypadku możesz zacząć wszystko od nowa.
rsync
Moim drugim wyborem / próbą byłoby rsync, ponieważ wykrywa nieudane transfery, częściowe transfery itp. I może odebrać od miejsca, w którym zostało przerwane.
Flaga --progress da ci jakieś informacje zwrotne zamiast po prostu tam siedzieć i pozostawiać cię do odgadnięcia. :-)
Vuze (bittorrent)
Trzeci wybór to prawdopodobnie próba użycia Vuze jako serwera torrent, a następnie zlecenie zdalnej lokalizacji korzystania ze standardowego klienta bitorrent do pobrania. Znam innych, którzy to zrobili, ale wiesz ... do czasu, gdy wszystko zaczęło działać, itd. ...
To chyba zależy od twojej sytuacji.
Powodzenia!
AKTUALIZACJA:
Wiesz, myślałem trochę o twoim problemie. Dlaczego plik musi być pojedynczym ogromnym archiwum? Tar jest w pełni zdolny do dzielenia dużych plików na mniejsze (na przykład na media), więc dlaczego nie podzielić tego ogromnego tarballa na łatwiejsze do zarządzania części, a zamiast tego przenieść je na inne?
źródło
Zrobiłem to w przeszłości z plikiem 60 GB TBZ2. Nie mam już skryptu, ale jego przepisanie powinno być łatwe.
Najpierw podziel plik na części o wielkości ~ 2 GB:
Dla każdego elementu oblicz hash MD5 (to jest sprawdzenie integralności) i zapisz go gdzieś, a następnie zacznij kopiować kawałki i ich md5 do zdalnej strony za pomocą wybranego narzędzia (ja: netcat-tar-pipe na ekranie sesja).
Po chwili sprawdź na md5, czy twoje kawałki są w porządku, a następnie:
Jeśli wykonałeś także MD5 oryginalnego pliku, sprawdź go również. Jeśli wszystko jest w porządku, możesz rozpakować plik, wszystko powinno być w porządku.
(Jeśli znajdę czas, przepiszę skrypt)
źródło
Zwykle jestem wielkim zwolennikiem rsync, ale przy pierwszym przesyłaniu jednego pliku nie ma to większego sensu. Jeśli jednak ponownie przesyłasz plik z niewielkimi różnicami, rsync będzie wyraźnym zwycięzcą. Jeśli mimo wszystko zdecydujesz się na użycie rsync, zdecydowanie polecam uruchomienie jednego końca w
--daemon
trybie, aby wyeliminować zabijający wydajność tunel ssh. Strona manuala dość dokładnie opisuje ten tryb.Moja rekomendacja? FTP lub HTTP z serwerami i klientami, które obsługują wznawianie przerwanych pobierania. Oba protokoły są szybkie i lekkie, unikając kary ssh-tunelowej. Apache + wget krzyczałby szybko.
Sztuczka z rurką Netcat również działałaby dobrze. Tar nie jest konieczny podczas przesyłania pojedynczego dużego pliku. Powodem, dla którego nie powiadamia Cię o zakończeniu, jest to, że mu tego nie powiedziałeś. Dodaj
-q0
flagę po stronie serwera, a będzie się zachowywać dokładnie tak, jak można się spodziewać.Wadą podejścia Netcat jest to, że nie pozwoli ci wznowić pracy, jeśli transfer umrze 74 GB w ...
źródło
Daj szansę netcatowi (czasem nazywanemu nc). Poniższe działa na katalogu, ale powinno być wystarczająco łatwe, aby dostosować tylko kopiowanie jednego pliku.
W polu docelowym:
W polu źródłowym:
Możesz spróbować usunąć opcję „z” w obu poleceniach tar, aby uzyskać nieco większą szybkość, ponieważ plik jest już skompresowany.
źródło
Domyślne SCP i Rsync (który używa SCP) są bardzo wolne w przypadku dużych plików. Chyba bym pomyślał o użyciu protokołu z niższym kosztem. Czy próbowałeś użyć prostszego szyfru szyfrującego lub wcale? Spróbuj wyszukać
--rsh
opcję rsync, aby zmienić metodę przesyłania.Dlaczego nie FTP lub HTTP?
źródło
Chociaż dodaje to trochę narzutu do sytuacji, BitTorrent jest naprawdę bardzo dobrym rozwiązaniem do przesyłania dużych plików. BitTorrent ma wiele fajnych funkcji, takich jak natywne dzielenie plików i sprawdzanie każdego fragmentu, który może zostać przesłany ponownie w przypadku uszkodzenia.
Program taki jak Azureus [obecnie znany jako Vuze] zawiera wszystkie elementy, które musisz utworzyć, serwer i pobieranie torrentów w jednej aplikacji. Pamiętaj, że Azureus nie jest najbardziej oszczędnym rozwiązaniem dostępnym dla BitTorrenta i myślę, że wymaga również GUI - istnieje jednak wiele narzędzi torrentowych opartych na linii poleceń dla Linuksa.
źródło
Cóż, osobiście, 20-30 Kb / s wydaje się dość niski dla łącza 10 Mb (zakładając 10 Mb, a nie 10 MB).
Gdybym był tobą, zrobiłbym jedną z dwóch rzeczy (zakładając, że fizyczny dostęp nie jest dostępny) -
Niezależnie od tego, radzę podzielić duży plik na mniejsze części, około 500 MB. Tylko w przypadku uszkodzenia podczas transportu.
Gdy masz mniejsze porcje, użyj albo rsync ponownie, albo osobiście wolę użyć prywatnej Bezpiecznej sesji ftp, a następnie CRC plików po zakończeniu.
źródło
Kilka pytań może pomóc w dyskusjach: jak ważne są dane, które mają zostać przesłane? Czy dotyczy to odzyskiwania po awarii, tworzenia kopii zapasowych na gorąco, przechowywania offline czy co? Czy zamierzasz wykonać kopię zapasową bazy danych, gdy jest ona w górę lub w dół? A co z konfigurowaniem bazy danych w systemie zdalnym i utrzymywaniem ich w synchronizacji za pomocą klastrowania lub aktualizacji za pomocą dzienników zmian (nie jestem całkowicie obeznany z możliwościami systemu bazy danych MySql). Może to pomóc w zmniejszeniu ilości danych, które należy przesłać przez łącze.
źródło
bbcp utworzy dla ciebie plik i skopiuje z wieloma strumieniami.
źródło
Późna odpowiedź dla pracowników Google:
Podczas przesyłania dużych zestawów danych można użyć rsync do porównania źródła i miejsca docelowego, a następnie zapisać plik wsadowy na lokalnym nośniku wymiennym przy użyciu flagi --only-write-batch. Następnie wysyłasz lokalne media do zdalnej lokalizacji, podłącz je i ponownie uruchom rsync, używając --read-batch, aby uwzględnić zmiany w zdalnym zbiorze danych.
Jeśli pliki źródłowe zmienią się podczas transportu fizycznego lub nośnik transportowy zapełni się, możesz po prostu powtarzać --only-write-batch | statek | - cykl odczytywania partii do momentu, aż miejsce docelowe zostanie doścignięte.
(Ref: Byłem jednym z autorów tej funkcji w rsync - więcej informacji na temat tła i zastosowań można znaleźć w dyskusji na temat implementacji prototypu: https://lists.samba.org/archive/rsync/2005-March/011964 .html )
źródło