RAID (mdadm) - Co się stanie, jeśli dyski będą niedopasowane?

15

Pytanie 1 - Zanim odpowiesz „zabiera tylko mniejszy dysk”, wysłuchaj mnie szybko. Moje 3 TB WD Reds mają pojemność 3001 GB. Załóżmy, że skonfigurowałem dublowanie za pośrednictwem mdadm dla sdb1 i sdc1, które obejmują 100% dysku. Ale nagle jeden z dysków zawodzi. Zamiennikiem jest 3 TB, o wadze 3000 GB. Co się stanie, gdy włożę dysk, który jest mniejszy niż obecnie dostępny w macierzy? Wiem, że dzięki nowej macierzy używającej 3000 vs 3001 zbudowałoby to tablicę na 3000. Ale jak powiedziałem, co z obecną macierzą @ 3001 i dodam mniejszy dysk? Czy podczas przebudowy zmienia się struktura, aby uzyskać rozmiar 3000 GB?

Pytanie 2 - W przypadku, gdy nie mogę dodać 3000 GB do tablicy z istniejącym 3001 GB i po prostu zmniejszyć do 3000 ... czy mogę nieco zmienić rozmiar 3001?

Pytanie 3 - Lub lepszy pomysł. Co się stanie, jeśli zmniejszę rozmiar dysku 3 TB do 2999 GB? W ten sposób, czy dysk jest krótszy o 1 MB, 1 bajt, 10 KB, nie ma znaczenia, zawsze wybierze „mniejszy” dysk o pojemności 2999 GB.

JaSauders
źródło

Odpowiedzi:

28

Natrafiłem na tę odpowiedź przez pomyłkę, ale jeśli ktoś jest ciekawy, oto odpowiedź poparta eksperymentami.

Krótka wersja

Pytanie dodatkowe: czy mogę utworzyć md(4)macierz RAID z urządzeń blokowych o nierównej wielkości? Tak, ale macierz RAID będzie miała rozmiar najmniejszego urządzenia blokowego (plus pewne koszty ogólne na własne utrzymanie). Jeśli rozmiary urządzeń nie różnią się od siebie o 1%, pojawi się ostrzeżenie.

Pytanie 1: Czy mogę dodać do istniejącej md(4)macierzy RAID urządzenie mniejsze niż najmniejszy aktualny członek? Nie, przykro mi. mdadmcałkowicie odmówi, aby to zrobić, aby chronić twoje dane.

Pytanie 2: czy możesz zmienić rozmiar istniejącej tablicy MD? Tak (przeczytaj mdadmmanpge!), Ale może nie być warte wysiłku. Będziesz musiał wykonać kopię zapasową wszystkiego, następnie zmienić rozmiar zawartości urządzenia RAID, a następnie zmienić rozmiar samego urządzenia - wszystko to jest dość podatne na błędy, błędne obliczenia i inne rzeczy, które będą cię kosztować twoje dane (bolesne doświadczenie rozmowy) .

To nie jest warte ryzyka i wysiłku. Jeśli masz nowy, pusty dysk, oto jak go zmienić, a także zachować jedną lub dwie kopie wszystkich danych w stanie nienaruszonym przez cały czas (zakładając, że masz 2-dyskowy RAID1):

  1. Utwórz na nim nową md(4)tablicę (bez jednego dysku).
  2. Odtwórz strukturę zawartości tablicy (Crypto, LVM, tabele partycji, dowolna ich kombinacja, cokolwiek unosi twoją łódź).
  3. Skopiuj dane z istniejącego dysku na nowy.
  4. Uruchom ponownie, używając nowego dysku.
  5. Wyczyść tablicę partycji starego dysku (lub md(4)wyzeruj superblok). W razie potrzeby utwórz wymagane partycje zgodne ze schematem na nowym dysku.
  6. Dodaj stary dysk do nowej tablicy.
  7. Poczekaj, aż elementy tablicy zostaną zsynchronizowane. Napić się kawy Leć do Ameryki Łacińskiej i wybierz własne ziarna kawy. :) (Jeśli mieszkasz w Ameryce Łacińskiej, wybierz się do Afryki).

Uwaga: tak, jest to ta sama technika 0xC0000022L opisana w jego odpowiedzi.

Pytanie 3. Co zrobić, jeśli dysk ma 1G? :) Nie martw się tym. Możliwe, że twój dysk zastępczy będzie większy. W rzeczywistości przy strategii takiej jak wyżej opłaca się uzyskać tańsze większe dyski za każdym razem, gdy jeden z nich ulegnie awarii (lub za tańszą aktualizację). Możesz uzyskać stopniowe uaktualnienie.

Dowód eksperymentalny

Zestaw doświadczalny

Najpierw sfałszujmy niektóre urządzenia blokowe. Użyjemy /tmp/sdxi /tmp/sdy(każde 100 mln) i /tmp/sdz(99 mln).

cd /tmp
dd if=/dev/zero of=sdx bs=1M count=100
sudo losetup -f sdx
dd if=/dev/zero of=sdy bs=1M count=100
sudo losetup -f sdy
dd if=/dev/zero of=sdz bs=1M count=99  # Here's a smaller one!
sudo losetup -f sdz

Te trzy zestawy plików jak trzech urządzeń blokowych sprzężenia zwrotnego: /dev/loop0, /dev/loop1i /dev/loop2, odwzorowywania sdx, sdyi sdzodpowiednio. Sprawdźmy rozmiary:

sudo grep loop[012] /proc/partitions
   7        0     102400 loop0
   7        1     102400 loop1
   7        2     101376 loop2

Zgodnie z oczekiwaniami mamy dwa urządzenia pętlowe o dokładności 100 M (102400 KiB = 100 MiB) i jedno o pojemności 99 M (dokładnie 99 × 1024 bloków 1K).

Tworzenie macierzy RAID z urządzeń o identycznych rozmiarach

Tutaj idzie:

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop1
mdadm: array /dev/md100 started.

Sprawdź rozmiar:

sudo grep md100 /proc/partitions
   9      100     102272 md100

To precicely czego oczekujemy: jedno spojrzenie na instrukcji mdadm przypomina nam, że wersja 1.2 metadane potrwać 128K: 128 + 102272 = 102400. Teraz zniszczyć go w ramach przygotowań do drugiego eksperymentu.

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop1

Tworzenie macierzy RAID z urządzeń o nierównej wielkości

Tym razem użyjemy małego urządzenia blokowego.

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 /dev/loop2
mdadm: largest drive (/dev/loop0) exceeds size (101248K) by more than 1%
Continue creating array? y
mdadm: array /dev/md100 started.

Zostaliśmy ostrzeżeni, ale tablica została stworzona. Sprawdźmy rozmiar:

sudo grep md100 /proc/partitions
   9      100     101248 md100

Dostajemy tutaj 101 248 bloków. 101248 + 128 = 101376 = 99 × 1024. Powierzchnia użytkowa to najmniejsze urządzenie (plus metadane RAID 128K). Sprowadźmy to jeszcze raz do naszego ostatniego eksperymentu:

sudo mdadm --stop /dev/md100
sudo mdadm --misc --zero-superblock /dev/loop0
sudo mdadm --misc --zero-superblock /dev/loop2

I wreszcie: dodanie mniejszego urządzenia do działającej macierzy

Najpierw stwórzmy macierz RAID1 tylko z jednym ze 100M dysków. Tablica ulegnie degradacji, ale tak naprawdę nas to nie obchodzi. Chcemy tylko rozpoczętą tablicę. Te missingsłowa kluczowe to symbol zastępczy, który mówi: „Nie mam urządzenie do was jeszcze, zacznij teraz he tablicę i dodam jedną później”.

sudo mdadm  --create -e 1.2 -n 2 -l 1 /dev/md100 /dev/loop0 missing

Ponownie sprawdźmy rozmiar:

sudo grep md100 /proc/partitions
   9      100     102272 md100

Rzeczywiście, brakuje 128K i 102400 bloków. Dodawanie mniejszego dysku:

sudo mdadm  --add /dev/md100 /dev/loop2
mdadm: /dev/loop2 not large enough to join array

Bum! Nie pozwoli nam, a błąd jest bardzo wyraźny.

Alexios
źródło
Synology Hybrid RAID (SHR) rozwiązuje ten problem.
Denis Denisov
1

Istnieje kilka sposobów konfigurowania mdXurządzeń. Metodą byłoby użycie gdisk(lub sgdiskjeśli wolisz wersję tylko wiersza poleceń) do podzielenia go na partycje jako GPT. Jeśli chcesz uruchomić system z tablicy, utwórz „partycję rozruchową systemu BIOS”, wpisz kod ef02. Jest to konieczne tylko, jeśli chcesz uruchomić tę tablicę, w przeciwnym razie nie musisz się tym przejmować. Następnie utwórz partycję tego samego rozmiaru lub mniejszą niż najmniejszy dysk, który ma zostać dodany do tablicy. Na koniec skopiuj dane GPT na inny dysk (menu eksperta w gdisk, za pomocą x, a następnieu określ urządzenie docelowe). To destrukcyjny proces.

Powinno być możliwe - jeśli system plików na to pozwala - zmienić rozmiar istniejącej partycji na coś mniejszego, a następnie użyć tej samej metody do skopiowania danych GPT. To jednak prowadzi cię do kerfuffla. Ponieważ teraz masz dwa dyski, ale wciąż nie masz mdXurządzenia. Jeden z nich musi być przygotowany jako mdXpartycjonowany (co sugerowałem powyżej) lub dyskowy), a następnie dane muszą zostać przeniesione z istniejącego dysku na ten dysk.

Więc:

  1. big disk ( /dev/sda) zawiera dane, dane są mniejsze niż 3001 GB, partycje nie
  2. mniejszy dysk /dev/sdbzostanie dodany do systemu
  3. dzielisz za /dev/sdbpomocągdisk
  4. tworzysz tablicę z każdej odpowiedniej partycji ( mdadm -C /dev/md2 -l 1 -n 1 /dev/sdb2)
  5. tworzysz systemy plików na nowych tablicach
  6. kopiujesz wszystkie dane, upewniając się, że twój system będzie gotowy do uruchomienia z dysku GPT i sprawi, że GRUB2 zrozumie konsekwencje (patrz poniżej)
  7. skopiujesz dane partycjonowania GPT z na /dev/sdbdo/dev/sda
  8. dodajesz „surowe” partycje z /dev/sdaistniejących tablic
  9. czekasz na /proc/mdstatpokazanie, że synchronizacja została zakończona

Jeśli wykonałeś wszystkie kroki, powinieneś być w stanie uruchomić się w nowym systemie z tablic mdX. Na wszelki wypadek miej pod ręką ratunkową płytę CD lub opcję rozruchu PXE.


GRUB2 nie będzie w stanie rozpoznać konfiguracji z ręki. Potrzebujesz więc „magii”. Oto jedna linijka:

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

Albo bądźmy bardziej gadatliwi:

for i in /dev/disk/by-id/md-uuid-*
do
  DEV=$(readlink $i)
  echo "(${DEV##*/}) $i"
done|sort|sudo tee /boot/grub/devicemap

Spowoduje /boot/grub/devicemapto utworzenie (lub zastąpienie) wartości domyślnej informacją GRUB2, gdzie znaleźć każdy odpowiedni dysk. Wynik byłby mniej więcej taki:

(md0) /dev/disk/by-id/md-uuid-...
(md2) /dev/disk/by-id/md-uuid-...
(md3) /dev/disk/by-id/md-uuid-...
(md4) /dev/disk/by-id/md-uuid-...

Jeśli korzystasz ze starszej wersji GRUB, musisz również utworzyć „partycję rozruchową systemu BIOS” z metadanymi w wersji 0.9, używając, mdadm -e 0 ...a proces będzie się różnić. Jednak tego nie zrobiłem.

0xC0000022L
źródło
1
Dzięki za odpowiedź. Ta tablica jest właściwie tylko do surowego przechowywania na moim serwerze, więc nie będzie obsługiwać rozruchu ani nic podobnego. Byłem zaniepokojony mieszaniem i dopasowywaniem dysków twardych o różnych rozmiarach w dalszej części gry. Mam na myśli, co by się stało, jeśli mam sdb1 @ 3001 GB i sdc1 @ 3001 GB, ale sdc1 umiera, a wymiana wynosi 3000 GB? Czy redukcja sdb1 do 3000? Czy rozmiar tablicy @ / dev / md0 zmniejsza się do 3000 GB? Im więcej o tym myślę, tym bardziej sensowne jest pozostawienie miejsca na końcu, takiego jak powyższy przykład 2999 - w ten sposób powinien usunąć ból głowy. Chyba że coś mi umknie?
JaSauders
1
Właściwie, zakładając, że tutaj macierz RAID poziomu 1, mdadmodmówiłaby zbudowania tablicy w pierwszej kolejności, jeśli jest niezgodna. W RAID 5 w końcu potrzebujesz więcej dysków, aw RAID 0 nie przejmujesz się tym, dlatego założyłem RAID 1. Tak, sensownie jest pozostawić miejsce.
0xC0000022L
Nie zamierzam bić konia, ale jestem trochę niepewny co do „niezgodnego” stwierdzenia, które wypowiedziałeś. Co byłoby niezgodne? Czy w moim przykładzie odwoływałeś się do różnic wielkości w kategoriach 3000 GB vs. 3001 GB? Tak czy inaczej, po prostu uruchomiłem moją tablicę z każdą partycją o rozmiarze 2999 GB, mimo że każdy dysk miał 3001 GB. To powinno po prostu usunąć wszelkie bóle głowy, które spadają na linię w przypadku, gdy nie mogę uzyskać identycznych dysków zastępczych. Doceń swój wgląd!
JaSauders
@JaSauders: Myślę, że jeden GiB mniej więcej byłby już niezgodny. Ale szczerze mówiąc, nie wiem, gdzie jest limit. Wiem jednak, że niewielkie różnice wielkości będą tolerowane. Do wszystkiego innego musisz migrować w sposób podobny do tego, co opisałem.
0xC0000022L
@ 0xC0000022L: mdadmtoleruje arbitralną różnicę wielkości 1% w elementach tablicy.
Alexios