Przenoszenie woluminu logicznego bezpośrednio z jednego serwera na drugi przez sieć?


13

Mam maszynę hosta KVM z kilkoma maszynami wirtualnymi. Każda maszyna wirtualna używa woluminu logicznego na hoście. Muszę skopiować LV na inną maszynę hosta.

Zwykle użyłbym czegoś takiego:

dd if=/the/logical-volume of=/some/path/machine.dd

Aby przekształcić LV w plik obrazu i przenieść go za pomocą SCP. Następnie użyj DD, aby skopiować plik z powrotem do nowej LV na nowym hoście.

Problem z tą metodą polega na tym, że potrzebujesz dwa razy więcej miejsca na dysku niż maszyna wirtualna zajmuje na obu komputerach. to znaczy. 5 GB LV wykorzystuje 5 GB miejsca na LV, a kopia dd wykorzystuje również dodatkowe 5 GB miejsca na obraz. Jest to w porządku dla małych LV, ale co, jeśli (jak w moim przypadku) masz 500 GB LV na dużą maszynę wirtualną? Nowa maszyna hosta ma dysk twardy o pojemności 1 TB, więc nie może pomieścić pliku obrazu 500d dd i ma 500 GB woluminu logicznego do skopiowania i ma miejsce na system operacyjny hosta i miejsce dla innych mniejszych gości.

Chciałbym zrobić coś takiego:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv

Innymi słowy, skopiuj dane bezpośrednio z jednego woluminu logicznego do drugiego przez sieć i pomiń plik obrazu pośredniego.

czy to możliwe?


Odpowiedzi:


24

Jasne, że to możliwe.

dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv

Bum.

Zrób sobie przysługę i użyj czegoś większego niż domyślny rozmiar bloku. Może dodaj bs = 4M (odczyt / zapis w kawałkach po 4 MB). W komentarzach widać, że w komentarzach jest trochę niedociągnięć; jeśli robisz to dość często, poświęć trochę czasu, aby wypróbować to kilka razy z różnymi rozmiarami bloków i przekonaj się, jakie są najlepsze prędkości transferu.

Odpowiadając na jedno z pytań z komentarzy:

Możesz przesłać strumieniowo przelew przez pv, aby uzyskać statystyki dotyczące transferu. Jest o wiele ładniejszy niż wyjście, które otrzymujesz z wysyłania sygnałów do dd.

Powiem też, że chociaż korzystanie z netcata - lub czegokolwiek innego, co nie narzuca narzutu szyfrowania - będzie bardziej wydajne, zwykle stwierdzam, że dodatkowa prędkość wiąże się z pewną utratą wygody. O ile nie poruszam się po naprawdę dużych zestawach danych, zwykle trzymam się ssh pomimo narzutu, ponieważ w większości przypadków wszystko jest już ustawione na Just Work.


1
Czy bs wpływa tylko na szybkość kopiowania, czy ma wpływ na sposób przechowywania danych?
Nick

3
Nie ma to wpływu na sposób przechowywania danych, ale jest znacznie wydajniejsze niż używanie domyślnego rozmiaru bloku (512 bajtów) do odczytu i zapisu.
larsks

3
@Nick: W systemie Linux możesz wysłać ddprocesowi USR1sygnał, aby wyświetlał linię statusu z przesłaną kwotą. Uzyskaj numer procesu swojego ddprocesu za pomocą czegoś podobnego, ps aux | grep dda następnie użyj tego PID z poleceniem kill -USR1 $PID. Komunikat zostanie wyświetlony na oryginalnym terminalu, w którym zacząłeś dd.
Sven

3
Prawdopodobnie nie chcesz używać tak dużego bs, ponieważ po prostu zablokuje on zapisywanie do potoku do ssh, dopóki nie będzie mógł przenieść większości z nich do gniazda sieciowego, w którym to czasie dysk przestanie działać. Ponieważ domyślny rozmiar głowicy wynosi 128k, prawdopodobnie chcesz się tego trzymać. Lub zwiększ rozmiar dysku twardego.
psusi

1
@psusi: Link Zoredache umieszczony w komentarzu pod pytaniem pokazał coś przeciwnego, uzyskali najszybszy wynik z blokami 16M, ale użyli netcat zamiast ssh jako metody przesyłania, co zawsze jest lepszą opcją, gdy szyfrowanie nie jest wymagane.
Sven

19

Oto zoptymalizowana wersja, która pokazuje postępy w używaniu pvi używa BS dla większych porcji, a także wykorzystuje gzipdo zmniejszenia ruchu w sieci.

Idealnie nadaje się do przenoszenia danych między wolnymi połączeniami, takimi jak serwery internetowe. Polecam uruchomić polecenie w sesji ekranowej lub tmux. W ten sposób połączenie ssh z hostem, z którego wykonujesz polecenie, można bez problemu rozłączyć.

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh root@78.46.36.22 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'

2
Możesz użyć ssh -Czamiast gzip. Nie jestem pewien, czy ma to wpływ na wydajność, ale jest o wiele mniej pisania.
Samuel Edwin Ward

1
Sugeruję również użycie albo pigz albo pxz -1 zamiast gzip, wielowątkowość naprawdę pomaga na każdym nowoczesnym serwerze.
sCiphre

pvmoże powodować problemy (moim doświadczeniem przenoszenie więcej 500 vps na inne serwery z tym systemem) z liczbą bajtów, a po tym problemie wolumeny lvm są niespójne. Korzyści z zobaczenia postępu prac są zerowe i niebezpieczne. Jeśli chcesz zobaczyć postęp, otwórz konsolę, na przykład ifto.
abkrim

4

Może użyjesz do tego starego znajomego. NetCat.

W systemie, który traci typ woluminu logicznego

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

Następnie w systemie odbiorczym. rodzaj

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

Tłumaczenie, orgin box dd ten plik i potokuj go do nc (netcat), który będzie nasłuchiwał tego portu. W systemie odbierającym netcat będzie czekać 10 sekund, jeśli nie otrzyma danych, przed zamknięciem na [ip lub name] na [port], a następnie potokuje te dane do dd, aby je zapisać.


2
Netcat nie używa UDP z tymi opcjami.
Samuel Edwin Ward

3

Najpierw zrobiłbym migawkę lv:

lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>

Następnie musisz utworzyć nową lv na nowym hoście (np. Używając lvcreate) o tym samym rozmiarze. Następnie możesz bezpośrednio skopiować dane na nowy host. Oto mój przykład polecenia kopiowania:

dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_host -C 'dd of=/dev/vg1/<created lv> bs=4096'

Skorzystałem z tej procedury, aby skopiować utrzymywaną maszynę wirtualną do serwera proxy proxy. Wolumin logiczny zawierał kilka dodatkowych LV, które były obsługiwane przez samą maszynę wirtualną.


3

Najpierw upewnij się, że wolumin logiczny nie jest podłączony. Jeśli tak jest, a chcesz zrobić „kopię zapasową”, najpierw utwórz migawkę i użyj jej: lvcreate --snapshot --name transfer_snap --size 1G

Muszę przesłać dużo danych (7 TB) między dwoma serwerami połączonymi 1 Gb, więc potrzebowałem najszybszego możliwego sposobu, aby to zrobić.

Czy powinieneś używać SSH?

Korzystanie z ssh nie wchodzi w rachubę, nie ze względu na jego szyfrowanie (jeśli masz procesor z obsługą AES-NI, nie boli tak bardzo), ale z powodu jego buforów sieciowych. Nie są dobrze skalowane. Istnieje łatana wersja Ssh, która rozwiązuje ten problem, ale ponieważ nie ma wstępnie skompilowanych pakietów, nie jest to zbyt wygodne.

Korzystanie z kompresji

Podczas przesyłania surowych obrazów dysku zawsze zaleca się stosowanie kompresji. Ale nie chcesz, aby kompresja stała się wąskim gardłem. Większość narzędzi kompresji unix, takich jak gzip, jest jednowątkowych, więc jeśli kompresja nasyca jeden procesor, będzie to wąskim gardłem. Z tego powodu zawsze używam pigz, wariantu gzip, który używa wszystkich rdzeni procesora do kompresji. A to jest konieczne, abyś chciał zwiększyć lub przekroczyć prędkości GBit.

Korzystanie z szyfrowania

Jak powiedziano wcześniej, ssh jest wolny. Jeśli masz procesor AES-NI, nie powinno to stanowić wąskiego gardła. Zamiast używać ssh, możemy użyć openssl bezpośrednio.

Prędkości

Aby dać Ci wyobrażenie o wpływie komponentów na prędkość, oto moje wyniki. Są to prędkości przesyłania między dwoma systemami produkcyjnymi odczytywającymi i zapisującymi do pamięci. Rzeczywiste wyniki zależą od prędkości sieci, prędkości dysku twardego i prędkości procesora źródłowego! Robię to, aby pokazać, że przynajmniej nie ma ogromnego spadku wydajności. Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s Wniosek: użycie kompresji daje zauważalne przyspieszenie, ponieważ znacznie zmniejsza rozmiar danych. Jest to jeszcze ważniejsze, jeśli masz wolniejsze prędkości sieciowe. Podczas korzystania z kompresji obserwuj użycie procesora. jeśli wykorzystanie zostanie maksymalne, możesz spróbować bez niego. Używając kompresji jako niewielkiego wpływu na systemy AES-NI, imho tylko dlatego, że kradnie około 30-40% procesorów z kompresji.

Korzystanie z ekranu

Jeśli przesyłasz dużo danych, takich jak ja, nie chcesz, aby zostało to przerwane przez odłączenie sieci od twojego klienta ssh, więc lepiej zacznij od ekranu po obu stronach. To tylko uwaga, nie napiszę tutaj samouczka ekranowego.

Pozwala skopiować

Zainstaluj niektóre zależności (od źródła i miejsca docelowego): apt install pigz pv netcat-openbsd

następnie utwórz wolumin w miejscu docelowym o takim samym rozmiarze jak źródło. Jeśli nie masz pewności, użyj lvdisplay na źródle, aby uzyskać rozmiar i utworzyć cel, tj .: lvcreate -n lvname vgname -L 50G

następnie przygotuj miejsce docelowe do odbioru danych:

nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname

a gdy będzie gotowy, rozpocznij transfer w źródle:

pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1

Uwaga: jeśli przesyłasz dane lokalnie lub nie przejmujesz się szyfrowaniem, po prostu usuń część openssl z obu stron. Jeśli cię to obchodzi, asdkjn2hb jest kluczem szyfrującym, powinieneś go zmienić.


NIE NALEŻY NIGDY NIE ROBIĆ TEGO NA SERWERZE PROXMOX: apt install netcat-openbsd Instalowanie netcat-openbsd całkowicie wyczyściło ProxMox z serwera i spowodowało ponad 5 godzin przestoju i pracy !!!
Zoltan

-1

Reszta odpowiedzi nie działa dobrze i nie spełnia wymagań pytania, ponieważ nie tworzy woluminu logicznego na serwerze docelowym, ale zamiast tego tworzy plik w katalogu / dev / mygroup / myvol na dysku głównym, który również powoduje, że skopiowany wolumin nie pojawia się w narzędziach LV, takich jak lvdisplay.

Stworzyłem skrypt bash, który automatyzuje cały proces: https://github.com/daniol/lvm-ssh-transfer

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.