ZFS: Jak przywrócić prawidłową liczbę kopii po utracie dysku?

12

W przypadku ZFS, jeśli masz, copies=2a następnie straciłeś dysk zawierający niektóre z tych kopii, jak możesz powiedzieć systemowi, że powinien utworzyć nową kopię bloków danych dla plików, których dotyczy problem? A może ZFS zaczyna dodawać bloki danych dla dodatkowych kopii, gdy tylko dowie się o złych blokach danych?

Czy peeling to zrobi?

(v0.6.0.56-rc8, pula ZFS wersja 28, system plików ZFS wersja 5, Ubuntu 11.10)

James Moore
źródło

Odpowiedzi:

10

„kopia = 2” (lub 3) jest bardziej zaprojektowana do używania z pulami bez nadmiarowości (pojedynczy dysk lub paski). Celem jest odzyskanie drobnego uszkodzenia dysku, a nie awarii całego urządzenia. W tym drugim przypadku puli nie można zamontować, więc nie można przywrócić bloków ditto.

Jeśli masz nadmiarowość (dublowanie / raidz / raidz2 / raidz3), bloki ditto nie różnią się od innych i szorowanie / resilvering je odtworzy.

jlliagre
źródło
Jest to bezpośrednio sprzeczne z tym, co mówi @Redmumba - a Redmumba zapewnia linki do kodu. Czy możesz podać kilka źródeł tego, co mówisz? W szczególności chciałbym zobaczyć dobre cytaty, dlaczego uważasz, że copy = N nie poradzi sobie z awarią całego urządzenia - to nie pasuje do niczego, co przeczytałem.
James Moore,
1
@James Moore Po awarii całego urządzenia na tym dysku nie zostaną zapisane żadne bloki. Nadmiarowość nie występuje na poziomie puli, więc nie ma możliwości zastąpienia uszkodzonego dysku nowym. Jedyną metodą prawidłowego przywrócenia tej sytuacji byłoby wykonanie pełnej kopii zapasowej puli, odtworzenie jej przy użyciu sprawnych urządzeń i przywrócenie z kopii zapasowej, przy jednoczesnym upewnieniu się, że nie nastąpi przypadkowe ponowne uruchomienie przed pierwszą kopią zapasową. W przeciwnym razie pula może nie być importowalna, a jej dane utracone. Jest to dość duże obciążenie w porównaniu z rezerwowymi pulami, w których odzyskiwanie uszkodzonego dysku odbywa się on-line i przetrwa ponowne uruchomienie.
jlliagre,
1
Oto odniesienie: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/ For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). ... Zakładam, że kopie = 2 lub 3 nie są uważane za konfigurację nadmiarową.
jlliagre
1
Należy jednak pamiętać o tym, że jeśli pierwotnie copies=1to zrobiłeś copies=2i poprawiłeś, prawdopodobnie będziesz chciał później wykonać resilver / rescrub - co utworzy te instancje. Ale @jilliagre jest poprawne: bloki ditto nie stanowią zbędnej konfiguracji. Nie ma ŻADNEJ gwarancji, że bloki są ustawione na innym urządzeniu, nawet jeśli masz wiele urządzeń w puli.
Andrew M.
1
funkcja „kopia = N, gdzie N> 1” nie jest przeznaczona do dodawania redundancji. ma na celu rozwiązanie problemu uszkodzenia danych. wszystko napisane do ZFS jest sumowane lub haszowane. po ponownym odczytaniu suma kontrolna / skrót są weryfikowane. jeśli N = 1, błąd weryfikacji sumy kontrolnej / skrótu powoduje powrót do aplikacji. jeśli N> 1, wówczas można sprawdzić jedną z pozostałych kopii i wykorzystać ją do naprawy wszystkich innych kopii.
longneck
9

Uznałem to pytanie za bardzo intrygujące i po godzinie spędzonej na przeglądaniu dokumentacji, zagłębiłem się w kod. Oto co znalazłem.

Najpierw trochę terminologii. Bloki Ditto (które są tymi kopiami, w przeciwieństwie do kopii lustrzanych) są tworzone automatycznie podczas zapisu, ale mogą, ale nie muszą znajdować się w tym samym urządzeniu wirtualnym (vdev), co oryginalna kopia. Z drugiej strony bloki lustrzane są zawsze odzwierciedlane na innym urządzeniu wirtualnym.

Jednak kod odnosi się do obu typów bloków jako dzieci. Zobaczysz tutaj, że bloki ditto są tylko dziećmi io_vd == NULL(jest to funkcja zapisu). W przypadku bloku lustrzanego io_vdustawiono by odpowiednie urządzenie wirtualne (na przykład drugi dysk).

Mając to na uwadze, gdy dojdzie do części do czytania , traktuje wszystkie dzieci (czy to dublowane, jak i bloki ditto) jako potencjalnie niebezpieczne, jeśli nie zawiera oczekiwanych good_copies, i przepisuje je w razie potrzeby . Wygląda więc na to, że odpowiedź na twoje pytanie brzmi - tak, przepisze je, gdy będziesz mieć co najmniej jeden dobry egzemplarz i jedno z poniższych:

  • Nieoczekiwane błędy podczas próby odczytu danych,
  • Jesteś w trybie resilver lub
  • Szorujesz.

Uff! Może ktoś może wskazać wady, ale podobało mi się poznawanie ZFS podczas tego małego ćwiczenia i mam nadzieję, że to pomaga!

Andrew M.
źródło
1
Problem tkwi w odpowiedzi @ jlliagre - pula jest martwa, jeśli straci jakiekolwiek urządzenie. Fakt, że pula nadal ma wystarczającą liczbę bloków ditto, nie wydaje się mieć znaczenia. Jakiś sposób na to?
James Moore,
4
@JamesMoore możesz wymusić macierz online w stanie zdegradowanym, jeśli masz pierwszy 1 MB urządzenia, które uległo awarii. Prawdopodobnie potrzebujesz tylko metadanych z uszkodzonego urządzenia. Przetestowałem to z zpoolem w stylu jbod i działa: odzyskiwanie uszkodzonych etykiet raidz . Zrobiłem sumę md5 przed i po tym, jak zepsułem zpool, a tylko system plików copy = 1 został uszkodzony po imporcie. Kopie = 2 i kopie = 3 systemy plików idealnie do siebie pasowały.
Jodie C
2

@jlliagre i inni, którzy wydają się myśleć, że cały zpool umrze, jeśli umrze jeden z dysków (vdevs), ale pula nie będzie redundantna (mirror / raidz). To nie jest prawda; pula z wieloma dyskami zawsze przetrwa pojedynczą całkowitą awarię dysku, nawet jeśli nie jest kopią lustrzaną lub podniesioną.

Metadane ZFS są zawsze kopiowane co najmniej 2 razy, więc całkowita awaria całego dysku (lub dowolnej jego części) nie spowoduje awarii systemu plików. Co więcej, wiele plików, zwłaszcza mniejszych, nie zostanie rozłożonych na wszystkie dyski, a zatem niekoniecznie zostanie uszkodzony przez awarię dysku. OP pyta o przypadek puli wielodyskowej wykorzystującej bloki ditto (kopie danych użytkownika> 1). W tym przypadku pojedyncza kompletna awaria dysku nigdy nie powinna prowadzić do utraty danych.ZFS zawsze będzie próbował umieścić bloki ditto z dala od oryginalnego bloku, a dla pul z wieloma vdev, zawsze oznacza to inny vdev (wyjątek może stanowić sytuacja, w której jeden vdev jest większy niż 50% puli, co byłoby bardzo nietypowe) . Metadane systemu plików są również zawsze kopiowane +1 lub +2 razy więcej niż poziom ditto , więc zawsze przetrwa awarię dysku. Ponadto, jeśli masz pulę większą niż trzy dyski, powinieneś być w stanie stracić do połowy z nich bez utraty danych; ZFS przechowuje bloki ditto na następnym dysku tak długo, jak długo nie stracisz dwóch sąsiadujących dysków, nigdy nie utracisz danych. (trzy awarie dysku dla ditto = 2).

Jeśli istnieje wystarczająca liczba kopii danych, aby uzyskać dostęp do pliku (bez względu na to, czy kopie te pochodzą z bloków ditto, kopii lustrzanej lub raidz), wszystkie brakujące kopie danych są naprawiane po uzyskaniu dostępu do pliku. To jest cel peelingu; przeczytaj wszystkie dane i napraw wszystkie złe, korzystając z nadmiarowych kopii. Aby więc odpowiedzieć bezpośrednio na pytanie OP, wystarczy wymienić po wymianie uszkodzonego dysku, a wszystkie kopie zostaną przywrócone.

Jak zawsze, możesz łatwo eksperymentować z pojęciami, tworząc pule, których vdevs do przechowywania kopii zapasowych są zwykłymi rzadkimi plikami. Usuwając lub uszkadzając pliki vdev, można symulować wszelkiego rodzaju awarie, a także weryfikować integralność puli, systemów plików i danych po drodze.

EDYCJA: po eksperymentach wygląda na to, że zfs zawiedzie pulę, jeśli dysk ulegnie awarii w wielodyskowej nie nadmiarowej puli z kopiami> = 2. Uszkodzenie danych małżeńskich na co najmniej jednym dysku powinno pozostać do przeżycia i powinno zostać naprawione przez czyszczenie.

Aaron B.
źródło
Przerażające w tego rodzaju eksperymentach jest to, że doskonale nadają się do powiedzenia mi, że konfiguracja zakończy się niepowodzeniem natychmiast lub przynajmniej szybko. Nie są tak świetne do powiedzenia mi, że konfiguracja czasami zawiedzie. W każdym razie nie jest jasne, jak przywrócić pulę, która ma awarię; Próbowałem skonfigurować taką pulę z trzema rzadkimi plikami i usunięcie jednego z nielicznych plików wydaje się być śmiertelne dla całej puli. zpool replace nie zastąpi nieudanego pliku, scrubowanie zpool na 5% (i są to bardzo małe pule), a strona błędów na illumos.org/msg/ZFS-8000-5E nie jest optymistyczna.
James Moore,
Miałem podobny wynik do moich eksperymentów, wykonanych dopiero po mojej odpowiedzi. Zwykle używam tylko raidz i odpowiadam na podstawie informacji z wiarygodnych źródeł (blogów Oracle). Nie wierzę już, że wielopłytowa pula typu JBOD z kopiami> 1 może przetrwać awarię dysku.
Aaron B,