ZFS: Come si ripristina il numero corretto di copie dopo aver perso un'unità?


12

Con zfs, se hai copies=2e poi perdi un'unità contenente alcune di quelle copie, come fai a dire al sistema che dovrebbe fare una nuova copia dei blocchi di dati per i file interessati? Oppure zfs inizia semplicemente ad aggiungere blocchi di dati per le copie extra non appena scopre blocchi di dati errati?

Scrub farà questo?

(v0.6.0.56-rc8, versione 28 del pool ZFS, versione 5 del filesystem ZFS, Ubuntu 11.10)

Risposte:


10

"copy = 2" (o 3) è più progettato per essere utilizzato con pool senza ridondanza (disco singolo o strisce). L'obiettivo è riuscire a ripristinare una piccola corruzione del disco, non un errore dell'intero dispositivo. In quest'ultimo caso, il pool non è montabile, pertanto non è possibile eseguire il ripristino dei blocchi Ditto.

Se si dispone di ridondanza (mirroring / raidz / raidz2 / raidz3), i blocchi idem non sono diversi dagli altri e il lavaggio / resilver li ricrea.


Ciò è in conflitto diretto con quanto dice @Redmumba e Redmumba fornisce collegamenti al codice. Puoi citare alcune fonti per quello che stai dicendo? In particolare, mi piacerebbe vedere buone citazioni sul motivo per cui pensi che copie = N non riuscirà a far fronte all'intero guasto del dispositivo, che non corrisponde a nulla di ciò che ho letto.
James Moore,

1
@James Moore Dopo un intero guasto del dispositivo, nessun blocco idem verrà scritto su quel disco. Non esiste ridondanza a livello di pool, quindi non è possibile sostituire il disco difettoso con uno nuovo. L'unico metodo per ripristinare correttamente tale situazione sarebbe quello di eseguire un backup completo del pool, ricrearlo con dispositivi integri e ripristinare dal backup assicurandosi che non si verifichi alcun riavvio involontario prima che venga eseguito il primo backup. Altrimenti il ​​pool potrebbe non essere importabile e i suoi dati potrebbero andare persi. Questo è piuttosto oneroso rispetto ai pool ridondanti in cui il ripristino di un disco danneggiato viene eseguito online e sopravvive ai riavvii.
jlliagre,

1
Ecco un riferimento: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). Presumo che copie = 2 o 3 non sia considerata una configurazione ridondante.
jlliagre,

1
Una cosa da tenere a mente, tuttavia, è che se lo avevi originariamente copies=1e lo hai aumentato copies=2, probabilmente vorrai ricolverare / ripubblicare in seguito, il che creerà queste istanze. Ma @jilliagre è corretto: i blocchi idem non costituiscono una configurazione ridondante. Non è garantito che i blocchi siano impostati su un altro dispositivo, anche se si hanno più dispositivi in ​​un pool.
Andrew M.,

1
la funzione "copie = N dove N> 1" non ha lo scopo di aggiungere ridondanza. è destinato a risolvere il danneggiamento dei dati. tutto ciò che è scritto su zfs è checksummed o hash. quando viene riletto, il checksum / hash viene verificato. se N = 1, un errore di verifica di checksum / hash restituisce un errore all'app. se N> 1, una delle altre copie può essere consultata e utilizzata per riparare tutte le altre copie.
collo lungo,

9

Ho trovato questa domanda davvero intrigante, e dopo aver passato un'ora a riversare documentazione, mi sono immerso nel codice. Ecco cosa ho trovato.

Innanzitutto, un po 'di terminologia. I blocchi Ditto (che sono quelli che sono queste copie, al contrario dei mirror) vengono creati automaticamente su una scrittura ma possono essere o meno nello stesso dispositivo virtuale (vdev) della copia originale. D'altra parte, i blocchi con mirroring vengono sempre riflessi su un altro dispositivo virtuale.

Tuttavia, il codice fa riferimento a entrambi i tipi di blocchi come figli. Vedrai qui che i blocchi idem sono solo bambini io_vd == NULL(questo è nella funzione di scrittura). Per un blocco speculare, io_vdverrebbe impostato sul dispositivo virtuale corrispondente (il tuo secondo disco, ad esempio).

Tenendo presente ciò, quando si arriva alla parte letta , tratta tutti i bambini (siano essi mirror o idem blocchi) come potenzialmente non sicuri se non contengono le aspettative good_copiese li riscrive secondo necessità . Quindi sembra che la risposta alla tua domanda sia: sì, li riscriverà quando avrai almeno una buona copia e una delle seguenti:

  • Errori imprevisti durante il tentativo di leggere i dati,
  • Stai ripristinando, o
  • Stai lavando.

Accidenti! Forse qualcuno può evidenziare difetti, ma mi è piaciuto conoscere ZFS attraverso questo piccolo esercizio e spero che questo ti aiuti!


1
Il problema è nella risposta di @ jlliagre: il pool è morto se perde qualche dispositivo. Il fatto che la piscina abbia ancora abbastanza blocchi idem non sembra importare. Qualche modo per aggirare questo?
James Moore,

4
@JamesMoore è possibile forzare l'array online in uno stato degradato se si dispone dei primi 1 MB del dispositivo non funzionanti. Presumibilmente hai solo bisogno dei metadati dal dispositivo guasto. L'ho provato con uno zpool in stile jbod e funziona: recuperare le etichette rotte raidz . Ho fatto un md5sum prima e dopo aver rotto lo zpool, e solo il filesystem copia = 1 è stato rotto dopo l'importazione. Le copie = 2 e copie = 3 filesystem sono state abbinate perfettamente.
Jodie C

2

@jlliagre e altri che sembrano pensare che l'intero zpool muoia se muore uno dei dischi (vdevs) ma il pool non è ridondante (mirror / raidz). Questo non è vero; un pool multi-disco sopravviverà sempre a un singolo errore completo del disco anche se non è un mirror o raidz.

I metadati ZFS vengono sempre copiati almeno 2 volte, quindi il fallimento totale di un disco completo (o di qualsiasi sua parte) non eliminerà il file system. Inoltre, molti file, specialmente quelli più piccoli, non saranno distribuiti su tutti i dischi e non saranno pertanto necessariamente danneggiati dall'errore del disco. L'OP sta chiedendo il caso di un pool multi-disco utilizzando blocchi idem (copie dei dati dell'utente> 1). In questo caso, un singolo errore completo del disco non dovrebbe mai comportare la perdita di dati.ZFS proverà sempre a mettere i blocchi idem lontano dal blocco originale, e per i pool con più vdev, ciò significa sempre su un altro vdev (un'eccezione potrebbe essere quella in cui un vdev è> 50% del pool, il che sarebbe molto insolito) . I metadati del file system vengono inoltre sempre copiati +1 o +2 volte più del livello di idem , quindi sopravvivranno sempre al guasto del disco. Inoltre, se si dispone di un pool con più di tre dischi, si dovrebbe essere in grado di perdere fino a metà di essi senza perdita di dati; ZFS memorizza i blocchi idem sul disco successivo in modo da non perdere mai due dischi adiacenti, senza mai perdere i dati. (tre guasti del disco adiacente per idem = 2).

Quando sono disponibili copie sufficienti dei dati per accedere a un file (indipendentemente dal fatto che tali copie provengano da blocchi idem, mirror o raidz), tutte le copie mancanti dei dati vengono riparate quando si accede al file. Questo è lo scopo dello scrub; leggere tutti i dati e correggere quelli che non vanno utilizzando copie ridondanti. Quindi, per rispondere direttamente alla domanda OP, è sufficiente eseguire uno scrub dopo aver sostituito l'unità guasta e tutte le copie verranno ripristinate.

Come sempre, puoi facilmente sperimentare i concetti creando pool i cui vdev per l'archivio di backup sono solo normali file sparsi. Eliminando o corrompendo i file vdev è possibile simulare qualsiasi tipo di errore e verificare l'integrità del pool, dei file system e dei dati lungo il percorso.

EDIT: dopo aver sperimentato, sembra che zfs fallirà il pool se un disco fallisce in un pool multi-disco non ridondante con copie> = 2. La corruzione dei dati parentali su uno o più dischi dovrebbe rimanere sopravvissuta e dovrebbe essere riparata da uno scrub.


La cosa spaventosa di questo tipo di esperimenti è che sono grandiosi per dirmi che un setup fallirà immediatamente o almeno rapidamente. Non sono così grandi per dirmi che un'installazione fallirà di tanto in tanto. In ogni caso, non è chiaro come riportare un pool che presenta un errore; Ho provato a configurare un pool come questo con tre file sparsi e la rimozione di uno dei file sparsi sembra essere fatale per l'intero pool. zpool Replace non sostituirà il file fallito, zpool si blocca al 5% (e questi sono pool molto piccoli) e la pagina di errore su illumos.org/msg/ZFS-8000-5E non è ottimista.
James Moore,

Ho avuto un risultato simile ai miei esperimenti, fatto solo dopo la mia risposta. Normalmente uso solo raidz e rispondevo basandomi su informazioni provenienti da quelle che credevo fossero fonti credibili (blog di Oracle). Non credo più che un pool di tipi JBOD multi-disco, con copie> 1, possa sopravvivere a un errore del disco.
Aaron B,
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.