Come monitorare il raid del filesystem BTRFS per errori?


11

Ho visto della documentazione su un demone che può eseguire un programma / script per vari eventi BTRFS, ma non riesco più a trovarlo.

Come posso eseguire uno script / programma in caso di guasto di un'unità per un array raid1 BTRFS? Vorrei eseguire uno script su qualsiasi errore che fungesse da avvertimento tempestivo per un'unità potenzialmente guasta, ma l'effettivo guasto dell'unità è molto importante. Vorrei smontare il filesystem a quel punto (se non è quello che fa BTRFS) e impostare un allarme.


1
Perché vorresti che il sistema smontasse raid1 in caso di guasto dell'unità? Che tipo di battiti lo scopo non è vero? Voglio dire, potresti avere qualche motivo per farlo, ma per impostazione predefinita non dovrebbe farlo
Petr

Ho avuto un RAID5 con due unità guaste in breve tempo l'una dall'altra. Stavo cercando di creare un nuovo sistema utilizzando la funzionalità di raid mirror di BTRFS e reagire rapidamente ai problemi di guida (non necessariamente ai guasti di guida) per ridurre la possibilità di ulteriori danni fornendo allo stesso tempo il tempo per affrontare la causa originale. Spero che un giorno il mirror N-way di BTRFS funzioni bene.
Ioan,

@Ioan: questo è il motivo per cui RAID-5 non è sempre raccomandato e si dovrebbe usare RAID-6. Un resilver metterà un sacco di stress su tutte le unità, il che potrebbe causare il fallimento di una seconda unità, che potrebbe essere danneggiata, durante questo processo. A differenza di RAID-5, RAID-6 può gestirlo (è anche possibile rimontarlo in sola lettura e aggiornare il backup prima di sostituire la seconda unità).
basic6

Risposte:


18

Oltre al normale sistema di registrazione, BTRFS ha un comando stats , che tiene traccia degli errori (inclusi errori di lettura, scrittura e corruzione / checksum) per unità:

# btrfs device stats /
[/dev/mapper/luks-123].write_io_errs   0
[/dev/mapper/luks-123].read_io_errs    0
[/dev/mapper/luks-123].flush_io_errs   0
[/dev/mapper/luks-123].corruption_errs 0
[/dev/mapper/luks-123].generation_errs 0

Quindi potresti creare un semplice cronjob root:

MAILTO=admin@myserver.com
@hourly /sbin/btrfs device stats /data | grep -vE ' 0$'

Questo verificherà il numero di errori positivi ogni ora e ti invierà un'e-mail. Ovviamente, verificheresti un tale scenario (ad esempio causando corruzione o rimuovendo il grep) per verificare che la notifica e-mail funzioni.

Inoltre, con filesystem avanzati come BTRFS (con checksum) è spesso consigliabile pianificare uno scrub ogni paio di settimane per rilevare la corruzione silenziosa causata da un'unità guasta.

@monthly /sbin/btrfs scrub start -Bq /data

L' -Bopzione manterrà lo scrub in primo piano, in modo da vedere i risultati nell'e-mail cron che ti invia. Altrimenti, verrà eseguito in background e dovresti ricordare di controllare i risultati manualmente poiché non sarebbero presenti nell'email.

Aggiornamento : grep migliorato come suggerito da Michael Kjörling, grazie.

Aggiornamento 2 : note aggiuntive sullo scrubbing rispetto alle normali operazioni di lettura (questo non si applica solo a BTRFS):
Come sottolineato da Ioan, uno scrub può richiedere molte ore, a seconda delle dimensioni e del tipo di array (e di altri fattori), in alcuni casi anche più di un giorno. Ed è una scansione attiva, non rileverà errori futuri - l'obiettivo di uno scrub è quello di trovare e correggere gli errori sulle unità in quel momento. Ma come con altri sistemi RAID, si consiglia di programmare scrub periodici. È vero che una tipica operazione di I / O, come la lettura di un file, verifica se i dati letti sono effettivamente corretti. Ma considera un semplice mirror: se la prima copia del file è danneggiata, forse da un'unità che sta per morire, ma la seconda copia, che è corretta, viene effettivamente letta da BTRFS, allora BTRFS non saprà che c'è corruzione su una delle unità. Questo semplicemente perché i dati richiesti sono stati ricevuti,Ciò significa che anche se si legge specificamente un file che si ritiene sia danneggiato su un'unità, non è possibile garantire che il danneggiamento venga rilevato da questa operazione di lettura.
Ora, supponiamo che BTRFS legga sempre e solo dal buon disco, non venga eseguito scrub che rilevi il danno sul disco cattivo e quindi anche il buon disco vada male - il risultato sarebbe una perdita di dati (almeno BTRFS lo saprebbe quali file sono ancora corretti e ti permetteranno comunque di leggerli). Naturalmente, questo è un esempio semplificato; in realtà, BTRFS non leggerà sempre da un'unità e ignorerà l'altra.
Ma il punto è che gli scrub periodici sono importanti perché troveranno (e correggeranno) errori che le normali operazioni di lettura non rileveranno necessariamente.

Unità guaste : poiché questa domanda è piuttosto popolare, vorrei sottolineare che questa "soluzione di monitoraggio" serve a rilevare problemi con unità probabilmente guaste (ad esempio, morire unità causando errori ma ancora accessibili).

D'altra parte, se un'unità è improvvisamente scomparsa (scollegata o completamente morta anziché morire e produrre errori), sarebbe un'unità guasta (ZFS contrassegnerebbe un'unità come GUASTO). Sfortunatamente, BTRFS potrebbe non rendersi conto che un'unità è sparita mentre il filesystem è montato, come sottolineato in questa voce della mailing list dal 09/2015 (è possibile che questo sia stato corretto):

La differenza è che abbiamo il codice per rilevare un dispositivo non presente al mount, non abbiamo (ancora) il codice per rilevarlo cadere su un filesystem montato. Perché avere un rilevamento adeguato per la scomparsa di un dispositivo non sembra essere una priorità, non ne ho idea, ma si tratta di un problema separato dal comportamento di montaggio.

https://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg46598.html

A quel tempo ci sarebbero stati un sacco di messaggi di errore in dmesg, quindi dmesg grepping potrebbe non essere affidabile.
Per un server che utilizza BTRFS, potrebbe essere un'idea avere un controllo personalizzato (cron job) che invia un avviso se almeno una delle unità nell'array RAID è sparita, cioè non è più accessibile ...


1
Qualcosa del genere non grep -vE ' 0$'sarebbe migliore?
un CVn del

@ MichaelKjörling: buona idea, ho aggiornato la mia risposta, grazie!
basic6,

Questa è una bella idea, e lo faccio come un normale controllo di integrità. Tuttavia, può richiedere molto più di un'ora per eseguire il checksum di tutti i dati. Per non parlare dell'usura dell'hardware se eseguito continuamente per rilevare gli errori. BTRFS esegue il checksum di tutte le normali operazioni del filesystem e sarebbe un modo più efficiente per reagire immediatamente a esse.
Ioan,

@loan: hai ragione, uno scrub può funzionare per molte ore, quindi ovviamente mette a dura prova le unità. Ma è fatto per rilevare la corruzione silenziosa, quindi puoi sostituire un'unità guasta prima che anche un'altra vada a male. La corruzione silenziosa non si verifica durante le normali operazioni fs, quindi non verrai informato automaticamente.
basic6

@ basic6: Assolutamente, e questo è fantastico per questo. Tuttavia, non fa nulla per rilevare errori durante il normale funzionamento, come un array BTRFS degradato, fino allo scrub successivo. La corruzione silenziosa può essere gestita utilizzando uno scrub mensile per efficienza, ma è troppo lungo per altri errori.
Ioan,

4

A partire da btrfs-progs v4.11.1 stats ha l'opzione --check che restituirà un valore diverso da zero se uno qualsiasi dei valori non è zero, eliminando la necessità di regex.

statistiche del dispositivo -c /


3

Non farei affidamento sul comando stats per la notifica degli errori, perché questo comando non restituisce alcun errore se un'unità si spegne improvvisamente. Puoi testarlo scollegando un cavo sata o tirando un disco - non raccomandato con un file system importante.

btrfs device stats /

Dopo un riavvio, btrfs mostra le unità mancanti, ma potrebbe essere troppo tardi.

btrfs fi show

2

Non sembra esserci un demone o un'utilità che segnala ufficialmente gli eventi BTRFS per la gestione degli utenti. L'alternativa più vicina è monitorare il registro di sistema per i messaggi da BTRFS e reagire di conseguenza.

http://marc.merlins.org/perso/btrfs/post_2014-03-19_Btrfs-Tips_-Btrfs-Scrub-and-Btrfs-Filesystem-Repair.html

Il link sopra fornisce maggiori dettagli per la configurazione di uno script ( secpacchetto su Debian o SEC ) progettato per il monitoraggio dei log per scopi generici per agire su messaggi di log imprevisti riguardanti BTRFS. Dipende anche da uno scrub regolarmente pianificato del filesystem per verificare la presenza di bit-rot ed emettere voci di registro come misura preventiva. Di seguito è riportato un estratto specifico dello script SEC:

Come configurare sec, correlatore di eventi per segnalare errori o avvisi del filesystem btrfs

Dopo aver installato sec.pl (apt-get install sec su debian o http://simple-evcorr.sourceforge.net/ ), installa i 2 file di configurazione di seguito.

Questo non è infallibile, si basa su una regex di messaggi noti che sono ok e riporta tutti quelli sconosciuti. È possibile estendere la regex negativa che guarda in avanti secondo necessità.

polgara:~\# cat /etc/default/sec  
\#Defaults for sec  
RUN_DAEMON="yes"  
DAEMON_ARGS="-conf=/etc/sec.conf -input=/var/log/syslog -pid=/var/run/sec.pid -detach -log=/var/log/sec.log"

polgara:~# cat /etc/sec.conf  
\# http://simple-evcorr.sourceforge.net/man.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article-part2.html  
type=SingleWithSuppress  
ptype=RegExp  
pattern=(?i)kernel.*btrfs: (?!disk space caching is enabled|use ssd allocation|use .* compression|unlinked .* orphans|turning on discard|device label .* devid .* transid|detected SSD devices, enabling SSD mode|has skinny extents|device label|creating UUID tree|checking UUID tree|setting .* feature flag|bdev.* flush 0, corrupt 0, gen 0)  
window=60  
desc=Btrfs unexpected log  
action=pipe '%t: $0' /usr/bin/mail -s "sec: %s" root

1

Sembra un compito per il monitoraggio del sistema. Esiste un controllo che implementa l'API del plugin Nagios chiamato: check_btrfs . Come puoi vedere nel codice sorgente, ha una funzione chiamata check_dev_statsche controlla le statistiche del dispositivo e diventerà critica se uno qualsiasi dei valori è diverso da zero. Verifica inoltre eventuali problemi di allocazione. Ciò che rimane poco chiaro è come si comporta il controllo se un disco è assente o non è in linea .

PS: il plugin è confezionato in Debian: monitoring-plugins-btrfs

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.