Disassembler

Artificial intelligence is no match for natural stupidity.
17říjen2011

Rsync: Inkrementální zálohování


Tu a tam se stane, že potřebujete zálohovat nějaké soubory. Třeba maily nebo web. Nebo třeba celý server. Můžete jednoduše vzít adresář a překopírovat jej do jiného umístění. A zítra tu starou zálohu přejmenovat a soubory zkopírovat znovu. Ale když vaše data mají nějakých 50 GB a zálohujete off-site na pomalém připojení, není to úplně to pravé ořechové.


S větším množstvím souborů narůstá šance, že většina z nich zůstane nezměněna. Chtělo by to tedy něco, co umožní nezměněný soubor místo stažení pouze vytáhnout ze staré zálohy. Anebo ještě líp - prostě na něj odkázat. Přesně k tomuhle účelu poslouží hardlinky. Jednoduše z nové zálohy odkážou na soubor ve staré záloze. Na rozdíl od symlinků, které pouze odkazují na soubor nebo adresář v jiném umístění, hardlinky odkazují přímo na záznam v souborovém systému, takže stále fungují, i když „zdrojový“ soubor smažete. Respektive soubor není fyzicky smazán, dokud na něj odkazuje alespoň jeden hardlink.

Ferda Mravenec přes zálohy


Pokud jste někdy koukali do manuálu k rsyncu, asi víte, že toho umí opravdu mnoho. Vytváření inkrementálních záloh umí také, jen mu musíte vysvětlit co, odkud a kam chcete. Klasický zálohovací one-liner

rsync -a /zdroj /zaloha

je třeba rozšířit o parametr link-dest, který říká, odkud se mají brát hardlinky na nezměněné soubory. Toto umístění zpravidla označuje starou zálohu.

Zálohujete-li více adresářů, bude se vám jistě hodit i parametr include-from, kam zadáte jméno souboru s informacemi o tom, co vše se bude zálohovat. A protože starší zálohy asi budete chtít archivovat, můžete si pro lepší přehled dovolit použít i parametr delete, takže záloha nebude obsahovat již smazané soubory a bude skutečně shodná s originálem.

rsync -a --delete --include-from=/zalohy/backup.inc --link-dest=/zalohy/current /zdroj /zaloha

Takový backup.inc pak může vypadat třeba následovně:

+ etc
+ etc/firewall.conf
+ etc/cron.d
+ etc/cron.d/**
+ etc/postfix
+ etc/postfix/**

+ var
+ var/mail
+ var/mail/**
+ var/www
+ var/www/**
- var/www/nezalohovat
- var/www/nezalohovat/**

- *

Jak jste asi pochopili, znaménko plus značí, co se bude zálohovat a mínus co se přeskočí. Jedna hvězdička pak znamená „vše v této složce“, dvě hvězdičky „vše v této složce a podsložkách“, přičemž pravidla se, jako v každém slušném programu, aplikují shora dolů.

Celou zálohovací rutinu pak můžete automatizovat skriptem

#!/bin/bash

DATE=`date "+%Y-%m-%d_%H-%M"`
BACKUP_DIR="/zalohy"

mkdir $BACKUP_DIR/backup_$DATE/
rsync -az --delete --include-from=/zalohy/backup.inc --link-dest=$BACKUP_DIR/current/ user@example.com:/ $BACKUP_DIR/backup_$DATE/

rm -rf $BACKUP_DIR/current
ln -s $BACKUP_DIR/backup_$DATE $BACKUP_DIR/current

if [ `ls $BACKUP_DIR -1 | wc -l` -gt 180 ]; then
  rm -rf $BACKUP_DIR/`ls $BACKUP_DIR -t1 | grep backup_ | head -n 1`
fi

díky kterému budete mít ve svých zálohách přehled

[root@localhost zalohy]# ll | tail -n 10
drwxr-xr-x 6 root root  4096 Oct 16 08:00 backup_2011-10-16_08-00
drwxr-xr-x 6 root root  4096 Oct 16 12:00 backup_2011-10-16_12-00
drwxr-xr-x 6 root root  4096 Oct 16 16:00 backup_2011-10-16_16-00
drwxr-xr-x 6 root root  4096 Oct 16 20:00 backup_2011-10-16_20-00
drwxr-xr-x 6 root root  4096 Oct 17 00:00 backup_2011-10-17_00-00
drwxr-xr-x 6 root root  4096 Oct 17 04:00 backup_2011-10-17_04-00
drwxr-xr-x 6 root root  4096 Oct 17 08:00 backup_2011-10-17_08-00
drwxr-xr-x 6 root root  4096 Oct 17 12:00 backup_2011-10-17_12-00
drwxr-xr-x 6 root root  4096 Oct 17 16:00 backup_2011-10-17_16-00
lrwxrwxrwx 1 root root    35 Oct 17 16:00 current -> /zalohy/backup_2011-10-17_16-00

A nejlepší na tom je to, že stahujete jen ty soubory, které se skutečně změnily. Takže místo 50 GB stahujete třeba jen 20 MB, což je únosné i na ADSL nebo jiném dial-upu.