ZFS: redystrybuować Zvol na wszystkie dyski w Zpool?


12

Czy istnieje sposób na monitowanie ZFS o redystrybucję danego systemu plików na wszystkich dyskach w jego zpool?

Myślę o scenariuszu, w którym mam wolumin ZFS o stałym rozmiarze, który jest eksportowany jako LUN przez FC. Obecny zpool jest mały, tylko dwa dyski dublowane 1 TB, a zvol ma łącznie 750 GB. Gdybym nagle zwiększył rozmiar zpool do, powiedzmy, 12 dysków 1 TB, wierzę, że zvol nadal byłby skutecznie „umieszczony” tylko na dwóch pierwszych wrzecionach.

Biorąc pod uwagę, że więcej wrzecion = więcej IOPS, jakiej metody mógłbym użyć do „redystrybucji” Zvola na wszystkie 12 wrzecion, aby z nich skorzystać?

Odpowiedzi:


8

Będziesz musiał przepisać swoje dane do rozszerzonego zpool, aby je ponownie zrównoważyć. W przeciwnym razie, w miarę upływu czasu, Twoje zapisy zostaną rozłożone w całej puli.


Nie sądzę, że istnieje szybki i łatwy sposób, aby to zrobić ...?
growse

7
zfs send | zfs recv
the-wabbit

Idę przetestować to - nie mogę uwierzyć, że coś tak prostego by to zrobiło. :)
growse

3
Zgłoś się, nigdy tego nie zrobiłem i też jestem ciekawy.
StrangeWill

3

Nie ma powodu, aby Zvol był przechowywany tylko na urządzeniach początkowych. Jeśli powiększysz pulę, ZFS obejmie zaktualizowane dane na wszystkich dostępnych urządzeniach bazowych. Nie ma stałego partycjonowania w ZFS.


4
Z mojego doświadczenia to nie jest prawda. Chociaż nie ma „ustalonego parowania”, ZFS nie przenosi danych z własnej wolnej woli poza żądania klienta IO. Jeśli utworzysz opisany przeze mnie scenariusz, dodasz więcej dysków, a następnie wykonasz kilka ciężkich operacji we / wy na oryginalnej jednostce LUN, zobaczysz aktywność tylko na pierwszych dwóch dyskach w tablicy, ponieważ tam są dane. ewwhite wskazuje, że z czasem to się wyrównuje, ale jestem ciekawy, czy istnieje szybszy sposób na zrobienie tego.
growse

1
Przepraszam, jeśli byłam niejasna. Oczywiście istniejące dane nie poruszą się magicznie. Tylko zaktualizowane dane zostaną przeniesione równomiernie. To miałem na myśli z „nowymi IO”. Jeśli chodzi o istniejące dane statyczne, buforowanie poprawi również wydajność, o ile bloki będą odczytywane więcej niż jeden raz.
jlliagre

0

To jest „kontynuacja” odpowiedzi ewwhite:

Będziesz musiał przepisać swoje dane do rozszerzonego zpool, aby je ponownie zrównoważyć

Napisałem skrypt PHP ( dostępny na github ), aby zautomatyzować to na moim hoście Ubuntu 14.04.

Wystarczy zainstalować narzędzie PHP CLI sudo apt-get install php5-clii uruchomić skrypt, przekazując ścieżkę do danych puli jako pierwszy argument. Na przykład

php main.php /path/to/my/files

Najlepiej byłoby uruchomić skrypt dwukrotnie we wszystkich danych w puli. Pierwsze uruchomienie zrównoważy wykorzystanie dysku, ale poszczególne pliki zostaną nadmiernie przydzielone do dysków, które zostały dodane jako ostatnie. Drugie uruchomienie zapewni, że każdy plik zostanie „sprawiedliwie” rozłożony na dyski. Mówię uczciwie zamiast równomiernie, ponieważ będzie on równomiernie rozłożony tylko wtedy, gdy nie miksujesz pojemności dysku, tak jak ja z moją rajdą 10 par różnych rozmiarów (lustro 4 TB + lustro 3 TB + lustro 3 TB).

Powody używania skryptu

  • Muszę rozwiązać problem „na miejscu”. Np. Nie mogę zapisać danych do innego systemu, usuń je tutaj i napisz wszystko ponownie.
  • Wypełniłem moją pulę w ponad 50%, więc nie mogłem po prostu skopiować całego systemu plików jednocześnie przed usunięciem oryginału.
  • Jeśli istnieją tylko niektóre pliki, które muszą działać dobrze, można po prostu uruchomić skrypt dwa razy nad tymi plikami. Drugi przebieg jest jednak skuteczny tylko wtedy, gdy uda mu się zrównoważyć wykorzystanie dysków.
  • Mam dużo danych i chcę widzieć oznaki postępu.

Jak sprawdzić, czy osiągnięto równomierne wykorzystanie dysku?

Używaj narzędzia iostat przez pewien czas (np. iostat -m 5) I sprawdzaj zapisy. Jeśli są takie same, osiągnąłeś równomierny spread. Nie są idealnie nawet na poniższym zrzucie ekranu, ponieważ korzystam z pary 4 TB z 2 parami dysków 3 TB w RAID 10, więc dwa 4 zostaną zapisane nieco więcej. wprowadź opis zdjęcia tutaj

Jeśli wykorzystanie dysku jest „niezrównoważone”, iostat pokaże poniżej coś więcej, jak zrzut ekranu, na którym nowe dyski są zapisywane nieproporcjonalnie. Możesz także powiedzieć, że są to nowe dyski, ponieważ odczyty mają wartość 0, ponieważ nie zawierają na nich danych. wprowadź opis zdjęcia tutaj

Skrypt nie jest doskonały, tylko obejście, ale w międzyczasie działa dla mnie, dopóki ZFS pewnego dnia nie wdroży funkcji równoważenia, takiej jak BTRFS (kciuki).


O mój ... Wow ...
ewwhite

0

Cóż, to trochę włamanie, ale biorąc pod uwagę, że zatrzymałeś maszynę za pomocą zvol, możesz zfs wysłać system plików do lokalnego pliku na localhost o nazwie bar.zvol, a następnie ponownie otrzymać system plików. To powinno przywrócić dane dla Ciebie.

zfs send tank/bar > bar.zvol

zfs receive tank/bar < bar.zvol

-1

najlepszym rozwiązaniem, jakie znalazłem, było zduplikowanie połowy danych w rozszerzonej puli, a następnie usunięcie oryginalnych zduplikowanych danych.


3
Czy możesz rozwinąć?
ewwhite

@reco: zvols nie są systemami plików, więc nie można na nich usuwać ani kopiować danych. Możesz zastąpić dane, ale to by je zepsuło, chyba że zrobisz to z tą samą zawartością, która skutecznie obejmie dane w podstawowych woluminach, ale to właśnie sugerował ewwhite rok temu.
jlliagre

tak masz rację. rozglądałem się i badałem ten sam temat. zdałem sobie sprawę, że przy zfs redystrybucja danych przez vdevs nie jest potrzebna. ale jeśli nadal chcesz z jakiegokolwiek powodu powielanie danych i usuwanie oryginałów przyspieszy to, co ZFs zrobiłby z czasem.
reco

1
Redystrybucja danych za pośrednictwem vdevs jest uzasadnionym żądaniem. Obawiam się, że wciąż brakuje Ci pytania o Zvols, a nie systemy plików. Nie można powielać ani usuwać danych z woluminu, co nie ma sensu.
jlliagre

cześć jlliagre. tak, masz rację przepraszam
reco
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.