Posted by under Arbejde on August 22 2010, 5 comments

Jeg har længe brugt Bacula til backup af maskiner. Det kører faktisk smertefrit, selvom opsætningen er lidt langhåret til tider, og man måske savner et gui til opsætningen.

Anyways, min kærlighed er netop faldet på Bacula, fordi det kan linux, freebsd og windows (og mac, men der bruger vi andre ting).

Jeg har med tiden lavet et lille script til at dumpe configfiler ud med kodeord, og opsætning, så det er relativt simpelt at tilføje nye hosts. man kunne sikkert udvide det lidt med en mysql man bare kunne tilføje hosts i, og så dumpe configs ud fra. Det må blive mit næste projekt :)

Bacula laver full, incredimental og differential backups.. Det er open source, det er under udvikling.. Og virker.

Nu har jeg længe kørt det med lokalt storage, og jo mere skrammel vi har, jo mere plads skal vi bruge, for at holde sikkerhedskopier for samme periode som altid. Maskineparken bliver større og jo mere strøm bruger vi. Der er kun en vinder, og det er ikke mig.

Nu tester jeg så et setup med Amazon S3 som lagerplads, dels fordi det er billigt (strøm er dyrt), men også fordi det opfylder en af mine vigtige krav om offsite backup. Vores setup består af en lokal virtuel maskine som bacula server, s3fs som fuse filsystem mount, og lidt hacks og wacks for at få det til at køre.

Og det kører faktisk fint, min største hage ved det er, at disken først skrives lokalt, og så synces ud (hvor reelt man bare står og venter på ok fra filskrivningen) dette kunne sikkert laves mere fikst. S3fs cacher de åbnet filer lokalt, og man kan vælge at ryde op i dem selv, evt med et par dages cache så man dermed minimerer behovet for at have stor lokal disk tilknyttet.

Så, hvordan kommer du igang?
Start med en bacula der virker, og sæt den op til at tage backup til en lokal disk. Når det virker, så er du klar til at lege med Amazon S3.

Opret en konto hos Amazon S3. Lav en “bucket” på US standard lokationen (r177 virker kun med denne lokaltion)

Installation af s3fs
jeg tager udgangspunkt i FreeBSD, og i r177 af s3fs, da det er denne som pt er i ports.

Start med at find s3fs, det er i ports i dette dir /usr/ports/sysutils/fusefs-s3fs
Du laver nu en “make patch” som udfører patchprocessen og nu er pakken klar til compiling, men vi skal lige tilføje lidt extra detaljer som består af en diff som du kan finde her:

[code]

--- s3fs.cpp.orig       2010-02-05 03:45:59.000000000 +0300
+++ s3fs.cpp    2010-05-14 20:51:44.000000000 +0400
@@ -345,7 +345,7 @@
 static string AWSAccessKeyId;
 static string AWSSecretAccessKey;
 static string host = "http://s3.amazonaws.com";;
-static mode_t root_mode = 0;
+static struct stat root_stat;
 static string service_path = "/";

 // if .size()==0 then local file cache is disabled
@@ -807,8 +807,7 @@
        cout << "getattr[path=" << path << "]" << endl;
        memset(stbuf, 0, sizeof(struct stat));
        if (strcmp(path, "/") == 0) {
-               stbuf->st_nlink = 1; // see fuse faq
-               stbuf->st_mode = root_mode | S_IFDIR;
+               *stbuf = root_stat;
                return 0;
        }

@@ -1278,6 +1277,10 @@
 s3fs_readdir(const char *path, void *buf, fuse_fill_dir_t filler, off_t
offset, struct fuse_file_info *fi) {
        //cout << "readdir:"<< " path="<< path << endl;

+       // add .. and .
+       filler(buf, ".", NULL, 0);
+       filler(buf, "..", NULL, 0);
+
        string NextMarker;
        string IsTruncated("true");

@@ -1593,7 +1596,7 @@
                        struct stat buf;
                        // its the mountpoint... what is its mode?
                        if (stat(arg, &buf) != -1) {
-                               root_mode = buf.st_mode;
+                               root_stat = buf;
                        }
                }
        }

[/code]

Dette er for at få . og .. med på directory listingen, et nødvendigt onde, da bacula bruger det til at definerer at directory eksisterer.

Du laver nu en normal “make install” og laver lidt kaffe..

.. husk at load kldmodulet, “kldload /usr/local/modules/fuse.ko”, du er nu klar til at loade din “bucket”.

Lav et dir som du ønsker at bruge til din bucket, feks /usr/local/backup, og find dit accessKeyId og secretAccessKey under dit amazon login.

Du er nu klar.

Komandoen for at attache drevet er:
/usr/local/sbin/s3fs mybucket -o readwrite_timeout=86400 -o use_cache=/usr/local/s3fs-tmp -oallow_other -o accessKeyId=[amazonid] -o secretAccessKey=[amazonsecret] /usr/local/backup

eller det burde det være, i virkeligheden har jeg haft bedst resultat ved at slå debugging til, og bare lade det være på, det ser sådan her ud:

/usr/local/sbin/s3fs mybucket -d -o readwrite_timeout=86400 -o use_cache=/usr/local/s3fs-tmp -oallow_other -o accessKeyId=[amazonid] -o secretAccessKey=[amazonsecret] /usr/local/backup &

Sidste fintuning..
Du skal ændre din pool (eller pools) i bacula til at splitte dine filer op, dette kan også have betydning for labelformat, så hermed min definition af labelformat og splitting. Dette skal ske pga begrænsning hos Amazon S3, jeg har så valgt en begrænsning der er lidt lavere for at speede evt fragmentering af filer op.. Er dog i tvivl om det har en reel effekt.. Grænsen på Amazon S3 er svjv 5 GB.

Maximum Volume Jobs = 1 # One diskfile / backup
LabelFormat = “${Client}_${Job:s/ /_/g}_${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-${Hour:p/2/0/r}-${Minute:p/2/0/r}-${Second:p/2/0/r}_${Level}”
Maximum Volume Bytes = 500000000;

Husk at genstarte din bacula..

Sådan, du er nu klar til at slå det hele til..

Tip: skulle din s3fs lukke af en årsag, så er det nok smart at den automatisk starter igen. Du kan derfor med fordel lave en lille bash ting som tjekker for en given fil på s3fs drevet hver time, og genopretter forbindelsen hvis den ikke er der mere..

Tip2: Det kan være en fordel at lave et subdir til hver maskine, da s3fs tilsyneladende laver en eksklusiv lock på diret under upload.

Tags: , , , ,

5 Comments

  • By tykling on 22 August 2010 at 10:15 pm

    Spændende, og rart at høre om et alternativ til mit eget setup med Dirvish og Duplicity med rsync.net som backend. Hvordan forholder du dig til kryptering af remote data ? Er der nogen kryptering ?

    Dejligt med noget teknisk indhold på bloggen. Mere af det!

  • By czar on 23 August 2010 at 7:22 am

    et godt spørgsmål thomas, og svaret ligger i bacula setup

    et lille udpluk fra manualen om kryptering:
    http://www.bacula.org/en/dev-manual/main/main/Data_Encryption.html

    .. og så er der vist ingen undskyldning for ikke at gøre det :)

  • By tykling on 23 August 2010 at 11:01 am

    Smart. Bacula for the win.

  • By Morten Liebach on 23 August 2010 at 1:31 pm

    Jeg bruger tarsnap: http://www.tarsnap.com/

    Det klarer kompression og kryptering og bruger også Amazon som backend, og er meget nemmere at sætte op. Og tarsnap er Colin Percival’s firma, og han er ikke helt dum.

  • By Christian Winther on 19 September 2010 at 12:02 pm

    Jeg prøvede dit setup, og synes ikke bacula performede særlig godt over s3fs, tog mange timer for backup af mine servere pludselig. Ikke så fedt.

    Jeg fandt så Jungle Disk (https://www.jungledisk.com/business/), som også bruger S3 / CloudFiles backend, og det performer væsentlig bedre.

    De har både en server og workgroup edition (svarer ca. til hvad dropbox kan)

RSS feed for comments on this post. TrackBack URL

Leave a comment