Dopo molti armeggi e sperimentazioni ho trovato una soluzione, anche se con un compromesso abbastanza grande.
Prima di tutto, le opzioni che ho dovuto escludere:
Avere un secondo server ZFS fuori sede con un pool di mirroring non era un'opzione a causa dei costi. Se fosse stata un'opzione, questo sarebbe stato di gran lunga l'approccio migliore, utilizzando ZFS send / ricezione per inviare istantanee al pool remoto.
Avere un secondo pool ZFS in loco con mirroring, da cui ho potuto rimuovere i dischi da portare a casa. Questo è più fattibile della prima opzione, ma avrei bisogno che il secondo pool avesse sempre due dischi in loco (o per usare due copie di dati su un singolo disco in loco). Al momento ho quattro dischi e non c'è più spazio per un quinto nel server. Questo sarebbe un approccio equo ma comunque non ideale.
Utilizzando ZFS allegare e staccare per ruotare il disco di backup dentro e fuori dal pool di mirroring. Funziona bene, ma deve eseguire un resilver completo ogni volta che il disco viene aggiunto. Questo richiede tempi inaccettabilmente lunghi, e quindi non potevo fare affidamento su questo.
La mia soluzione è simile all'utilizzo attach
e detach
, tuttavia utilizza online
e offline
. Ciò ha il vantaggio di eseguire un delta resilvering rispetto a un resilvering completo, ma lo svantaggio che il pool riporta sempre uno DEGRADED
stato (il pool ha sempre due dischi; i dischi offsite rotanti sono contrassegnati offline
quando si trovano nell'archiviazione remota e nel resilver e quindi si collegano online quando sono in loco).
Quindi, un breve riepilogo e una panoramica della mia configurazione:
Ho un server ZFS e quattro dischi identici. ZFS è configurato per utilizzare un pool con mirroring. Due dei quattro dischi sono membri permanenti di questo pool. Gli altri due dischi ruotano; uno è sempre nella memoria esterna, l'altro fa parte del pool per fungere da backup pronto all'uso.
Quando arriva il momento di ruotare i backup:
Attendo il zfs scrub
completamento di un per assicurare ragionevolmente che il disco di backup sia privo di errori
Ho zfs offline
il disco che sarà portato a distanza. Dopo il suo offline avrei hdparm -Y /dev/id
dovuto ridimensionarlo. Dopo un minuto rimuovo parzialmente la slitta del disco (quanto basta per garantirne la perdita di potenza) e quindi gli do un altro minuto prima di tirare completamente l'unità per garantire che abbia smesso di girare. Il disco va in una borsa statica e quindi in una custodia protettiva e va fuori sede.
Porto dentro l'altro disco fuori sede. Viene installato nel vassoio hotswap e gira su. Uso zfs online
per ripristinare il disco nel pool e dare il via a un resilver parziale per renderlo simultaneo.
Questo sistema garantisce che in ogni momento ho due ONLINE
dischi mirror e un OFFLINE
disco remoto (che è stato cancellato). Il quarto disco è in fase di ripristino o online, il che ha il vantaggio che in caso di guasto di un'unità in esecuzione è probabilmente il pool sarà comunque coerente con due dischi online.
Ha funzionato bene nelle ultime due settimane, ma considererei ancora questo un approccio hacker. Ti seguirò se incontrerò problemi importanti.
Aggiornamento: dopo aver funzionato con questo per un paio di mesi ho scoperto che nel mio mondo reale il resilvering sta impiegando lo stesso tempo sia per staccare / allegare che offline / online. Nei miei test non credo di aver eseguito uno scrub: il mio sospetto è che se un'unità non è in linea per uno scrub, allora richiede un completo resilver.