2012-05-21 10 views
9

Desidero eseguire il mirror di una directory di backup utilizzata da rsnapshot in una seconda posizione per maggiore sicurezza. Idealmente la soluzione userebbe rsync con ssh. Quali argomenti devo fornire a rsync per preservare i collegamenti fisici (creati da rsnapshot) e collegamenti simbolici, per eliminare file, copiare ricorsivamente, per eliminare file nella destinazione, ecc.? I file sono tutti su file system ext3. Inoltre, cosa posso fare per evitare la possibilità che se la sorgente è corrotta i difetti vengano ridefiniti allo specchio?Directory di backup mirrorback mirror

+0

ho scoperto che c'è un rsnapshot-copy script chiamato che è destinato per la sincronizzazione iniziale: [rsnapshot-copia] (http://cpansearch.perl.org/src/DCANTRELL/App-Rsnapshot-1.999_00002/utils/rsnapshot-copy). Nell'intestazione di questo file si afferma: 'rsnapshot-copy attualmente non è progettato per il mirroring incrementale di uno snapshot root (sebbene possa essere aggiunta una modalità incrementale in futuro).» Qualche idea su come supportarlo? – highsciguy

+0

Un'ulteriore idea è quella di utilizzare i file di log di rsnapshot (forse prima modificare le routine di registrazione interne di conseguenza) per creare uno script di shell che esegua esattamente le stesse operazioni mv e rsync eseguite da rsync sul backup principale anche per la copia speculare del backup . – highsciguy

+0

Per chiarire un po ', dove vedo il problema con un normale rsync (vedi risposta sotto). Se un file nei percorsi di rsnapshot viene danneggiato (ad esempio a causa di un errore del disco), a causa dell'uso di collegamenti fisici, sarà danneggiato in tutte le istantanee più recenti a meno che non sia stato modificato in seguito. Ciò significa che il file è perso. Se eseguo un normale rsync automatico su una copia speculare del backup, alla fine sovrascriverò il file sul mirror con la sua versione corrotta senza accorgertene. La domanda è se esiste una soluzione che eviti questo. – highsciguy

risposta

6

Penso che le opzioni per fare ciò che si desidera siano ampiamente documentate nella pagina man rsync. In particolare, l'opzione -H (--hard-links) attiva il rilevamento del collegamento fisico e --delete farà sì che rsync elimini le cose sulla destinazione che non esistono sulla sorgente. Così forse qualcosa di simile:

rsync -aH --delete /path/to/src/ /path/to/destination 

Inoltre che cosa posso fare per evitare la possibilità che se la fonte è danneggiato i difetti sono rsynced allo specchio?

Bene, è difficile. Come si rileva la corruzione? Penso che l'unica vera soluzione sia quella di scaglionare il backup del backup (ovvero, eseguire i backup effettivi sulla destinazione principale, quindi rsync alla destinazione secondaria immediatamente prima della successiva esecuzione di backup). In questo modo se rilevi un problema che hai fino alla prossima sessione di backup per ripristinare le cose.

Una soluzione diversa potrebbe essere il backup di rsnapshot su più destinazioni, in modo da generare effettivamente backup dalla sorgente originale in due posizioni distinte. In questo modo, se uno viene danneggiato, il secondo non dovrebbe essere modificato.

+0

Sicuramente tutte le opzioni sono nella pagina man. Volevo solo assicurarmi di non dimenticarlo. Ma l'opzione -a sembra essere piuttosto compatta. La rnapshot in due posizioni non sarà fattibile poiché le due destinazioni non saranno disponibili contemporaneamente. Non sarebbe possibile rsincronizzare sempre solo le nuove istantanee allo specchio? In questo modo le istantanee più vecchie in questa posizione verrebbero mantenute anche se sono danneggiate nella posizione principale.Ovviamente avrei bisogno di ripetere la rinomina che viene eseguita da rsnapshot quando aggiunge uno snapshot ... – highsciguy

1

Per impedire la copia di dati corrotti è possibile mantenere un backup settimanale e sperare che si noti il ​​danneggiamento all'origine prima di aver perso tutti i backup. Il modo migliore sarebbe usare -c e quindi confronterà le somme di controllo sia di origine che di destinazione per determinare se copiare il file. L'unico lato negativo è che deve leggere l'intero file rendendo il backup un processo più lento.

#!/bin/sh 
# Create a Backup of Today 
# Definitions 
sevendaysago=$(date --date='6 days ago' +%Y-%m-%d-%A) 
# Delete backups from 7 days ago 
rm -rf /storage/backups/$sevendaysago 
mkdir -p /storage/backups/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$username 

rsync -aHvz /storage/`date --date=yesterday +\%Y-\%m-\%d`-`date --date=yesterday +\%A`/$host/$user/ /storage/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$user/ 

rsync -acHvz -e ssh --delete --exclude='logs' [email protected]:/home/tim/ /storage/`date +\%Y-\%m-\%d`-`date +\%A`/$host/$user/