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 *
Facciamo 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