come eseguire il mirroring unidirezionale di un intero pool zfs su un altro pool zfs


15

Ho un pool di zfs contenente diversi zvol e set di dati di cui alcuni sono anche nidificati. Tutti i set di dati e gli zvol vengono periodicamente snapshot di zfs-auto-snapshot. Tutti i set di dati e zvol hanno anche alcune istantanee create manualmente.

Ho installato un pool remoto su cui, a causa della mancanza di tempo, la copia iniziale sulla rete locale ad alta velocità tramite zfs send -R non è stata completata (alcuni set di dati mancano, alcuni set di dati sono obsoleti o mancanti snapshot).

Ora il pool è fisicamente remoto su una connessione a bassa velocità e devo sincronizzare periodicamente il pool remoto con il pool locale, il che significa che i dati presenti nel pool locale devono essere copiati nel pool remoto, i dati trasferiti dal pool locale devono essere eliminati dal pool remoto e i dati presenti nel pool remoto ma non nel pool locale devono essere eliminati dal pool remoto, con il significato di "zvols", "set di dati" o "snapshot".

Se lo facessi tra due filesystem regolari usando rsync, sarebbe "-axPHAX --delete" (è quello che faccio effettivamente per fare il backup di alcuni sistemi).

Come si configura un'attività di sincronizzazione in modo che gli zvol e i set di dati del pool remoto (compresi i loro snapshot) possano essere sincronizzati con zvols, set di dati e snapshot locali?

Vorrei evitare il trasferimento su ssh, a causa delle basse prestazioni di ssh; Preferirei mbuffer o iscsi invece.


Come hai fatto la tua iniziale zfs send -R ...? Se hai reindirizzato l'output tramite ssh, hai disabilitato i caratteri di escape con zfs send -R ... | ssh -e none ...?
Andrew Henle,

Inoltre, è necessario assicurarsi che la connessione lenta abbia una larghezza di banda sufficiente per mantenere aggiornata la copia remota. Se stai ricevendo più modifiche al sistema locale di quelle che puoi inviare al sistema remoto, non sarai mai in grado di mantenere aggiornata la copia remota. Prendi un flusso di replica zfs incrementale e salvalo in un file. Se il file è più grande della quantità di dati che è possibile inviare al sito remoto per l'intervallo di tempo tra le istantanee, non si terrà mai il passo. zfs send -R -i pool@snap1 pool@snap2 | gzip --fast > /output/file.gz
Andrew Henle,

Puoi anche provare a usare questo script per farlo automaticamente: github.com/psy0rz/zfs_autobackup/blob/master/README.md
edwin eefting il

Risposte:


11

Disclaimer: dato che non ho mai usato zvols, non posso dire se sono diversi nella replica rispetto ai normali filesystem o istantanee. Presumo che lo siano, ma non credetemi.


La tua domanda è in realtà più domande, provo a rispondere separatamente:

Come replicare / eseguire il mirroring del pool completo nella posizione remota

È necessario dividere l'attività in due parti: in primo luogo, la replica iniziale deve essere completa, successivamente è possibile la replica incrementale, purché non si scherzi con le istantanee della replica . Per abilitare la replica incrementale, è necessario preservare le ultime istantanee della replica, tutto ciò che può essere eliminato prima. Se si elimina l'istantanea precedente, zfs recvsi lamenterà e si interromperà la replica. In questo caso devi ricominciare tutto da capo, quindi cerca di non farlo.

Se hai solo bisogno delle opzioni corrette, sono:

  • zfs send:
    • -R: invia tutto nel pool o nel set di dati indicato (replica ricorsiva, necessaria in ogni momento, include -p). Inoltre, durante la ricezione, tutti gli snapshot di origine eliminati vengono eliminati sulla destinazione.
    • -I: include tutte le istantanee intermedie tra l'ultima istantanea di replica e l'attuale istantanea di replica (necessaria solo con invii incrementali)
  • zfs recv:
    • -F: espande il pool di destinazione, inclusa l'eliminazione di set di dati esistenti che vengono eliminati sull'origine
    • -d: elimina il nome del pool di origine e lo sostituisce con il nome del pool di destinazione (il resto dei percorsi del file system verrà conservato e, se necessario, anche creato)
    • -u: non montare il filesystem sulla destinazione

Se preferisci un esempio completo, ecco un piccolo script:

#!/bin/sh

# Setup/variables:

# Each snapshot name must be unique, timestamp is a good choice.
# You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/gnu/bin/date '+%Y%m%d%H%M%S')
source_pool=tank
destination_pool=tank
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=remotehostname

# Initial send:

# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"

# Incremental sends:

# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
    zfs destroy "$snap"
done

Usa qualcosa di più veloce di SSH

Se si dispone di una connessione sufficientemente protetta, ad esempio tunnel IPSec o OpenVPN e una VLAN separata esistente solo tra mittente e destinatario, è possibile passare da SSH a alternative non crittografate come mbuffer come descritto qui , oppure è possibile utilizzare SSH con crittografia debole / assente e disabilitato la compressione, che è dettagliata qui . C'era anche un sito web sulla ricomposizione di SSH per essere molto più veloce, ma sfortunatamente non ricordo l'URL - lo modificherò più tardi se lo trovo.

Per set di dati molto grandi e connessioni lente, può anche essere utile alla prima trasmissione tramite disco rigido (utilizzare il disco crittografato per archiviare zpool e trasmetterlo in un pacchetto sigillato tramite corriere, posta o di persona). Poiché il metodo di trasmissione non ha importanza per send / recv, è possibile reindirizzare tutto sul disco, esportare il pool, inviare il disco a destinazione, importare il pool e quindi trasmettere tutti gli invii incrementali tramite SSH.

Il problema con le istantanee incasinate

Come indicato in precedenza, se si eliminano / modificano le istantanee della replica, verrà visualizzato il messaggio di errore

cannot send 'pool/fs@name': not an earlier snapshot from the same fs

il che significa che il tuo comando era sbagliato o sei in uno stato incoerente in cui devi rimuovere le istantanee e ricominciare tutto da capo.

Ciò ha diverse implicazioni negative:

  1. Non è possibile eliminare uno snapshot di replica fino a quando il nuovo snapshot di replica non è stato trasferito correttamente. Poiché queste istantanee di replica includono lo stato di tutte le altre (vecchie) istantanee, lo spazio vuoto dei file e delle istantanee cancellate verrà recuperato solo al termine della replica. Ciò può comportare problemi di spazio temporanei o permanenti sul pool che è possibile risolvere solo riavviando o completando la procedura di replica completa.
  2. Avrai molte snapshot aggiuntive, che rallentano il comando list (tranne su Oracle Solaris 11, dove è stato risolto).
  3. Potrebbe essere necessario proteggere le istantanee dalla rimozione (accidentale), ad eccezione dello script stesso.

Esiste una possibile soluzione a questi problemi, ma non l'ho provato da solo. È possibile utilizzare zfs bookmarkuna nuova funzionalità di OpenSolaris / illumos creata appositamente per questa attività. Questo ti libererebbe dalla gestione delle istantanee. L'unico aspetto negativo è che al momento funziona solo per singoli set di dati, non ricorsivamente. Dovresti salvare un elenco di tutti i tuoi set di dati vecchi e nuovi e quindi scorrere su di essi, aggiungere segnalibri, inviarli e riceverli, quindi aggiornare l'elenco (o il piccolo database, se preferisci).

Se provi il percorso dei segnalibri, sarei interessato a sapere come ha funzionato per te!


grazie mille per questa risposta dettagliata. sto solo spedendo..ricevendo-a zpool.
jitter

1
bella sceneggiatura. Aggiungerei -d 1entrambi i zfs listcomandi per limitare la profondità di ricerca (non è necessario cercare sotto il nome del pool). Questo evita lunghi ritardi sui pool con molti snapshot (ad es. Il mio pool "backup" ha 320000 snapshot e zfs list -r -t snapshot backuprichiede 13 minuti per l'esecuzione. Ci vogliono solo 0,06 secondi con -d 1). Il zfs destroycomando nel ciclo for richiede quindi l' -ropzione per eliminare in modo ricorsivo tutte le istantanee con lo stesso snapname.
Cas

5

Personalmente, mi farei un elenco di zvol, set di dati ecc. Sul server remoto che non hanno istantanee aggiornate, e quindi aggiornerei quelle istantanee zfs send, anche se questo richiede molto tempo e utilizza molto di larghezza di banda.

Quindi potrei continuare a utilizzare zfs sendda quel momento in poi e non dover reinventare la ruota scrivendo il mio codice di sincronizzazione. rsyncè utile per i filesystem più vecchi ma zfs sendè molto meglio per zfs: sa esattamente quali blocchi sono cambiati nell'istantanea e li invia solo , mentre rsync deve confrontare i singoli file e / o timestamp tra server locali e remoti. lo stesso vale btrfs sendper i pool btrfs.

Se hai solo un numero limitato di istantanee che devono essere aggiornate, questo potrebbe essere fatto manualmente. Altrimenti per farlo automaticamente, è necessario un elenco delle più recenti istantanee locali rispetto alle istantanee remote e uno script per confrontare le versioni e quindi zfs sendle istantanee locali non aggiornate sul server rmeote.

Ciò sarà sufficiente se ti preoccupi solo dell'ultima istantanea per ogni set di dati. Se ti interessano tutte le istantanee precedenti, ovviamente anche il tuo script dovrà gestirle ... e questo diventa MOLTO più complicato. In alcuni casi, potrebbe essere necessario eseguire il rollback sul server remoto in modo da poter inviare nuovamente le istantanee intermedie / mancanti.

Se vuoi una connessione sicura al server remoto, hai davvero poca scelta se non quella di usare ssh- o forse impostare un tunnel con openvpno qualcosa del genere e usare netcat.


Che ne dici di usare Zrep? bolthole.com/solaris/zrep
Xdg

non lo ho mai usato. sembra che sarebbe una buona risposta, anche se se qualcuno dovesse fare una piccola ricerca e test e scriverlo (questo è un suggerimento).
Cas

L'ho provato su Ubuntu (ZFS su Linux) e non funzionava su set di dati più profondi (tank / qualcosa / qualcos'altro). Stavo usando questa porta per shell - link . La bandiera ricorsiva export ZREP_R=-Rnon funzionava affatto. :(
Xdg,

1

Dai un'occhiata a `zrepl ', su FreeBSD, che potrebbe rendere la tua vita, e chiunque altro, molto più semplice. È stato presentato pochi giorni fa durante il BSDCan2018 a Ottawa. Sembra promettente e può essere una soluzione ai tuoi problemi



La domanda nella domanda è: "Come si configura un'attività di sincronizzazione in modo che zvols e set di dati del pool remoto (compresi i loro snapshot) possano essere sincronizzati con zvols, set di dati e snapshot locali?"
Jeff Schaller

0

zrep è una bella soluzione all-in-one, E ha documentazione + hook su come ottenere trasferimenti più veloci rispetto ai semplici trasferimenti SSH

https://github.com/bolthole/zrep

è anche multipiattaforma: supportato su linux, freebsd e solaris / illumos



1
La domanda nella domanda è: "Come si configura un'attività di sincronizzazione in modo che zvols e set di dati del pool remoto (compresi i loro snapshot) possano essere sincronizzati con zvols, set di dati e snapshot locali?"
Jeff Schaller

Jeff, stai suggerendo che la migliore "risposta" sarebbe quella di tagliare e incollare bit dalla documentazione di Zrep, piuttosto che dare semplicemente un riferimento a Zrep?
Philip Brown,

1
Non so quale sia la risposta migliore, ma un collegamento al software non è una soluzione. È già stato menzionato, in effetti. La domanda si pone: "Come faccio a impostare un'attività di sincronizzazione in modo che zvols e set di dati del pool remoto (compresi i loro snapshot) possano essere sincronizzati con zvols, set di dati e snapshot locali?"
Jeff Schaller

si questa è la domanda Tuttavia, per svolgere il BENE compito, richiede molto più di una piccola scrittura su una pagina Web qui. Ecco perché zrep è uno shellscript di 2000 righe. Anche se si dovessero rimuovere tutte le parti che il problema originale non ha mai avuto bisogno, ci sarebbero comunque necessarie circa duecento righe di sceneggiatura per farlo BENE.
Philip Brown,
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.