Rdiff-backup

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen KornAndras (vitalap | szerkesztései) 2010. január 18., 02:23-kor történt szerkesztése után volt.

(eltér) ←Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

Írta: Andocsi László, 2009. december.

Ez a szócikk az rdiff-backup nevű backup-megoldást mutatja be. Javaslom, hogy mielőtt elolvasod, nézd meg a Backup szócikket is, mert néhány ott leírt fogalmat itt csak használni fogok.

Az rdiff-backup differenciális mentést hajt végre, a hagyományostól kissé eltérő formában. A megszokott backup-rendszereknél lenne egy "régen" készült teljes mentésünk, valamint inkrementális mentéseink, amelyek az ehhez képesti különbséget, a legutóbbi teljes mentés óta történt változásokat tartalmazzák. Az rdiff-backup-nál ez nagyjából fordítva van: a legfrissebb mentés mindig teljes, és a korábbi mentések inkrementálisak. Az rdiff-backup olyan fájlokat tárol, amelyek segítségével az aktuális mentésből előállíthatóak korábbi állapotok. Így az aktuális mentés visszaállítása rendkívül gyors (lényegében egyetlen másolás), és minél korábbi állapotot szeretnénk visszaállítani, annál tovább fog tartani a dolog.

Az első mentés egy teljes mentés, ami hosszú ideig tart, de a differenciák ettől kezdve nagyjából azonos idő alatt készülnek el és általában jelentősen gyorsabban, mint a teljes mentés (ez persze attól is függ, milyen és mennyi változás történik két mentés között).

Tartalomjegyzék

1 Előnyök

  • A teljes backup tükrözés formájában áll rendelkezésre, ezért nagyon gyorsan visszállítható belőle bármi.
  • A különbségek mindig az előző mentéshez képest készülnek, így gyorsan megtörténik a biztonsági mentés.
  • Az különbségek tömörített formában tárolódnak, így kevés helyet foglalnak.
  • Követi a Unix-filozófiát:
    • az rsync-re épül, nem írtak hozzá saját rsync-szerűséget.
    • Távoli gépekre ssh segítségével kapcsolódik, nem saját megoldással.
  • Natív windowsos kliens is létezik hozzá.

2 Hátrányok

  • Nem folyamatos a backup, hanem eseti.
  • A teljes mentés tömörítés nélkül, tükrözés formájában van jelen, így sok helyet foglal.
  • Nem tudja titkosítva tárolni a biztonsági mentést (pl. duplicity-vel ellentétben).

3 Szakácskönyv

Ebben a fejezetben egy olyan konkrét rendszer beállítását mutatom be, amely egy vagy több távoli gép biztonsági mentését végzi el automatikusan, felügyelet nélkül, rendszeres időközönként. Inkrementális biztonsági mentést készít és a mentési folyamatot a backup szerverről indítjuk, így több gép biztonsági mentését is hatékony erőforráskihasználással végezhetjük.

3.1 A backup rendszer áttekintése

Attekintes1.png A "Backup server" az a szerverünk, ahol a biztonsági másolatokat szeretnénk tárolni, ill. ahonnan a biztonsági mentést indítjuk. Az rdiff-backup más módokon is képes működni, de ebben a leírásban azt a módszert mutatjuk be, amikor a backup szerver indítja a backup folyamatokat a backupolandó kliensek felé. Ennek az az előnye, hogy a backup folyamatok rövidebb ideig fognak tartani, mintha minden kliens össze-vissza próbálná feltölteni a saját filejait a backup szerverre. Így terhelési tüskék sem alakulnak ki sok kliens egyszerre csatlakozásakor, valamint priorizálhatjuk is a backup folyamatokat, pl. éjjelre a nappal nagyobb terhelésnek kitett szervereket, míg a kisebb terhelésű szervereknél nem annyira probléma, ha a backupolási folyamat belecsúszik a reggelbe.

Attekintes2.png
A cron gyűjtőscriptben helyezhetjük el az egyes backupscriptjeinket. Az egyes backup scriptekben pedig a backup kliensek backup folyamatait kell leírnunk. Milyen könytárakat, fileokat hova backupoljon a backup szerveren. Pl. Lehet, hogy külön helyen akarjuk tárolni a rendszerrel kapcsolatos fileokat és külön helyen a mail archívokat és megint külön helyen a webtartalmakat. Amikhez aztán, ha külön filerendszeren tároljuk őket külön-külön quota-t adhatunk meg (vagy megfelelő filerendszer esetén könyvtárakhoz rendelhetünk quota-t).
A backup szerver a backup klienshez SSH-n keresztül csatlakozik és elindítja a backupolandó gépen az "sudo rdiff-backup --server" parancsot. Sudo-val indítja, hogy root jogosultsággal futhasson a program, így a rendszeren lévő fileokhoz root jogokkal férhessen hozzá. Az rdiff-backup --server módban fogadja a backup szerver utasításait arra vonatkozóan, hogy milyen fileokat kell megnéznie és azok különbségeit vagy a teljes filet átküldenie. A backup szerveren a backupoló folyamat user módban fut, és az rdiff-backup külön fileban tárolja a fileok dátum ill. jogosultság információit. Visszaállításkor természetesen, ahol a visszaállítás történik root jogokkal futnia szintén az rdiff-backupban. Valamint lehetőség van user mapping alkalmazására is visszaállításkor ha nem azon a rendszeren állítjuk vissza, ahol a backup készült. (És ha katasztrófa esetén szükség van a backupra akkor valószínű, hogy nem azon a rendszeren lesz visszaállítva)

3.2 A backup-szerver telepítése

Ez a leírás alapértelmezett beállításokkal telepített Debian Lenny 5.0 rendszert feltételez úgy szerver-, mint kliensoldalon.

Csomagok telepítése:

# apt-get update
# apt-get install rdiff-backup sudo openssh-server fail2ban \
hddtemp smartmontools munin-node munin-plugins-extra
  • rdiff-backup: maga a backup-program.
  • sudo: ahhoz szükséges, hogy az rdiff-backup-ot szerver-módban futtathassuk a célrendszeren. Mivel a backup-szerverről önmagáról is akarunk biztonsági másolatot készíteni, ezért ezen a rendszeren is szükség van erre.
  • openssh-server: azért kell, hogy a kliensek tudjanak kapcsolódni.
  • fail2ban: az ssh-s jelszópróbálgatókat tiltja ki (nem szükséges, csak ajánlott).
  • hddtemp, smartmontools, munin-node, munin-plugins-extra: monitorozáshoz (nem szükséges, csak ajánlott).

3.3 SSH-szerver beállítása

A /etc/ssh/sshd_config-ba írjuk bele az alábbiakat:

  PermitRootLogin no
  TCPKeepAlive yes
  AllowUsers <saját felhasználó> lhbackup
  • PermitRootLogin: letiltjuk a root bejelentkezését SSH-n keresztül (nem szükséges, csak ajánlott)
  • TCPKeepAlive: az SSH-t utasítjuk, hogy időnként küldjön keepalive-csomagot. Ez ahhoz kell, hogy hamarabb észrevegye, ha megszűnt a kapcsolat a klienssel. Nem szükséges, de ajánlott.
  • AllowUsers: Ezzel a direktívával adhatjuk meg, mely felhasználókat engedi bejelentkezni az sshd. Egyáltalán nem kötelező megadni, de ha beállítjuk, állítsuk be úgy, hogy a saját, a gép távmenedzsmentjére használt felhasználónk és a backupokkal kapcsolatos felhasználó is be tudjon lépni.

3.4 Tűzfalszabályok

Értelemszerűen gondoskodni kell arról, hogy a mentendő kliensek tudjanak a szerver SSH-portjához kapcsolódni.

3.5 Egy gép felvétele a backupolandó kliensek közé

Felhasználó felvétele: azért veszünk fel egyedi felhasználót, mert ennek a usernek a nevében fog futni majd az rdiff-backup a backup szerveren. Sima userként fut, jogosultságai korlátozottak és ennek a usernek lehet quota-ja is. Így az egyik backup nem eszi el a másik elől a helyet. A dátumot, jogosultságokat, stb. az rdiff-backup saját maga elintézi, tárolja külön. A quota beállításokat az olvasóra bízom.

Tehát vegyük fel az új felhasználót a backup szerveren:

# adduser --system --ingroup nogroup --disabled-password <szervernév>

Állítsunk elő neki egy új RSA-kulcspárt:

# sudo -H -u <szervernév> ssh-keygen -t rsa -b 4096

Az új felhasználó ~/.ssh/config fájljába írjuk bele a következőket:

  host <szervernév>-backup
     hostname <szerverelérés, domain vagy IP>
     user lhbackup
     compression yes
     protocol 2
     port 22

A beállítások jelentését l. pl. az ssh_config(5)-ban; de talán egyértelműek is.

3.6 Backup-scriptek

A backup-scriptek az rdiff-backup paraméterezésének megfelelően egyszerűen elkészíthetőek. Ezeket aztán cronból futtathatjuk backup szerveren. Az rdiff-backup használatát legegyszerűbben példákon keresztül lehet jól megértetni és szemléltetni amihez segítség a következő link: Rdiff-backup Examples (angol). A BackupNinja szócikkben is találhatunk példákat.

3.6.1 Példák

gep01:

#!/bin/bash

EXCLUDES="--exclude /dev --exclude /proc --exclude /tmp --exclude /sys"

echo "Removing increments older than 30 days..."
/bin/su <szervernév> -m -c "/usr/bin/rdiff-backup --force --remove-older-than 30D /home/<szervernév>/backup"

echo "Backing up <szervernév>..."
/bin/su <szervernév> -m -c "/usr/bin/rdiff-backup $EXCLUDES <szervernév>-backup::/ /home/<szervernév>/backup"

gep02:

#!/bin/bash

EXCLUDES="--exclude /dev --exclude /proc --exclude /tmp --exclude /sys --exclude /opt"

echo "Removing increments older than 30 days..."
/bin/su <szervernév2> -m -c "/usr/bin/rdiff-backup --force --remove-older-than 30D /home/<szervernév2>/backup"

echo "Backing up <szervernév2>..."
/bin/su <szervernév2> -m -c "/usr/bin/rdiff-backup $EXCLUDES <szervernév2>-backup::/ /home/<szervernév2>/backup"

Ezt követően a cronból egy gyűjtőscriptet használhatunk:

#!/bin/bash

date
time /root/gep01
date
time /root/gep02
date

A gyűjtőscript használata azért célszerű, mert így a gépeket sorban menthetjük, folyamatosan és egyenletesen van terhelve a backup-szerver. A date és time parancsok segítségével láthatjuk az egyes backupok kezdési és befejezési idejét, valamint, hogy mennyi ideig tartott a procedúra. Természetesen ha a fenti példa alapján valósítjuk meg a scripteket, akkor számítanunk kell arra, hogy a cron naponta leveleket fog küldeni nekünk a backupolási folyamat eredményéről. Ha ez nem célunk, akkor minden mehet a /dev/null-ba. Figyeljünk arra, hogy a backup folyamat be tudjon fejeződni a rendelkezésre álló idő alatt. Tehát mielőtt újraindulna cron-ból a script. Ha nem fejeződik be, akkor átlapolódások jöhetnek létre, aminek nem látható következményei lesznek. Valószínűleg az rdiff-backup nem fog új backup folyamatot kezdeni a célkönyvtárban, mert felismeri, hogy már fut egy másik rdiff-backup azon a könyvtáron, de pl. a kitörölheti a már futó rdiff-backup alól a régi fileokat a "--force" opció miatt, aminek valószínűleg backup sérülés lesz az eredménye. Ha ezt nem akarjuk, akkor ne használjuk a --force opciót, aminek a következtében viszont betelhet a winchester ha olyat akarunk törölni, amit az rdiff-backup valamiért még megtartana.

4 A kliensek telepítése

Csomagok telepítése:

# apt-get update
# apt-get install rdiff-backup sudo openssh-server

Itt létrehozunk egy backup felhasználót (lhbackup), amelynek a nevében a Backup Server majd be tud ssh-zni a mentendő gépre, és amely sudoval rootként tudja futtatni az 'rdiff-backup --server' parancsot:

# adduser --ingroup nogroup --disabled-password lhbackup
# chmod 0700 /home/lhbackup

4.1 A sudo beállítása

lhbackup ALL=(ALL) NOPASSWD: /usr/bin/rdiff-backup --server

4.2 További beállítások

Biztosítanunk kell, hogy az lhbackup user be tudjon lépni a mentendő gépre ssh-val, jelszó megadása nélkül; de ez még kevés. Az lhbackup user .ssh/authorized_keys fájljában a írjuk elő, hogy a backupszerver IP-jéről belépve csak az rdiff-backupot futtathatjuk:

command="sudo /usr/bin/rdiff-backup --server",from="<BACKUPSZERVER IPCIME>" <PUBLIKUS RSA-KULCS>
Személyes eszközök