Qual è una strategia di backup offsite efficace per un pool con mirroring ZFS?


9

Uso un pool ZFS composto da due dischi con mirroring. Per avviare i backup fuori sede, ho acquistato altri due dischi.

Il mio piano iniziale era quello di creare il backup offsite collegando un terzo disco al mirror, in attesa che ZFS si ripristinasse, quindi staccare l'unità e trasportarla fuori sede. Funziona abbastanza bene, ma sono rimasto sorpreso dal fatto che sembra eseguire un resilver completo ogni volta che un disco è collegato (leggo, e forse ho frainteso, che ogni collegamento comporterebbe un resilver incrementale o delta). Ciò comporta che i backup impiegano più tempo di quanto sia accettabile.

I miei requisiti sono avere una copia fuori sede del mio zpool e di tutte le sue istantanee che posso ruotare quotidianamente. Ciò significa che il resilvering deve richiedere al massimo 24 ore - attualmente è vicino a quello, ma i nostri piani di crescita del nostro pool lo spingeranno oltre quel lasso di tempo.

Come posso mantenere backup offsite che non richiedono un'operazione di resilvering completa? Dovrei usare un filesystem diverso sulle mie unità di backup (ad es. Esportare un'immagine piuttosto che farle parte del pool ZFS)? Dovrei avere i backup in un pool separato e inviarvi nuove istantanee mentre vengono creati?


La mia strategia attuale è il metodo del pool multiplo, con zfs send e ricezione per sincronizzare le istantanee. Mi piacerebbe sapere se hai trovato un argomento contro questo o un'opzione migliore.
so12311,

Risposte:


3

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 attache detach, tuttavia utilizza onlinee offline. Ciò ha il vantaggio di eseguire un delta resilvering rispetto a un resilvering completo, ma lo svantaggio che il pool riporta sempre uno DEGRADEDstato (il pool ha sempre due dischi; i dischi offsite rotanti sono contrassegnati offlinequando 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 scrubcompletamento di un per assicurare ragionevolmente che il disco di backup sia privo di errori

  • Ho zfs offlineil disco che sarà portato a distanza. Dopo il suo offline avrei hdparm -Y /dev/iddovuto 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 onlineper 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 ONLINEdischi mirror e un OFFLINEdisco 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.


Questo non funzionerà sicuramente con solo tre dispositivi anziché quattro? La Guida all'amministrazione di Oracle Solaris ZFS afferma che un pool di mirror è in errore "Se tutti i componenti di un mirror vengono rimossi" [l'enfasi è mio], il che sembra implicare che una quarta unità non è strettamente necessaria.
Kenny Evitt,

1
Per tre dispositivi intendi due dischi che sono sempre nel pool e uno che è occasionalmente fuori sede, o un disco che è sempre nel pool e due che ruotano fuori sede? Con la seconda opzione mi aspetterei una perdita di dati se il pool rileva dati errati mentre è presente un solo disco completamente online (quando il 2 ° disco viene ruotato o non è ancora completamente ripristinato). Il mio due centesimi è quello di garantire sempre che il tuo pool di mirroring abbia due dischi online a tempo pieno.
STW

Intendevo la seconda opzione che menzioni. Con questa opzione, con quale probabilità sono presenti dati errati mentre è online un solo disco? Il resilvering parziale / incrementale dovrebbe essere relativamente veloce, giusto? E anche se ci fossero dati errati, non dovresti essere in grado di recuperare dalla seconda unità? O recuperare dalla terza unità, nel peggiore dei casi? [Ovviamente ci sono scenari in cui il recupero non è possibile; ma questo è vero anche con quattro unità; o qualsiasi numero in realtà.]
Kenny Evitt

Continuerei ad avere sempre due dischi con mirroring online, con un terzo e un quarto usati per ruotare i backup. Ogni volta che hai un solo disco online in un mirror è un momento in cui sei vulnerabile - e anche con il mio approccio c'è il rischio che il disco di backup offsite possa sviluppare problemi di integrità e non essere recuperabile al 100% (idealmente ci sarebbe essere due dischi con mirroring fuori sede in qualsiasi momento, in modo da poter confrontare l'integrità dei due).
STW

Riassumendo, ZFS consiste nell'evitare una singola copia di dati (o almeno avere la parità, consentendo la ricostruzione di dati errati). Quando si dispone di un solo disco online o una copia dei dati di backup, è a rischio di perdita di dati.
STW

2

Perché zfs non invia le tue istantanee a una macchina ZFS remota? Per questo uso un semplice script bash:

#!/usr/local/bin/bash
# ZFS Snapshot BASH script by Shawn Westerhoff
# Updated 1/14/2014

### DATE VARIABLES
# D = Today's date
# D1 = Yesterday's date
# D# = Today less # days date
Y=$(date -v-1d '+%m-%d-%Y')
D=$(date +%m-%d-%Y)
D1=$(date -v-1d '+%m-%d-%Y')
D10=$(date -v-10d '+%m-%d-%Y')
D20=$(date -v-20d '+%m-%d-%Y')

# Step 1: Make the snapshots

for i in $( zfs list -H -o name ); do
    if [ $i == tier1 ]
    then echo "$i found, skipping"
    else
    zfs snapshot $i@$D
    fi
done

# Step 2: Send the snapshots to backup ZFS sever

    for i in $( zfs list -H -o name ); do
        zfs send -i $i@$D1 $i@$D | ssh -c arcfour root@10.10.10.10 zfs recv $i
    done

# Step 3: Destroy snapshots that are 20 days old

for i in $( zfs list -H -o name ); do
        if [ $i == tier1 ]
        then echo "$i found, skipping"
        else
        zfs destroy $i@$D20
        fi
done

0

Ho creato uno strumento chiamato snapdump che consente di creare dump incrementali dei set di dati zfs in un file system esterno (non zfs). Snapdump supporta anche il ripristino di una catena di snapshot incrementale con un singolo comando.

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.