Linux má nespočet programů, které pomáhají se zálohováním, ale i tak není snadné si z nich vybrat. Může to být Bacula, která se k zálohování staví komplexně nebo třeba rdiff-backup, který pomáhá se synchronizací adresářů a udržuje historii. Opomíjet bychom neměli ani rsnapshot, o kterém jsme psali nedávno v článku Zálohujeme s rsnapshot. Další nástroje najdete například na Archlinux wiki a věřte, že tím seznam nekončí. Každý nástroj něčím vyniká, má své výhody i nevýhody a není vždy jednoznačné, který použít.
Od zálohování můžeme čekat různé vlastnosti. Máme třeba několik obrazů virtuálních strojů, které by chtěly občas někam uložit a nebo adresář s obrovským množstvím souborů třeba s emaily. Navíc někdy je potřeba zálohovat někam na vzdálený stroj a někdy je k dispozici jen lokální disk. Obojí má své hranice, se kterými musí admin počítat a podle toho se rozhodnete pro jeden či druhý nástroj. Měl by se hlavně dívat na faktory jako kolik dat bude mít uloženo, jak hluboko do historie chce jít, kde budou data přístupná, jaké je šance, že se záloha poškodí a hlavně jak je obnoví, aby to netrvalo zbytečně dlouho. K tomu je ještě potřeba každý den proces zálohování sledovat, nejlépe automaticky a řešit promtně vzniklé problémy. Není nic lepšího než přijít o data a po slavnostním otevření zálohy zjistit, že žádná není, protože zálohovací proces už 14 dní stojí každý den na stejné chybě.
Ale to už možná trochu odbočujeme. Dnes chci psát o nástroji s názvem Pachy. Je napsaný v Pythonu a funkčností dokáže nahradit takové molochy jako rdiff-backup nebo rsnapshot. Pythoní vývojáři mají zvláštní smysl pro pojmenování svých výtvorů a zatímco nedávno zmiňovaný Bup měl svůj název hlavně proto, že byl volný, pachy je zkráceně pachyderm, což je v překladu tlustokožec.
Na pachy jsem narazil, když jsem hledal náhradu za rdiff-backup, který se k 80 GB dat začal stavět s odporem. Pachy ho v tomto úkolu dokázal bez problémů nahradit. Autorem je Bas Westerbaan a když se podíváte na GitHub, tak zjistíte, že to není nic jiného než wrapper pro programy rsync a xdelta3. Rsync je v unixových systémech již ověřená utilita a spousta zálohovacích nástrojů ji používá pro stahování jen změněných dat. Xdelta3 je nástroj, který porovnává dva binární soubory a umí vytvořit rozdílový soubor podobný tomu, co dává utilitka diff. Formát pro ukládání rozdílů je VCDIFF, jehož popis najdete v RFC3284. Díky tomu, že je pachy pouze wrapper k těmto dvěma nástrojům, mají jeho zdrojové kódy méně jak 200 řádků (rdiff-backup je 66× větší).
Instalace
Pokud vás pachy zaujalo, tak pro instalaci budete potřebovat několik balíčků. Jde o docela čerstvý nástroj, má i nějaké mouchy, ale hlavně se ještě nedostal snad do žádné distribuce. Proto je instalace trochu komplikovanější. Nejprve je potřeba se postarat o závislosti. Ty jsou:
- xz-utils
- rsync
- xdelta3
- python-pip
Pachy funguje jen s Pythonem verze 2.x, takže pozor na distribuce, které už jako výchozí používají Python 3. Pokud máte vyřešené závislosti, použijte:
# pip install pachy
Použití
Pachy dokáže zálohovat i data umístěná na vzdáleném serveru díky podpoře SSH a stejně jako další nástroje založené na rsyncu, drží lokální kopii dat, ke které vytváří rozdíly zpět do historie. Adresářovou strukturu se zálohami si nejlépe ukážeme na příkladu.
# pachy /etc /mnt/backups/
V adresáři backups nyní máme adresáře deltas a mirror, kde v adresáři mirror najdeme poslední verzi zálohovaných dat a v adresáři deltas zabalené rozdílové soubory, které z aktuálního mirror udělají jeden z předchozích mirrorů. Pachy při každé záloze spustí rsync, stáhne pomocí něj změněné soubory a uloží si je bokem do adresáře pile. Potom tyto soubory porovná s mirrorem a pomocí xdelta3 vytvoří rozdílové soubory, které obsahují jen ty části souborů, které se skutečně změnily a uloží je do adresáře deltas. Pokud dojde ke smazání nějakého souboru, bude tento soubor uložen celý. Pokud běží pachy pod rootem, drží se zálohované soubory svá meta data a tak je možné je obnovit opravdu jedna ku jedné se vším všudy.
Pokud se data nacházejí na vzdáleném serveru, probíhá záloha podobně, jen se uvede adresa vzdáleného serveru.
# pachy muj_server:/etc /mnt/backups/
Tím zazálohujeme adresář etc na serveru muj_server. V tomto případě doporučuji používat SSH klíče a konfigurační soubor ~/.ssh/config, kde je možné nastavit všechny parametry přenosu a předat pachy jenom identifikátor serveru.
Host muj_server
HostName 1.2.3.4
User root
Port 22
Compression yes
Detaily k tomuto konfiguračnímu souboru najdete v manuálové stránce ssh.
$ man ssh_config
Obnova
Jak jsem řekl, důležitá je i obnova dat a je to prakticky to první, co by mělo správného admina zajímat, když vytvoří nějakou zálohu. U pachy to platí dvojnásob, protože obnova nemusí být úplně triviální a možná bude vyžadovat i nějaké skriptovací schopnosti. Určitě si ji vyzkoušejte ještě předtím, než ji budete skutečně potřebovat. Předejdete tím nepříjemným situacím. V pachy je podoba dat z poslední záloha dostupná v adresáři mirror a tak si ho stačí otevřít. Bohužel, uživatel, kterému data zálohujete, se ne vždy ozve hned jak o data přijde a ani vy si nemusíte hned uvědomit, že je něco špatně. Proto tu máme díky historii vytvořenou pomocí xdelta3 a můžeme z ní vytvořit jeden z předchozích stavů vybraného souboru. Udělal jsem si tedy pár pokusných záloh adresáře etc, kde jsem občas něco upravil a zazálohoval znovu. Konkrétně se změny týkají souboru /etc/change2/test, kde jsem uložil řetězec test a k němu číslo. Měl bych mít celkem tři zálohy, kde se hodnota mění od test1 po test3 a test3 je aktuální verze, kterou můžu najít v mirror.
Pokud chci zjistit, jak na tom byl soubor /etc/change2/test o dvě zálohy zpět, vylistuju si seznam rozdílových archivů:
-rw-r--r-- 1 root root 260 2012-03-08 22:01 2012-03-07@22h01.33.tar.xz
-rw-r--r-- 1 root root 264 2012-03-08 22:02 2012-03-07@22h02.34.tar.xz
-rw-r--r-- 1 root root 252 2012-03-08 22:03 2012-03-07@22h03.08.tar.xz
-rw-r--r-- 1 root root 252 2012-03-08 22:03 2012-03-07@22h03.12.tar.xz
-rw-r--r-- 1 root root 252 2012-03-08 22:03 2012-03-07@22h03.42.tar.xz
Zjistím, že dvě zálohy zpět se nachází archiv 2012–03–07@22h03.12.tar.xz, ale abych se k němu dostal, musím ještě použít 2012–03–07@22h03.42.tar.xz. Rozbalím tedy ten:
tar xf backups/deltas/2012-03-07@22h03.42.tar.xz
A v aktuálním adresáři se mi objeví adresáře deleted a changed, ve kterých najdu smazané soubory a nebo rozdíly ke změněným souborům. Abych zjistil co se nacházelo v /etc/change2/test, aplikuji uložený patch pomocí xdelta3:
$ xdelta3 -d -s backups/mirror/change2/test changed/change2/test.xdelta3 test.restore
$ cat test.restore
test2
Stejný postup opakuji pro 2012–03–07@22h03.12.tar.xz, ale místo souboru z aktuální podoby dat použiju test.restore.
Shrnutí
Obnova dat z předchozích záloh není úplně triviální, ale pachy je mladý nástroj a jeho vývojář do něj ještě ledasco doplní. Navíc jde o vcelku krátký a jednoduchý kód a není složité ho vylepšit kromě obnovy i o další funkce. Samotný způsob zálohy je velmi jednoduchý, je postaven na spolehlivém programu rsync a díky xdelta3 je velikost rozdílových souborů minimalizována.