Zálohy jsou u nás realizovány pomocí ZFS snapshotů. Při vytvoření snapshotu se uchová obraz všech dat v datasetu, tak jak v tu chvíli vypadají. Když tedy data po vytvoření snapshotu změníme nebo smažeme, vždy se k nim můžeme vrátit.
Ze snapshotu můžeme data libovolně číst, případně celý dataset obnovit z vybraného snapshotu. Obnovou na snapshot ale přijdeme o všechny data (změny), které proběhly od vytvoření snapshotu.
Snapshoty jsou vidět v menu Backups. Tam je možné je také vytvářet.
Zálohování VPS probíhá tak, že každý den v 01:00 se v rámci jednoho node udělá snapshot všech datasetů najednou. Poté jsou snapshoty přesunuty na backuper.prg. Snapshoty uchováváme po dobu 14 dnů, starší se mažou. K tomu je možné si vytvořit 6 snapshotů navíc pro vlastní potřebu. Vytvořené snapshoty VPS však nelze libovolně mazat, je nutné počkat, až se samy odrotují v rámci denních záloh.
Pozor! NAS není zálohován na backuper.prg. Snapshoty jsou pouze lokální a slouží jen jako ochrana proti nechtěnému smazání či poškození dat.
Mazat jdou jen snapshoty z NASu. U snapshotů VPS je nutné počkat, až se samy odrotují v rámci denních záloh.
Obnova vždy funguje na úrovni datasetu. Když má VPS subdatasety a rootfs je obnoven ze zálohy, subdatasety obnoveny nejsou. Tzn. je možno obnovit jakýkoliv dataset, aniž by to mělo vliv na ostatní datasety.
NAS je možné snapshotovat pouze manuálně. Jelikož ale není zálohován na
backuper, obnova se chová stejně jako zfs rollback -r
, tzn. obnova na
starší snapshot smaže všechny novější snapshoty. Je to nevratná operace.
Pro obnovu dat ze zálohy na NASu bez smazání snapshotů si zvolený snapshot moutněte do VPS a data vykopírujte.
Zálohy můžeme stahovat buď přes webové rozhraní nebo CLI. CLI má výhodu v tom, že nemusíme čekat na e-mail s odkazem na stažení zálohy, ale stahujeme ihned, připadně jde celý proces automatizovat. Můžeme stáhnout buď tar.gz archiv, nebo přímo ZFS data stream (i inkrementálně).
Inkrementální záloha obsahuje pouze změněná data od předchozího snapshotu. Aby klient dokázal vyhodnotit, které snapshoty lze stahovat inkrementálně, každý snapshot obsahuje identifikátor historie (číslo). Snapshoty se stejným identifikátorem mohou být přeneseny inkrementálně. Tok historie naruší reinstalace VPS nebo obnova ze zálohy, poté je identifikátor historie navýšen o 1 a znovu se musí stáhnout plná záloha.
Identifikátor historie je znázorněn v tabulce se seznamem snapshotů v menu Backups.
$ vpsfreectl snapshot download --help snapshot download [SNAPSHOT_ID] Download a snapshot as an archive or a stream Command options: -f, --format FORMAT archive, stream or incremental_stream -I, --from-snapshot SNAPSHOT_ID Download snapshot incrementally from SNAPSHOT_ID -d, --[no-]delete-after Delete the file from the server after successful download -F, --force Overwrite existing files if necessary -o, --output FILE Save the download to FILE -q, --quiet Print only errors -r, --resume Resume cancelled download -s, --[no-]send-mail Send mail after the file for download is completed -x, --max-rate N Maximum download speed in kB/s --[no-]checksum Verify checksum of the downloaded data (enabled)
Není-li ID snapshotu předáno programu jako argument, interaktivně se na něj zeptá:
$ vpsfreectl snapshot download Dataset 14 (1) @2015-12-04T00:00:02Z VPS #198 (2) @2015-12-01T09:08:28Z (3) @2015-12-01T09:10:10Z (4) @2015-12-01T11:25:55Z (5) @2015-12-01T11:36:03Z (6) @2015-12-01T11:54:51Z (7) @2015-12-01T11:55:19Z (8) @2015-12-01T12:02:27Z (9) @2015-12-01T12:27:50Z (10) @2015-12-01T12:37:50Z (11) @2015-12-01T12:55:46Z (12) @2016-02-29T09:56:03Z (13) @2016-02-29T10:08:31Z (14) @2016-02-29T10:08:35Z Pick a snapshot for download:
Budeme stahovat 4. snapshot (@2015-12-01T11:25:55Z
):
Pick a snapshot for download: 4 The download is being prepared... Downloading to 198__2015-12-01T12-25-56.tar.gz Time: 00:01:37 Downloading 0.3 GB: [=====================================================================================] 100% 992 kB/s
Přepínačem --format
vybereme, jestli chceme stáhnout tar.gz, data
stream, nebo inkrementální data stream. Ve výchozím stavu dojde ke stažení
tar.gz archivu.
Soubor můžeme buď nechat pojmenovat vpsAdminem
(SnapshotDownload#Show.file_name),
nebo si zvolit vlastní umístění pomocí přepínače --output
. Pokud je použit
--output=-
, výstup je přesměrován na stdout.
Program umožňuje stáhování přerušit (třeba Ctrl+C
) a následně na něj opět
navázat. Pokud není použit přepínač --resume
, nebo --force
,
program se uživatele zeptá, jestli má pokračovat ve stahování, nebo začít
znovu.
-[no-]delete-after
), což je až týden od prvního
stahování.
$ vpsfreectl snapshot send --help snapshot send SNAPSHOT_ID Download a snapshot stream and write it on stdout Command options: -I, --from-snapshot SNAPSHOT_ID Download snapshot incrementally from SNAPSHOT_ID -d, --[no-]delete-after Delete the file from the server after successful download -q, --quiet Print only errors -s, --[no-]send-mail Send mail after the file for download is completed -x, --max-rate N Maximum download speed in kB/s --[no-]checksum Verify checksum of the downloaded data (enabled)
Rozdíl oproti snapshot download
je, že data stream je vypisován rovnou na
stdout a to v nekomprimované formě, abychom ho mohli propojit přimo se
zfs recv
:
$ vpsfreectl snapshot send <id> | zfs recv -F <dataset>
Inkrementální data stream lze vyžádat přepínačem -I, --from-snapshot
:
$ vpsfreectl snapshot send <id2> -- --from-snapshot <id1> | zfs recv -F <dataset>
Automatizované stahování záloh řeší příkazy backup vps
a
backup dataset
. Používají se stejně, akorát první má jako argument ID VPS
a druhý ID datasetu.
Tyto příkazy vyžadují nainstalované ZFS, vytvořený zpool a práva roota. Program lze spustit buď přímo pod rootem, nebo bude za běhu používat sudo.
Při spuštění se stáhnou snapshoty s aktuálním identifikátorem historie, které ještě lokálně neexistují, a to pokud možno inkrementálně. Aby fungoval inkrementální přenos, program musí najít snapshot, který je přitomen lokálně a zároveň je na serveru. Z toho vyplývá, že je potřeba zálohy stahovat minimálně jednou za 14 dní, protože poté bude náš nejnovější lokální snapshot smazán ze serveru a program nebude schopen pokračovat ve stahování záloh – nebude existovat žádný společný snapshot.
$ vpsfreectl backup vps --help backup vps [VPS_ID] FILESYSTEM Backup VPS locally Command options: -p, --pretend Print what would the program do -r, --[no-]rotate Delete old snapshots (enabled) -m, --min-snapshots N Keep at least N snapshots (30) -M, --max-snapshots N Keep at most N snapshots (45) -a, --max-age N Delete snapshots older then N days (30) -x, --max-rate N Maximum download speed in kB/s -q, --quiet Print only errors -s, --safe-download Download to a temp file (needs 2x disk space) --retry-attemps N Retry N times to recover from download error (10) -i, --init-snapshots N Download max N snapshots initially --[no-]checksum Verify checksum of the downloaded data (enabled) -d, --[no-]delete-after Delete the file from the server after successful download (enabled) --no-snapshots-as-error Consider no snapshots to download as an error --[no-]sudo Use sudo to run zfs if not run as root (enabled)
Pokud program nedostane ID VPS/datasetu jako argument, buď se na něj uživatele
zeptá, nebo se pokusí jej zjistit sám. Argument FILESYSTEM
musí být uveden
vždy. Měl by obsahovat jméno datasetu, do kterého chceme zálohy ukládat.
Než program spustíme na ostro, může se hodit přepínač --pretend
, který
nám vypíše, co by program udělal, tedy jaké snapshoty by stáhnul a případně
smazal.
Přepínačem --[no-]rotate
se (de)aktivuje mazání starých snapshotů, aby se
uvolnilo místo pro ty nové. Nezměníme-li další nastavení, budeme mít minimálně
30 snapshotů (což aktualně znamená 30 denní historii), maximálně 45 snapshotů
(pokud si nějaké vytvoříme manuálně) a budou se mazat snapshoty starší nez 30
dní.
Obsah datasetu FILESYSTEM
si program spravuje sám a uživatel by v něm
neměl vytvářet další subdatasety/snapshoty. Stažené snapshoty jsou umístěny v
subdatasetech, které jsou pojmenovány podle identifikátoru historie.
$ vpsfreectl backup vps storage/backup/199 (1) VPS #198 (2) VPS #199 (3) VPS #202 Pick a dataset to backup: 2 Will download 8 snapshots: @2016-03-07T18:12:58 @2016-03-07T18:13:21 @2016-03-07T18:18:35 @2016-03-10T10:18:03 @2016-03-10T10:18:30 @2016-03-10T11:49:00 @2016-03-10T14:28:00 @2016-03-10T14:33:12 Performing a full receive of @2016-03-07T18:12:58 to storage/backup/199/1 The download is being prepared... Time: 00:00:56 Downloading 0.3 GB: [====================================================================================] 100% 1755 kB/s Performing an incremental receive of @2016-03-07T18:12:58 - @2016-03-10T14:33:12 to storage/backup/199/1 The download is being prepared... Time: 00:00:00 Downloading 0.0 GB: [=======================================================================================] 100% 0 kB/s
Můžeme si všimnout, že program stáhne první snapshot v plné velikosti a všechny další pak inkrementálně.
Seznam snapshotů vypíšeme pomocí zfs list
:
$ sudo zfs list -r -t snapshot storage/backup/199 NAME USED AVAIL REFER MOUNTPOINT storage/backup/199/1@2016-03-07T18:12:58 8K - 284M - storage/backup/199/1@2016-03-07T18:13:21 8K - 284M - storage/backup/199/1@2016-03-07T18:18:35 8K - 284M - storage/backup/199/1@2016-03-10T10:18:03 8K - 285M - storage/backup/199/1@2016-03-10T10:18:30 8K - 285M - storage/backup/199/1@2016-03-10T11:49:00 160K - 285M - storage/backup/199/1@2016-03-10T14:28:00 160K - 285M - storage/backup/199/1@2016-03-10T14:33:12 0 - 285M -
K vlastním datům se lze dostat přes speciální adresář .zfs
:
$ ls -1 /storage/backup/199/1/.zfs/snapshot 2016-03-07T18:12:58 2016-03-07T18:13:21 2016-03-07T18:18:35 2016-03-10T10:18:03 2016-03-10T10:18:30 2016-03-10T11:49:00 2016-03-10T14:28:00 2016-03-10T14:33:12
K pravidelnému stahování záloh se dá použít cron. Zápis v crontabu může vypadat takto:
MAILTO=tvuj@mail # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 0 7 * * * root vpsfreectl backup vps 199 storage/backup/199 -- --max-rate 1000
Program se tedy spustí každý den v 7 ráno (kdy už by měly být zálohy ve
vpsFree přeneseny na backuper.prg) a budou se stahovat maximální rychlostí
1 MB/s. Výstup příkazu nám zašle cron na e-mail nastavený v proměnné
MAILTO
. Po ověření funkčnosti je však zbytečné, aby e-mail chodil každý den.
Proto má program přepínač --quiet
, který zajistí, že se vypíšou jen
případné chyby.
vpsfreectl
byl nainstalován
pod obyčejným uživatelem, musí se pro roota program
nainstalovat i se všemi závislostmi znovu.
Příkaz backup
ve výchozím stavu neumožnuje přerušit a pokračovat ve stahování,
protože nestahuje do žádného souboru, ale data hned předává ZFS. Jestliže máme
k dispozici jen pomalou nebo nespolehlivou linku, může se stát, že stahování
selže a bude nutné jej restartovat – od začátku. Můžeme si ale pomoct
přepínačem --safe-download
, který nejdříve stáhne data do souboru a až
pak je předá ZFS. Díky tomu je možné kdykoli stahování přerušit a později
v něm pokračovat. Nevýhodou je, že je k tomu potřeba 2x více místa na disku, protože
jsou data v jednu chvíli v dočasném souboru i v ZFS datasetu. Dočasný soubor je vytvořen
v adresáři, ze kterého je program spuštěn.
Na další problém můžeme narazit při dlouhé době stahování. Program při prvním
spuštění totiž stahuje všechny snapshoty, od nejstaršiho po nejnovější. Pokud
ale stahujeme ten nejstarší snapshot moc dlouho, může dojít k jeho smazání ze
serveru, což vede k tomu, že ho později nemůžeme použít k inkrementálnímu stahování a
musíme stahovat plnou zálohu znovu. Pro tyto případy existuje přepínač
--init-snapshots N
, který programu řekne, že chceme stáhnout jen N
posledních snapshotů. Nejbezpečnější je použít --init-snapshots 1
, pak
máme až 14 dní na dokončení stahování (poslední přerušení může nastat po 7
dnech). Není to ale všelék, protože pokud je program ukončen a znovu spuštěn v jiný
den, poslední snapshot bude jiný a stahování začne nanovo, není-li hodnota
--init-snapshots
patřičně upravena.
Někdy se může stát, že z nějakého důvodu denní záloha neproběhne a program tedy nebude
mít co stáhnout. Tato situace normálně není považována za chybu – jednoduše
jsou všechny snapshoty už staženy a program nemá co dělat. Probíhá-li však
stahování záloh automaticky za pomocí cronu, nijak se nedozvíme o tom, že se
žádné zálohy nestahují. Z tohoto důvodu má program přepínač
--no-snapshots-as-error
, který se postará o to, že pokud program nemá
co stáhnout, skončí s chybou. Chyby nejsou potlačeny přepínačem --quiet
,
takže nám ji cron pošle na e-mail a o výpadku se dozvíme.
Nechceme-li vpsfree-client
instalovat či spouštět pod rootem, program umí
běžet i pod neprivilegovaným uživatelem. K práci se ZFS pak využije sudo.
V následující ukázce budeme program instalovat a používat pod uživatelem
vpsfree
. Nejdříve jej vytvoříme a nainstalujeme vpsfree-client
:
# useradd -m -d /home/vpsfree -s /bin/bash vpsfree # su vpsfree $ gem install --user-install vpsfree-client
Následující řádky vložte do /etc/sudoers.d/zfs
:
Defaults:vpsfree !requiretty vpsfree ALL=(root) NOPASSWD: /sbin/zfs
Uživatel vpsfree
tedy bude moci spouštět zfs
jako root a to bez hesla,
což je nezbytné, pokud jej chceme pouštět cronem.
Nyní zkusíme program spustit manuálně a potom jej umístíme do crontabu. Zkusme si tedy vyžádat a uložit autentizační token:
# su vpsfree $ vpsfreectl --auth token --new-token --token-lifetime permanent --save user current
Dostanete-li chybu, že program neexistuje, bude potřeba specifikovat celou
cestu, nebo přidat správný adresář do $PATH
. Gemy se instalují do
~/.gem/ruby/<verze ruby>/
, na mém systému je cesta ke spouštěcím souborům konkrétně
/home/vpsfree/.gem/ruby/2.0.0/bin
.
Máme-li funkčního klienta, můžeme stáhnout první zálohu do datasetu, který si
vytvoříme. V této ukázce se bude zálohovat VPS #123 do datasetu
storage/backup/vps/123
.
# su vpsfree $ sudo zfs create -p storage/backup/vps/123 $ vpsfreectl backup vps 123 storage/backup/vps/123
Další zálohy budeme stahovat pravidelně cronem, do souboru
/etc/cron.d/vpsfree
vložte:
PATH=/bin:/usr/bin:/home/vpsfree/.gem/ruby/2.0.0/bin MAILTO=tvuj@mail HOME=/home/vpsfree 0 7 * * * vpsfree vpsfreectl backup vps storage/backup/vps/123 -- --quiet
V PATH
je uveden adresář obsahující vpsfreectl
. Všimněte si, že
programu už nemusíme předávat ID VPS, při prvním spuštění si jej totiž uloží.
Solaris/OpenIndiana a FreeBSD umožnuje delegovat práva pro ovládání datasetů různým uživatelům. Program v tomto případě vůbec nepotřebuje práva roota, ani sudo.
Potřebné práva budeme přidělovat uživateli vpsfree
:
# zfs create storage/backup/123 # zfs allow vpsfree create,mount,destroy,receive storage/backup/123
Aby mohl uživatel vytvářet subdatasety a připojit je, musí mít i práva na úrovni adresářů a souborů:
# chown vpsfree:vpsfree /storage/backup/123
# sysctl vfs.usermount=1
Teď můžeme začit stahovat zálohy. Přepínačem --no-sudo
zajistíme, aby se
program nesnažil použít sudo.
# su vpsfree $ vpsfreectl backup vps 123 storage/backup/123 -- --no-sudo
--[no-]delete-after
rozhoduje o tom, jestli se má stahovaný soubor po úspěšném stažení smazat ze serveru--[no-]send-mail
říká, jestli chceme stále dostat e-mail o tom, že je záloha připravena na serveru ke stažení--max-rate N
nastavuje maximální rychlost stahování v kB/s--quiet
potlačí všechen výstup, vypsány jsou pouze chyby--no-checksum
vypne počítání a kontrolu checksumu (sha256, což někdy může zdržovat)Obnova VPS ze stažené zálohy není nijak automatizována. Staženou zálohu lze do VPS nahrát pomocí nouzového režimu.
Po nastartovaní VPS v nouzovém režimu máme přístup k disku VPS „zvenčí“, podobně jako bychom nabootovali live CD. Obsah zálohy rozbalíme do adresáře, kde je disk VPS připojen. Po restartu VPS nastartuje z obnoveného systému. Pokud záloha obsahuje jinou distribuci, než která ve VPS byla, je potřeba upravit nastavení ve vpsAdminu.
V tomto návode si ukážeme ako získať súbory stránky z automatického zálohovacieho systému.