RICOSTRUIRE L’ ARRAY

RICOSTRUIRE L’ ARRAY ……   ……. …

Sono passati diversi mesi da quando utilizziamo i vari servizi di storage sui quali distribuiamo i nostri dati opportunamente cifrati, ma …. aimè, il servizio XXX ha deciso di chiuderci il rubinetto, analizzando la nostra struttura dati manca un contenitore all’appello, manca il contenitore N° 5. Dopo aver insultato per benino ad alta voce il gestore del servizio di cloud che hostava il contenitore N° 5 ci prepariamo a ricostruire l’array.
Poiché questa in realtà è una simulazione vado a cancellare fisicamente il contenitore N°5 in modo da simulare il disastro.
# cd /work/disk5/
# rm -rf *

RICOSTRUIRE L' ARRAYFacciamo una pernacchia per far capire che non ce ne frega niente e poi cominciamo:
Cerchiamo un altro servizio di storage che possa hostare un file contenitore, se ci vuole troppo tempo ce lo costruiamo in locale e lo montiamo come se fosse remoto, diversamente lo montiamo in remoto come se nulla fosse.

ANDIAMO A RICOSTRUIRE L’ ARRAY
A questo punto pratichiamo un reboot della macchina sulla quale dobbiamo ricostruire l’array, al riavvio mancherà completamente la nostra struttura dati pertanto dovremo modificarci il file /script/riassembla.sh che in precedenza puntava il contenitore N° 5 al servizio che ci hanno chiuso e lo facciamo puntare al nuovo servizio per il contenitore N°5.
# cd /work/disk5/
# truncate -s GRANDEZZA DEGLI ALTRI CONTENITORI disk5.img (o cavallo_arrapato.iso), il nome deve essere quello che abbiamo nomenclato nello script di avvio.
Gli diamo una incasinata per stare tranquilli
# shred -n 1 -v disk5.img
montiamo i vari contenitori negli appositi loop
poi controlliamo che ogni contenitore sia al suo posto
# losetup -a shows
/dev/loop0: [51713]:202166898 (/work/disk0/disk0.img)
/dev/loop1: [51713]:201350904 (/work/disk1/disk1.img)
/dev/loop2: [51713]:202515261 (/work/disk2/disk2.img)
/dev/loop3: [51713]:202516949 (/work/disk3/disk3.img)
/dev/loop4: [51713]:202166863 (/work/disk4/disk4.img)
/dev/loop5: [51713]:134798692 (/work/disk5/disk5.img)
/dev/loop6: [51713]:202158561 (/work/disk6/disk6.img)
/dev/loop7: [51713]:202158562 (/work/disk7/disk7.img)
/dev/loop8: [51713]:202158563 (/work/disk8/disk8.img)
/dev/loop9: [51713]:202158564 (/work/disk9/disk9.img)

Benissimo ognuno al posto suo, adesso è ora di ricostruire l’array riassemblando i vari contenitori in un unico disco virtuale.
Adesso dobbiamo ricostruire l’array in degrade mode, ovvero informando il sistema che il contenitore N°5 ha avuto dei problemi.
# mdadm –assemble –run –verbose /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4 /dev/loop6 /dev/loop7 /dev/loop8 /dev/loop9
Come si può vedere ho inserito tutti i loop tranne il loop 5, questo me lo tengo per dopo (anche perché non contiene dati utili)
Dimao un occhio al mdstat e controlliamo il nostro RAID 6
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active (auto-read-only) raid6 loop0[0] loop9[10](S) loop8[9](S) loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/7] [UUUUU_UU]

unused devices:
Perfetto i dischi di spare sono al loro posto il raid è funzionante senza un disco, contando le U manca proprio il disco 5
Che adesso andremo ad aggiungere nella catena
# mdadm –add /dev/md0 /dev/loop5
mdadm: added /dev/loop5
Diamo un ochio al nostro mdstat e GODIAMO…
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop5[11] loop0[0] loop9[10](S) loop8[9](S) loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/7] [UUUUU_UU]
[==>………………] recovery = 11.1% (117492/1047552) finish=2.5min speed=6183K/sec

unused devices:
#
Il sistema sta ricostruendo la catena, al termine riavvieremo per una nostra tranquillità, ma non è RICOSTRUIRE L’ ARRAYnecessario.
Quando il sistema avrà terminato di ricostruire l’array diamo un sano ed onesto reboot
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop5[11] loop0[0] loop9[10](S) loop8[9](S) loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/7] [UUUUU_UU]
[===================>.] recovery = 98.9% (1037628/1047552) finish=0.0min speed=5794K/sec

unused devices:

Ci siamo quasi …  Attendiamo un pochino di tempo …..
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop5[11] loop0[0] loop9[10](S) loop8[9](S) loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:
Il sistema ha terminato di ricostruire l’aray
# reboot
Al riavvio lanciamo il nostro script e ci ritroveremo tutti i dati come se nulla fosse mai accaduto.
# /script/riassembla.sh
diamo un occhio al nostro array
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop9[10](S) loop8[9](S) loop0[0] loop7[7] loop6[6] loop5[11] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:
#
Perfeto andando in /disk0 troviamo tutti i nostri file.

Ma cosa è successo realmente durante il periodo di tempo che è trascorso da quando il gestore del servizio XXX ci ha chiuso il rubinetto ed il momento in cui ce ne siamo accorti?
Andiamo a vedere:
# cd /work/disk5
# rm -rf *
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop9[10] loop8[9](S) loop0[0] loop7[7] loop6[6] loop5[11](F) loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/7] [UUUUU_UU]
[=>……………….] recovery = 7.7% (81212/1047552) finish=2.5min speed=6247K/sec

unused devices:
#
Il sistema si è accorto che uno dei dischi che costituiscono la catena raid è venuto meno, immediatamente utilizza uno dei due dischi di hotspare per ricostruire l’array.
In questo esempio ha attivato il loop9 e lo sta sostituendo al disco 5.
Ributtiamo un occhio al nostro mdstat
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop9[10] loop8[9](S) loop0[0] loop7[7] loop6[6] loop5[11](F) loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:
#
Adesso la catena funziona come se niente fosse accaduto, accanto al disco 5 c’è una F, questa sta per FAIL, la S accanto al disco 9 è sparita, la S sta per SPARE.
Chiaramente potremmo continuare a lavorare in questo modo, il problema è che ci rimane un solo disco di spare, quindi dobbiamo provvedere nel più breve tempo possibile a ripristinare il disco 5.
Se riusciamo a trovare il contenitore da sostituire al disco 5, lo possiamo fare anche a caldo.
Rimuoviamo il loop incriminato
# losetup -d /dev/loop5
rigeneriamo il contenitore
# cd /work/disk5
# truncate -s 1G disk5.img
# shred -n 1 -v disk5.img
Informiamo la catena che il disco 5 non esiste più
# mdadm –remove /dev/md0 /dev/loop5
Controlliamo i loop
# losetup -a
/dev/loop0: [51713]:202166898 (/work/disk0/disk0.img)
/dev/loop1: [51713]:201350904 (/work/disk1/disk1.img)
/dev/loop2: [51713]:202515261 (/work/disk2/disk2.img)
/dev/loop3: [51713]:202516949 (/work/disk3/disk3.img)
/dev/loop4: [51713]:202166863 (/work/disk4/disk4.img)
/dev/loop6: [51713]:202158561 (/work/disk6/disk6.img)
/dev/loop7: [51713]:202158562 (/work/disk7/disk7.img)
/dev/loop8: [51713]:202158563 (/work/disk8/disk8.img)
/dev/loop9: [51713]:202158564 (/work/disk9/disk9.img)
#
Il disco 5 manca, perfetto
rimontiamo il disco 5 in loop
# losetup loop5 /work/disk5/disk5.img
Rimettiamo il disco 5 al suo posto.
# mdadm –manage /dev/md0 –add /dev/loop5
mdadm: added /dev/loop5
Diamo un’ occhiata ala nostra catena e notiamo che il disco 5 è diventato di spare
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop5[11](S) loop9[10] loop8[9](S) loop0[0] loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:

A questo punto ci basta informare il sistema di degradare volontariamente il disco 9 ed il disco 5 ritonerà nella sua posizione originale.
# mdadm /dev/md0 –fail /dev/loop9
mdadm: set /dev/loop9 faulty in /dev/md0
#
Guardiamo cosa accade alla catena raid 6
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop5[11] loop9[10](F) loop8[9](S) loop0[0] loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/7] [UUUUU_UU]
[=>……………….] recovery = 8.8% (93172/1047552) finish=2.5min speed=6211K/sec

unused devices:
#
Togliamo il disco guasto
# mdadm –remove /dev/md0 /dev/loop9
mdadm: hot removed /dev/loop9 from /dev/md0
E ricontrolliamo il nostro mdstat
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop5[11] loop8[9](S) loop0[0] loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:
#
I dischi da 1 a 8 sono al loro psto, riaggiungiamo il disco 9 come spare ed il gioco è fatto
# mdadm –manage /dev/md0 –add /dev/loop9
mdadm: added /dev/loop9
# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid6 loop9[10](S) loop5[11] loop8[9](S) loop0[0] loop7[7] loop6[6] loop4[8] loop3[3] loop2[2] loop1[1]
6285312 blocks super 1.2 level 6, 512k chunk, algorithm 2 [8/8] [UUUUUUUU]

unused devices:
#
Tutti i device sono al loro posto ed il sistema è riuscito a ricostruire l’array da solo, in trasparenza e senza che nessuno se ne accorgesse.

Con questo sistema è facile non accorgersi di un disco degradato, è importante, quindi controllare spesso la salute del raid 6 e ricostruire l’array nel più breve tempo possibile.

PRIMA DI MORIRE, RICORDATI DI RICOSTRUIRE L’ ARRAY  
Come tanti anche io ho una inutile pagina facebook, se volete, potete seguirmi anche qui. Chiaramente dopo essersi ricordati di RICOSTRUIRE L’ ARRAY


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.