original in en Brian Hone
en to nl Floris Lambrechts
Brian Hone is systeembeheerder en software-ontwikkelaar bij E Ink corporation. In zijn vrije tijd besurft hij koude waters en bungelt hij aan rotswanden.
Ik zou een waslijst aan redenen kunnen opsommen waarom back-ups de nachtmerrie zijn van de systeembeheerders. Als je er zelf ��n bent, dan hoef ik je er waarschijnlijk niks meer over te vertellen. Een greep uit het aanbod: dure hardware die vaker wel dan niet stuk is, dure software die extreem moeilijk te beheren is, en lange nachtelijke uren om verschillende versies van bestanden te herstellen. Om de zaak nog erger te maken hechten bedrijven over het algemeen erg weinig belang aan het maken van back-ups; tot de dag aanbreekt waarop ze nodig zijn uiteraard. Als je een beetje ervaring hebt in de sector van backup & restore, heb je waarschijnlijk al wel conversaties gehad zoals deze:
Gebruiker: "Ik ben een bestand kwijt. Ik wil dat je het meteen terugzet."
SysAdmin: "Ok, wat is de naam van het bestand?"
Gebruiker: "Geen idee, ik denk iets met een 'e' erin."
SysAdmin: "Ok, in welke directory stond het?"
Gebruiker: "Dat weet ik niet, het zou kunnen in ��n van deze drie..."
SysAdmin: "*Zucht* Weet je wanneer je het bestand voor het laatste hebt gebruikt?"
Gebruiker: "Wel... Ik denk dat het een dinsdag was in februari of april.
Wat is het probleem? Ik dacht dat jullie een backup systeem hadden om zulke
dingen op te lossen?"
Rsync is een krachtige implementatie van klein elegant algoritme. Zijn grote kwaliteit is dat het toelaat om heel efficiënt een kopie van een bestandssysteem bij te houden. Met rsync kun je heel snel een systeem opzetten waarmee je steeds een up-to-date kopie hebt van een bestandssysteem, of dit nu beschikbaar is via nfs, smb of ssh. Een andere sterke kant van rsync is de mogelijkheid om ook oude versies van bestanden bij te houden - bestanden dus die gewijzigd of zelfs verwijderd werden. Rsync heeft nog veel meer mogelijkheden, we kunnen ze onmogelijk allemaal vermelden. Een bezoekje aan rsync.samba.org is zeker aan te bevelen.
Om kort te gaan: we gebruiken een goedkope Linux doos met veel goedkope opslagruimte en een klein shell-scriptje om rsync aan te roepen. [Fig 1] Bij het maken van de back-up vertellen we rsync dat het een directory moet maken volgens het schema 'YY-DD-MM' - dit is de plaats waar de incrementele veranderingen zullen worden opgeslagen. Vervolgens onderzoekt rsync de gewenste servers op veranderingen. Als een file veranderd is, kopieert rsync de oude versie naar de incrementele directory en overschrijft het dit bestand in de primaire backup directory. [Fig 2]
In het algemeen zullen de veranderingen van 1 dag slechts een fractie uitmaken van de totale grootte van het bestandssysteem. In mijn ervaring gaat het om zo'n 0.5% tot 1%. Daarom kunnen we met een backup-volume van twee maal het volume van de file servers 50 tot 100 dagen incrementele backups op schijf bijhouden. Wanneer de schijven vol geraken verhuis je ze naar een veilige locatie (off-site) en vervang je ze door een nieuw stel schijven. In de praktijk is het mogelijk om meer dan zes maanden incrementele backups bij te houden. Als je er de ruimte voor vindt kun je de oude 'incrementals' zelfs kopi�ren naar een andere server voordat je de schijven verwisselt. Op die manier kun je een onbeperkte geschiedenis van incrementele backups op harde schijf beschikbaar houden.
Denk even terug aan de imaginaire conversatie van hierboven. In de plaats van een onhandig systeem met magnetische banden heb je nu een half jaar backup-geschiedenis gewoon beschikbaar op je Linux systeem. Met je favoriete combinatie van locate/find/grep kun je alles terugvinden waar de imaginaire gebruiker ooit mee bezig geweest is, met inbegrip van die bestanden 'met een e erin' die gedateerd zijn op een dinsdag in februari of april. Vervolgens drop je ze in de home directory van de gebruiker in kwestie en klaar is kees. Het probleem van het uitzoeken welk bestand nu eigenlijk het juiste is, is omgetoverd in mijn favoriete categorie van problemen: die van iemand anders.
Nu gaan we ons favoriete scenario doorlopen - de complete crash. Stel, je hebt een grote nfs/samba server die stuk gaat. Wel, als je een kopie hebt van de samba configuratie dan kun je in enkele minuten een read-only vervanging online brengen. Dat wil ik je wel eens zien doen met een tape back-up.
Tape Backup | Rsync | |
---|---|---|
Kost | Zeer hoog | Laag |
Volledige Back-up | Snel | Snel |
Incrementele Back-up | Snel | Snel |
Volledig terugzetten | Zeer traag, waarschijnlijk verspreid over meerdere tapes. | Snel - het staat op schijf. |
Bestanden terugzetten | Traag, misschien op verschillende tapes, correcte versie vaak moeilijk te vinden. | Zeer Snel - het staat op schijf en je kunt gebruik maken van UN*X tools zoals find, grep en locate. |
Volledige Crash | De enige optie is de server volledig terugzetten. | De backup server kan dienen als tijdelijke file-server. |
Er zijn verschillende manieren om een dergelijk systeem op te zetten. Al de tools zijn open source, zitten in alle distributies en zijn heel flexibel. We beschrijven hier ��n mogelijke setup, maar het is lang niet de enige mogelijke aanpak.
De basisvorm van dit script is afkomstig van de rsync website. In wezen gaat het maar om ��n commando:
rsync --force --ignore-errors --delete --delete-excluded --exclude-from=exclude_file --backup --backup-dir=`date +%Y-%m-%d` -av
De belangrijkste opties zijn:
Het volgende script kan elke nacht gedraaid worden via cron (aanwezig in elke distributie). Om het script iedere avond om 23u te laten starten, doe je "crontab -e" en typ je het volgende:
0 23 * * * /path/to/your/script
Hier is mijn shell scriptje dat alles aan elkaar lijmt. Nogmaals, er zijn ook andere manieren om dit aan te pakken, dit is slechts 1 mogelijke implementatie.
#!/bin/sh ######################################################### # Script to do incremental rsync backups # Adapted from script found on the rsync.samba.org # Brian Hone 3/24/2002 # This script is freely distributed under the GPL ######################################################### ################################## # Configure These Options ################################## ################################### # mail address for status updates # - This is used to email you a status report ################################### MAILADDR=jouw_email_adres_hier ################################### # HOSTNAME # - This is also used for reporting ################################### HOSTNAME=jouw_hostname_hier ################################### # directory to backup # - This is the path to the directory you want to archive ################################### BACKUPDIR=directory_die_je_wilt_backuppen ################################### # excludes file - contains one wildcard pattern per line of files to exclude # - This is a rsync exclude file. See the rsync man page and/or the # example_exclude_file ################################### EXCLUDES=example_exclude_file ################################### # root directory for backup stuff ################################### ARCHIVEROOT=directory_om_naar_te_backuppen ######################################### # From here on out, you probably don't # # want to change anything unless you # # know what you're doing. # ######################################### # directory which holds our current datastore CURRENT=main # directory which we save incremental changes to INCREMENTDIR=`date +%Y-%m-%d` # options to pass to rsync OPTIONS="--force --ignore-errors --delete --delete-excluded \ --exclude-from=$EXCLUDES --backup --backup-dir=$ARCHIVEROOT/$INCREMENTDIR -av" export PATH=$PATH:/bin:/usr/bin:/usr/local/bin # make sure our backup tree exists install -d $ARCHIVEROOT/$CURRENT # our actual rsyncing function do_rsync() { rsync $OPTIONS $BACKUPDIR $ARCHIVEROOT/$CURRENT } # our post rsync accounting function do_accounting() { echo "Backup Accounting for Day $INCREMENTDIR on $HOSTNAME:">/tmp/rsync_script_tmpfile echo >> /tmp/rsync_script_tmpfile echo "################################################">>/tmp/rsync_script_tmpfile du -s $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile echo "Mail $MAILADDR -s $HOSTNAME Backup Report < /tmp/rsync_script_tmpfile" Mail $MAILADDR -s $HOSTNAME Backup Report < /tmp/rsync_script_tmpfile echo "rm /tmp/rsync_script_tmpfile" rm /tmp/rsync_script_tmpfile } # some error handling and/or run our backup and accounting if [ -f $EXCLUDES ]; then if [ -d $BACKUPDIR ]; then # now the actual transfer do_rsync && do_accounting else echo "cant find $BACKUPDIR"; exit fi else echo "cant find $EXCLUDES"; exit fi