ZFS - send receive

ZFS pozwala na wydajne przenoszenie danych między różnymi systemai opartymi o ten system plików. Do przesyłania danych między odległymi komputerami warto skorzystać z opcji zfs send oraz zfs recv. Warto by komputery były połączone VPNem, w przeciwnym przypadku do tunelowania wypada użyć SSH.

Istotne sprawy

Polecnia send i recv nie potrafią utworzyć nowej puli, trzeba ją utworzyć na docelowej maszynie samodzielnie. Nie wszystkie ustawienia datasetów są kopiowane, trzeba pamiętać by na docelowej maszynie ustawić dla puli parametry typu recordsize, atime takie, jakie mają być odziedziczone przez datasety jakie zostaną utworzone podczas przesyłania danych. Przy tworzeniu puli warto pamiętać o parametrze ashift. Parametry nie muszą być zgodne - wystarczy, że pula będzie miała wystarczającą ilość wolnego miejsca do przechowywania danych.

Kopiowanie danych z użyciem tunelu SSH

Przesyłanie danych polega na wydaniu na jednym komputerze polecenia zfs send a na innym zfs receive. Tutaj omówiony zostanie przypadek kopiowania z użyciem SSH.

Zaczynamy od utworzenia snapshota, który będzie punktem odniesienia przy kopiowaniu danych

zfs snapshot source_pool/dataset@replication1

Zaczymy właściwe przesyłanie:

zfs send -R source_pool/dataset@replication1 | ssh 192.168.x.y zfs recv -Fduv dest_pool/dataset

Co oznaczają konkretne opcje? Otóż: zfs send: -R = recursive replication - przesyła wszystko -I = przesyła inkrementalne snapshoty, istotne przy inkrementalnym przesyłaniu

zfs recv: -F = usuwa z docelowego miejsca istniejące dane jeśli zachodzi koilizja -d = zachowuje nazwę docelowej puli odpowiednio dostosowując ścieżki -u = nie montuje datasetów w docelowym systemie po dokonaniu exportu danych -v = verbose, daje informacje zwrotne

Kopiowanie danych z użyciem mbuffer

Jeżeli mamy zaufane połączenie między hostami to możemy użyć mbuffer, pozwoli to zoptymalizować transfery i uzyskać maksymalną wydajność łącza. Na docelowej maszynie wydajemy polecenie:

mbuffer -s 128k -m 1G -I 9090 | zfs recv -Fduv dest_pool/dataset

Na maszynie z której wysyłamy dane:

zfs send -RI source_pool/dataset@replication1 | mbuffer -s 128k -m 1G -O 192.168.x.y:9090
Kompresja w locie

W przypadku jeśli łącze nie jest za szybkie a mamy nadmiar czasu procesora możemy uruchomić kompresję w locie przesyłanych danych:

zfs send -RI source_pool/dataset@replication1 | gzip | ssh 192.168.x.y "gunzip | zfs recv -Fduv dest_pool/dataset"
Przesyłanie całej puli

W przypadku kiedy chcemy przetransferować wszystkie datasety można zrobić snapshota rekurencyjnego i przesłać taki snapshot

zfs snapshot -r source_pool@xfer
zfs send -R source_pool@xfer | ssh 192.168.x.y zfs recv -Fduv dest_pool

Tak przesłaną pulę przed właściwym zaimportowaniem wypada zweryfikować w sensie sprawdzić czy wszystkie punkty montowania są we właściwych miejscach:

zpool import -N dest_pool
zfs list

Po udanyn transferze danych można usunąć rekurencyjnego snapshota na obu maszynach:

zfs destroy -rv source_pool@xfer
ssh 192.168.x.y zfs destroy -rv dest_pool@xfer

Poprzedni wpis Następny wpis