rilevamento e correzione del marciume dei bit con mdadm


17

Sto per riorganizzare tutti i miei HDD nel mio nas box di Linux e vorrei usare mdadm raid per la protezione dei dati e la sua flessibilità per rimodellare gli array. Tuttavia, prima di usare mdadm per questo mi piacerebbe sapere come gestisce il marciume dei bit . In particolare i tipi di bit rot che non comportano l'invio di messaggi di errore di lettura irrecuperabili dall'HDD.

Dato che probabilmente userò almeno 21 TB di HDD in 8 dischi nel nas e le varie citazioni sulle probabilità di guasti sugli HDD, sto pensando che durante una ricostruzione da un singolo errore del disco ho ragionevolmente probabilità di incontrare una qualche forma di marcescenza dei bit sui dischi rimanenti. Se si tratta di un errore di lettura irrecuperabile su 1 delle unità, che l'unità in realtà lo segnala come un errore, credo che dovrebbe andare bene con raid6 (vero?). Tuttavia, se i dati letti dal disco sono errati ma non riportati come tali dal disco, non riesco a vedere come questo possa essere corretto automaticamente anche con raid6. È qualcosa di cui dobbiamo preoccuparci? Visto l'articolo È il 2010 e RAID5 funziona ancorae le mie esperienze di successo a casa e al lavoro, le cose non sono necessariamente così difficili come le parole d'ordine e il marketing ci vorrebbero far credere, ma odio dover ripristinare dai backup solo perché un HDD non è riuscito.

Dato che i modelli di utilizzo saranno, scrivere al massimo alcune volte e leggere occasionalmente, dovrò eseguire lo scrubbing dei dati . Vedo sul wiki di archlinux i comandi mdadm per i dati che puliscono un array come

echo check > /sys/block/md0/md/sync_action

quindi per monitorare l'avanzamento

cat /proc/mdstat

Questo mi sembra che leggerà tutti i settori di tutti i dischi e verificherà che i dati corrispondano alla parità e viceversa. Anche se noto che c'è una forte enfasi nei documenti per dire che ci sono circostanze significative che l'operazione di "controllo" non sarà in grado di correggere automaticamente, rileverà e lascerà all'utente la correzione.

Quali livelli RAID mdadm dovrei scegliere per massimizzare la mia protezione da marciume bit e quali interventi di manutenzione e di protezione dovrei fare? E da cosa non mi proteggerà?

Modifica: non sto cercando di avviare un RAID vs ZFS o qualsiasi altro QA tecnologico. Voglio sapere specificamente del raid di mdadm. Questo è anche il motivo per cui lo sto chiedendo su Unix e Linux e non su SuperUser .

Modifica: è la risposta: mdadm può correggere solo gli URE che vengono segnalati dai sistemi a disco durante uno scrub dei dati e rilevare un marcio di bit silenzioso durante uno scrub ma non è possibile / non risolverlo?


Per quanto riguarda la protezione dei dati, il vantaggio principale che vedo in zfs è che pulisce le posizioni del disco dei file ogni volta che leggi un file. Questo è il motivo per cui al momento l'ho installato con zfs. Ma devo comunque eseguire regolarmente scrub completi. Ho 2 pool di zfs ciascuno con 3 dischi e voglio passare a un sistema a 8 dischi in cui qualsiasi unità può guastarsi e ci sarà ancora 1 unità ridondante e zfs non è flessibile per consentire una rimodulazione del genere. Dal momento che sto ricostruendo comunque sto visitando nuovamente mdadm.
BeowulfNode42

Finora sei stato fortunato con RAID5 / 6. Il fatto è che è il 2013 e RAID soffre ancora di un buco di scrittura. Se perdi energia dopo che i dati sono stati scritti ma prima che venga scritta la parità, hai appena corrotto i tuoi dati validi ed è possibile che con l'incoerenza anche il tuo array toast. Grazie RAID5.
Bahamat,

Il fatto è che ciò che vuoi fare è meglio farlo a livello di file system. Altrimenti, avresti bisogno di un modo per rilevare e preferibilmente correggere la marcescenza dei bit, possibilmente in una situazione di ridondanza ridotta o assente, e RAID non è adatto a questo. Non solo non vi è alcuna garanzia che non si finirà comunque con il bit rot (cosa succede se un'unità si guasta e un'altra legge il bit sbagliato dal piatto?), Ma anche il semplice RAID non ha idea di cosa siano i dati importanti e cosa solo rumore. Poiché ZFS esegue solo lo scrub dei dati di riferimento , il bit rot su una parte inutilizzata del disco diventa un problema.
un CVn il

Davvero, non puoi aspettarti di sovrapporre un file system casuale su più dischi (anche con ridondanza) per proteggerti improvvisamente da errori di archiviazione. Non sono su una santa crociata per portare ZFS alle masse (anche se penso che sia una grande invenzione, e lo uso da solo su Linux per praticamente tutto tranne la partizione di root, che è ext4 su mdraid1 per la compatibilità del software), ma Riconosco anche che il tuo è uno dei tipi di problema che ZFS è stato progettato da zero per risolvere: rilevamento garantito e, se possibile, riparazione della corruzione dei dati indipendentemente dalla causa.
un CVn il

Penso che dovresti rivedere le tue esigenze. Hai davvero bisogno della protezione bitrot anche per il caso in cui viene applicata la correzione degli errori? Sai quanto è improbabile che esista un bitrot DATO che è stato corretto anche dall'ECC del disco?
cavernicolo

Risposte:


5

Francamente, trovo piuttosto sorprendente che tu rifiutassi RAIDZ2 ZFS. Sembra soddisfare le tue esigenze quasi perfettamente, tranne per il fatto che non è Linux MD. Non sono in crociata per portare ZFS tra le masse, ma il semplice fatto è che il tuo è uno dei tipi di problemi che ZFS è stato progettato da zero per risolvere. Affidarsi al RAID (qualsiasi RAID "normale" per fornire il rilevamento e la correzione degli errori, possibilmente in una situazione di ridondanza ridotta o assente, sembra rischioso. Anche in situazioni in cui ZFS non è in grado di correggere correttamente un errore di dati, può almeno rilevare l'errore e farti sapere che c'è un problema, consentendoti di intraprendere azioni correttive.

Non è necessario eseguire scrub completi regolari con ZFS, sebbene sia una pratica consigliata. ZFS verificherà che i dati letti dal disco corrispondano a quelli scritti durante la lettura dei dati e in caso di mancata corrispondenza (a) utilizzare la ridondanza per ricostruire i dati originali o (b) segnalare un errore I / O a l'applicazione. Inoltre, lo scrubbing è un'operazione online a bassa priorità, abbastanza diversa da un controllo del file system nella maggior parte dei file system che può essere sia ad alta priorità che offline. Se stai eseguendo uno scrub e qualcosa di diverso dallo scrub vuole fare I / O, lo scrub prenderà il sedile posteriore per la durata. Uno scrub ZFS prende il posto sia di uno scrub RAID che di un metadata del file system e dei dati controllo dell'integrità, quindi è molto più accurato del semplice lavaggio dell'array RAID per rilevare l'eventuale marciume dei bit (il che non ti dice se i dati hanno alcun senso, solo che sono stati scritti correttamente dal controller RAID).

La ridondanza ZFS (RAIDZ, mirroring, ...) ha il vantaggio che non è necessario verificare la coerenza delle posizioni del disco inutilizzate durante gli scrub; durante lo scrub vengono controllati solo i dati effettivi, poiché gli strumenti percorrono la catena di blocchi di allocazione. È lo stesso di un pool non ridondante. Per un RAID "normale", è necessario controllare tutti i dati (comprese eventuali posizioni inutilizzate sul disco) poiché il controller RAID (sia hardware che software) non ha idea di quali dati siano effettivamente rilevanti.

Usando RAIDZ2 vdevs, qualsiasi unità costituente due può guastarsi prima di essere a rischio di perdita effettiva di dati a causa di un altro guasto dell'unità, poiché si ha una ridondanza di due unità. Questo è essenzialmente lo stesso di RAID6.

In ZFS tutti i dati, sia i dati utente che i metadati, vengono sottoposti a checksum (tranne se si sceglie di non farlo, ma è sconsigliato) e questi checksum vengono utilizzati per confermare che i dati non sono stati modificati per nessun motivo. Anche in questo caso, se un checksum non corrisponde al valore previsto, i dati verranno ricostruiti in modo trasparente o verrà segnalato un errore I / O. Se viene segnalato un errore I / O o uno scrub identifica un file corrotto, saprai per certo che i dati in quel file sono potenzialmente corrotti e puoi ripristinare quel file specifico dal backup; non è necessario un ripristino completo dell'array.

Semplice, anche a doppia parità, RAID non ti protegge da situazioni come ad esempio quando un'unità si guasta e un'altra legge i dati in modo errato dal disco. Supponiamo che un'unità si sia guastata e che ci sia un solo capovolgimento in qualsiasi punto rispetto a una qualsiasi delle altre unità: improvvisamente hai una corruzione non rilevata e, a meno che tu non sia soddisfatto, avrai bisogno di un modo per rilevarla. Il modo per mitigare tale rischio è quello di eseguire il checksum di ciascun blocco sul disco e assicurarsi che il checksum non possa essere corrotto insieme ai dati (protezione da errori come scritture high-fly, scritture orfane, scritture in posizioni errate sul disco, ecc.), Che è esattamente ciò che fa ZFS fintanto che il checksum è abilitato.

L'unico aspetto negativo è che non è possibile far crescere facilmente un vdev RAIDZ aggiungendo dispositivi ad esso. Ci sono soluzioni alternative per questo, che di solito coinvolgono cose come file sparsi come dispositivi in ​​un vdev, e molto spesso chiamato "Non lo farei se fossero i miei dati". Quindi, se segui un percorso RAIDZ (indipendentemente dal fatto che tu vada con RAIDZ, RAIDZ2 o RAIDZ3), devi decidere in anticipo quante unità vuoi in ogni vdev. Sebbene il numero di unità in un vdev sia fisso, è possibile far crescere un vdev gradualmente (assicurandosi di rimanere entro la soglia di ridondanza del vdev) sostituendo le unità con unità di maggiore capacità e consentendo un completo resilver.


5
Nella mia domanda originale stavo cercando di evitare l'argomento zfs vs raid in quanto ci sono molte informazioni al riguardo. Voglio informazioni specifiche su mdadm. Inoltre, poiché non leggerò tutti i dati abbastanza spesso per garantire che i dati vengano scrupolati regolarmente, dovrò forzare regolarmente una pulizia completa dell'array indipendentemente da zfs o raid.
BeowulfNode42

@ BeowulfNode42 personalmente suggerisco di usare i checksum a livello di applicazione per dati eccezionalmente importanti (ad esempio usare sha256 per fare il checksum dei dati importanti). ZFS può farlo per blocco che penso sia davvero eccessivo. Penso che questo spieghi perché non molti checksum dei file system eseguono il checksum dei blocchi come ZFS perché a mio avviso questo è più un problema a livello di applicazione.
Caveman

1
@caveman Non ti conosco; Mi piace molto il fatto che non devo costantemente fare il checksum dei file solo per essere sicuro che non siano stati danneggiati. Certo, la stragrande maggioranza delle volte non c'è corruzione , nel qual caso non viene fatto alcun danno (con ZFS, puoi scegliere l'algoritmo di checksum tra una manciata, quindi puoi scegliere il tuo punto preferito lungo il continuum di sicurezza / prestazioni), ma i checksum automatici a livello di file system garantiscono l'assenza di corruzione non corretta perché, in caso affermativo, lo saprai, nel caso di ZFS, ricevendo un errore I / O anziché i dati danneggiati.
un CVn del

@ MichaelKjörling no, non "garantisce" (riduce solo la probabilità di errori non rilevati rispetto ai controlli solo su disco, di un importo che nessuno ha ancora quantificato! Pertanto nessuno sa davvero quanto sia utile il checksum di ZFS :)), inoltre puoi utilizzare un semplice "leggi" e "scrivi" wrapper che eseguono in modo trasparente il checksum per te. Non è necessario inserire questa cosa di fantasia nello spazio del kernel.
Caveman

3
@caveman no, zfs non è in argomento. Né sono possibili implementazioni di RAID che non siano mdadm. Voglio sapere di mdadm. Ho già votato per il basso questa risposta il più possibile e i tuoi commenti su una risposta fuori tema compilando ulteriori informazioni sulla risposta fuori tema non aiuta con la domanda originale.
BeowulfNode42,

3

Questa risposta è il prodotto del ragionamento basato sui vari elementi di prova che ho trovato. Non so come funziona l'implementazione del kernel Linux, dato che non sono un sviluppatore del kernel e sembra che ci sia una discreta quantità di disinformazione senza senso là fuori. Presumo che il kernel Linux compia scelte sane. La mia risposta dovrebbe valere a meno che non mi sbagli.

Molte unità utilizzano ECC (codici di correzione errori) per rilevare errori di lettura. Se i dati sono corrotti, il kernel dovrebbe ricevere un URE (errore di lettura irrecuperabile) per quel blocco da un'unità ECC che supporta. In queste circostanze (e c'è un'eccezione di seguito), copiare dati corrotti o vuoti, equivale a pazzia. In questa situazione il kernel dovrebbe sapere quali sono i dati buoni e quali i dati cattivi. Secondo l'articolo È il 2010 e RAID5 funziona ancora ... articolo:

Considera questa alternativa, che so essere utilizzata da almeno un paio di venditori di array. Quando un'unità in un volume RAID segnala un URE, il controller di array aumenta un conteggio e soddisfa l'I / O ricostruendo il blocco dalla parità. Esegue quindi una riscrittura sul disco che riportava l'URRE (potenzialmente con verifica) e se il settore è danneggiato, il microcodice rimappa e tutto andrà bene.

Tuttavia, ora per l'eccezione: se un'unità non supporta ECC, un'unità risiede nella corruzione dei dati o il firmware è particolarmente disfunzionale, quindi un URE potrebbe non essere segnalato e i dati danneggiati verrebbero forniti al kernel. In caso di mancata corrispondenza dei dati: sembra che se si utilizza un RAID1 a 2 dischi o un RAID5, il kernel non può sapere quali dati sono corretti, anche se in uno stato non degradato, poiché esiste una sola parità blocco e non è stato segnalato alcun URE. In un RAID1 a 3 dischi o RAID6, un singolo blocco non contrassegnato non URE danneggiato non corrisponderebbe alla parità ridondante (in combinazione con gli altri blocchi associati), quindi dovrebbe essere possibile un corretto ripristino automatico.

La morale della storia è: usare le unità con ECC. Sfortunatamente non tutte le unità che supportano ECC pubblicizzano questa funzione. D'altra parte, fai attenzione: conosco qualcuno che ha usato SSD economici in un RAID1 a 2 dischi (o un RAID10 a 2 copie). Una delle unità ha restituito dati danneggiati casuali su ciascuna lettura di un determinato settore. I dati danneggiati sono stati copiati automaticamente sui dati corretti. Se l'SSD utilizzava ECC e funzionava correttamente, il kernel avrebbe dovuto intraprendere le azioni correttive appropriate.


1
Ho pensato che tutti i moderni HDD abbiano una qualche forma di ECC interno. Se è efficace, corretto o difettoso è un'altra questione. L'ECC deve essere utilizzato internamente nell'unità per poter segnalare un URE. Il marcio a bit silenzioso, che mi interessa di più, non segnala un URE nemmeno su unità che lo supportano, poiché pensano di avere i dati corretti, quando non lo fanno.
BeowulfNode42

Per bit rot, suppongo che tu intenda bit che si lanciano casualmente. In ogni caso, l'ECC è progettato per rilevare bit capovolti. Secondo Wikipedia, la correzione degli errori Reed-Solomon è un formato ECC comune inventato nel 1960 ed è ancora utilizzato nei dischi Blu-Ray + HDD. Se scopri che quell'algoritmo è estremamente affidabile, allora alla tua domanda dovrebbe essere data una risposta, dato che l'hardware moderno decente, per definizione, è altrettanto buono, se non migliore, anche se non conosci un pezzo di decenza dell'hardware solo da guardandolo.
sudoman

1
La putrefazione dei bit può anche verificarsi a causa di altri problemi, ad esempio quando alcuni problemi fanno sì che le testine non siano allineate correttamente a dove pensa di scrivere e si riversano su settori vicini. Potrebbe risolvere il settore su cui intendeva lavorare, ma il settore vicino verrà danneggiato. Se capita di aver sovrascritto i dati + ecc in modo tale che l'ECC per il settore vicino riferisca che va bene, l'unità non saprà mai che ha un problema. Molto più probabilmente, alcuni software non autorizzati indicano all'unità di scrivere dati errati, l'hdd memorizzerà fedelmente quei dati errati. ad es. un comando dd
errato

2

Per la protezione che desideri, preferirei RAID6 + il normale backup offsite in 2 posizioni.

Scrub personalmente una volta alla settimana e backup ogni notte, settimanalmente e mensilmente a seconda dell'importanza dei dati e della velocità di modifica.


1
ma quali funzionalità di rilevamento / correzione del marciume bit offre?
BeowulfNode42

1
RAID6 con frequente scrubbing offre una certa protezione da bit-rot, poiché la doppia parità crea effettivamente tre versioni dello stesso blocco, in modo da poter tenere un "voto" su quale versione è corretta. AFAIK, il lavaggio RAID6 in Linux dm-raid fa proprio questo, per favore correggimi se sbaglio.
P.Péter,

1
@ P.Péter Mi rendo conto che la matematica coinvolta POTREBBE utilizzare un sistema di voto, ma mdadm? Conosci qualche documentazione in merito o hai avuto un'esperienza personale che ti ha portato a questa conclusione. In particolare alla luce della risposta di Ethan.
BeowulfNode42,

Questo è successo qualche tempo fa, ma ricordo vagamente di aver letto sui meccanismi RAID6 di mdadm prima di commentare. Spiacente, non molto specifico. :( Suppongo che potremmo usare un vero esperto di mdadm ...
P.Péter

2

Non ho abbastanza rappresentante per commentare, ma voglio sottolineare che il sistema mdadm in Linux NON corregge alcun errore. Se gli dici di "correggere" errori durante uno scrub di, diciamo, RAID6, se c'è un'incoerenza, lo "riparerà" assumendo che le porzioni di dati siano corrette e ricalcolando la parità.


1
Questo sembra piuttosto improbabile, a meno che non ti fraintenda. Vuoi dire che i dati da blocchi danneggiati vengono spesso copiati su blocchi corretti? Ciò richiederebbe che il blocco danneggiato non provenga da un'unità che supporti ECC (e quindi non segnalerebbe un URE) e che si sta utilizzando RAID5 o 2 copia RAID1 (anziché RAID6 come suggerito.)
sudoman

@sudoman, durante uno scrub, se il sottosistema MD Linux rileva una discrepanza tra i dati e la parità, presuppone ciecamente che la parità sia errata e la riscrive in base ai dati. È possibile utilizzare la doppia parità di RAID 6 per capire qual è il problema, ma il sottosistema Linux MD non lo fa.
Segna il

1
Ethan, suppongo tu non abbia riferimenti per queste informazioni? o esempi di esperienza personale sei disposto a condividere ciò che ricordi? Dati i tumbleweed che questa Q ha generato, anche le informazioni aneddotiche sarebbero utili. Da quando è stato pubblicato questo Q ho avuto alcuni problemi con mdadm RAID1 per l'unità di avvio, su chiavette USB (economiche) quando 1 di loro è andato male. Alcune indagini in seguito indicano che la chiavetta USB non funzionante non ha abbastanza o nessun controllo degli errori, oppure non è riuscita a scrivere i dati su alcuni blocchi e non ha prodotto un errore di scrittura. Ho dovuto reinstallare il sistema operativo.
BeowulfNode42,

-2

po 'marcire fud.? sicuro...

Immagino che devi parlare con SEAGATE. (dimentica? è questa la scusa)? le unità ora hanno tutte la correzione ECC a 100 bit che è necessario provare prima il marciume.
Scommetto che non puoi. (è cosa FUD preoccuparsi vero?) come la paura dei fantasmi o il # 13? e non fatto qui. nessuna prova è avvenuta. e peggio ancora nessuna prova di causa.

Per prima cosa definire cosa significa bit rot. ahi ... HDD: ECC controlla i dati (anche 1 bit) rispetto alla memoria ECC a 100 bit. se è sbagliato, lo corregge, se continua a guastare il motore SMART, sicuramente su unità SAS, sostituisce logicamente il cluster o il settore con uno che è buono. utilizzando cluster di riserva. questo ripara il danno. Sì, tutte le unità crescono male dal primo giorno alla fine, dalle prime unità IBM a ORA. ma ora facciamo l'autoriparazione, leggi i white paper completi di Seagate. infinito lì, e scopri come funziona un disco. ok?

questo continua fino a quando non si esauriscono i pezzi di ricambio (hdd brain, smart) e quindi SMART urla END OF LIFE. (o anche più presto, come fa HP), diciamo un controller HP P420, lo guarda sempre. Il mio mi ha persino inviato un'e-mail, mostrando i cluster VICINO A FUORI RICAMBIO. A volte i ricambi vanno molto più velocemente, un sicuro segno di sventura presto (10 anni, certo, meno in junky sata.

Chiamo BOGUS e FUD sul bit rot.

La mia ipotesi è che qualcuno PC giocattolo abbia scritto i dati in modo errato, per qualsiasi motivo. non esegue la memoria ECC ?? oops, i server reali hanno RAM ECC. virus infetto. o perdita di energia durante la scrittura (nessun UPS>?)? o ha cattiva memoria. o ESD danneggiato. O alimentatore che fa tonnellate di rumore (cattivo)

Chiamo FUD qui. spiacente,


1
Ho appena chiarito che stavo parlando del mio sistema domestico, quindi l'hardware ECC e di livello server è fuori dalla mia fascia di prezzo di bilancio. Il mio laboratorio di casa è molto più incline a una perdita di potenza imprevista anche con i suoi mini up o altri eventi casuali, come la caduta della torre o qualcosa del genere. Esistono molti altri modi per dire a un HDD di memorizzare i dati sbagliati e fare in modo che l'HDD memorizzi i bit ECC per quei dati errati. Non mi interessa come si sono verificati gli errori, li voglio facilmente riparati.
BeowulfNode42
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.