Zálohování XEN strojů pomocí LVM
- Úvod
- Řešení přes LVM
- Výstup ze scriptu
- Jak to funguje
- Co když script zklame
- Naplánování pravidelné zálohy
- Zdroje informací
Úvodem
Někdy je vhodné mít i plnou zálohu XEN stroje/ů (domU) - respektive jejich disků. Konfigurace samotné mašiny je uložena většinou v etc a není problém ji zálohovat, či případně i znovu vytvořit.Zálohování disků mašiny naráží hned na několik problémů (jistě najdete další):
- Konzistence zálohy
- Výpadek zálohovanách strojů
- Velikost zálohy
- Zklamání procesu zálohy (záloha probíhá "dlouhý" čas)
Pro splnění bodu číslo 1 by bylo třeba:
- Vypnout všechny stroje
- Pozálohovat
- Zapnout všechny stroje
- Vypnout všechny stroje
- Vytvořit LVM snapshot
- Zapnout všechny stroje
- Pozálohovat
- Odebrat LVM snapshot
Zklamání procesu zálohy je obecná nepříjemná vlastnost, která nesmí nastat ale nastane nejdříve zítra, proto je nejsnažší zabudovat kontrolní mechanismus (kontrolovat návratové kódy příkazů) s notifikací (odeslat e-mail) PLUS uchovat předchozí zálohu dokud stávající není plně hotova.
Řešení přes LVM
Scriptík je vhodné si projít a případně jednotlivé akce si předem odzkoušet.Script zde uvedený provádí zálohu, rozumným kompromisem s trochu optimistyckým přístupem.
Konzistence zálohy není sice 100% [čti sto-procentní, sto-procent se u nás píše 100 % .. :)], ale pokud se provede v čase kdy stroje podřimují dá se očekávat dostatečnou kvalitu.
Obnovit stroj po takovéto záloze, je jako spustit PC po výpadku elektřiny (bez záložního zdroje), ale s tím, že těsně před tím dostal systém echo a mohl vysypat případné souborové buffery.
Po obnově je určitě třeba udělat kontrolu databází a v případě problémů tabulky opravit. A pro jistotu zkontrolovat fs.
Tuto zálohu je vhodné kombinovat se zálohami konkrétních dat uvnitř strojů (mysqldump, svnadmin dump apod.). Takto vytvořená záloha například 1x týdně a jednodenní zálohy kritických dat (mysql, svn, www, /home), ale také složky /etc a složky cron-a /var/spool/cron umožní uvést po případném crachu vše do max. 1 den starého stavu a to relativně rychle (nepočítaje odstranění závady a přenos dat, tak rozhodně do 1 hodky).
Ukázka jak lze kupříkladu zálohovat obsah stroje je k dispozici zde – bez dalšího komentáře.
- ADMIN udává kam se má poslat chybové hlášení
- FROM je pole from v odeslaném emailu
- HOMEBCKP - kam zálohovat
- BACKUPNAME - jméno zálohy
- BCKPDATETIME - jméno souboru do kterého se uloží čas zálohy po úspěšném zakončení zálohy
- PAUSE_VIRTUALS - pole stojů, u kterých chceme požádat o uložení všeho a pozastavení. Doporučuji od nejmíň využívaného k nejvíce zatíženému.
- LVM_GRP="/dev/main" - základ cesty k LVM svazku kde jsou uloženy disky XEN strojů
- LVM_VIRTUALS - celá cesta ke svazku kde jsou uloženy disky XEN strojů např. LVM_VIRTUALS="${LVM_GRP}/jmenoSvazku"
- LVM_BCKPNAME - jméno LVM snapshot svazku
- LVM_SNAPSHOT - celá cesta ke LVM snapshot svazku např. "LVM_SNAPSHOT=${LVM_GRP}/${LVM_BCKPNAME}"
- LV_SIZE - velikost LVM snapshot svazku dostatečná na to aby bylo možné zapsat veškeré změny po dobu zálohování (radši přidat na bezpečnou velikost).
- MNT_DIR - plná cesta do existujícího prázdného adresáře kam je možné LVM snapshot svazek připojit
- INUSE_DIR - libovolný adresář do kterého se skript přepne aby "nevisel" na snapshotu a bylo jej možné odmontovat
- MOUNT_CMD - příkaz mount
- UMOUNT_CMD - příkaz umount
- XM_CMD - příkaz xm
- XM_PAUSE - prodleva mezi poslání žádosti "sync" stroji a jeho pozastavením - žádná hodnota není správná :(
- LVCREATE_CMD - příkaz lvcreate
- LVREMOVE_CMD - příkaz lvremove
- SYNC_CMD - příkaz sync - tento příkaz není kontrolován na návratovou hodnotu !
- TAR_CMD - příkaz tar
Info:
Script je nasazen a funguje (a zdá se, že správně) - před zveřejněním jsem jej zbavil konrétních údajů, takže doufám, že jsem nevnesl chybu.Běží v prostředí kde
- Disky jsou dva (identické) na SATA II
- Na discích jsou dvě partition boot a zbytek
- Partition jsou Linux raid1 (zrcadlení)
- A nad raid-ovou partition 'zbytek' je poostaveno LVMko
- XEN stroje mají vlastní LVM svazek
- XEN stroje běží nyní(29.5.2009) 3ks + Domain-0, téměř nezatížené a jedná se o servery
- každý stoj má za úkol něco jiného (jeden je jen testovací a tam se dějí věci :) )
- z každého stroje včetně Domain-0 ho doplňuje nějaký klon zálohovacího výše uvedeného scriptu
- záloha je 1× za časový interval (týden ?) přenesena na offline disk (fyzicky je připojen jen pro zálohu a zase odpojen, odnesen, zabalen, založen…)
- POZOR: mám velmi špatnou zkušenost s připojením disku přes USB v momentě, kdy existuje nějaký LVM snapshot (může se stát, že to přestane vidět disk apod.).
Neznám přesnou příčinu ani nemám žádnou analýzu, mám jen řešení :) "NEPŘIPOJOVAT usb disk v takovém případě".
Naplánování pravidelné zálohy
Script je možné spuštět cronem například takto:30 4 * * 0 /imegabin/backup_virtuals >> /var/log/backup_virtuals.log 2>> /var/log/backup_virtuals.logSpuštění v 4:30 v neděli a výpisem chyb i hlášení do /var/log/backup_virtuals.log
Jedná se o docela komplexní "dlouhý" proces, proto je vhodné výstupní informace logovat.
Při neúspěchu je vhodné se co nejdříve zajímat o to co se stalo a zkontrolovat stav!
Výstup ze scriptu
Výpis vypadá následovně:2009-05-24 23:33:01 move old backup to *.old - start 2009-05-24 23:33:01 move old backup to *.old - done 2009-05-24 23:33:01 Pause machines - start 2009-05-24 23:33:05 Pause machines - done 2009-05-24 23:33:05 Create lvm lvmbackup - start Logical volume "lvmbackup" created 2009-05-24 23:33:07 Create lvm lvmbackup - done 2009-05-24 23:33:07 UnPause machines - start 2009-05-24 23:33:10 UnPause machines - done 2009-05-24 23:33:10 Mount and cd to /mnt/lvmbackup - start 2009-05-24 23:33:11 Mount and cd to /mnt/lvmbackup - done 2009-05-24 23:33:11 Backup to tar.gz - start 2009-05-25 00:18:23 Backup to tar.gz - done 2009-05-25 00:18:23 Umount - start 2009-05-25 00:18:27 Umount - done Lvremove - start Logical volume "lvmbackup" successfully removed 2009-05-25 00:18:29 Lvremove - done 2009-05-25 00:18:29 Backup done ---------------------------------------------Při neúspěchu je vhodné se co nejdříve zajímat o to co se stalo a zkontrolovat stav!
Jak to funguje, když to funguje
Script provádí tyto operace:- Přesune aktuální zalohu na zálohu.old .. BACKUPNAME.tar.gz.old
- Přesune aktuální soubor s datumem zálohy na soubor s datumem zálohy.old .. BCKPDATETIME.old
- Pro každý stroj z pole PAUSE_VIRTUALS v cyklu
- Pošle signál "vysyp co máš na disk - fčul"
- Počká XM_PAUSE sekund. Nelze urřčit jak dlouho bude trvat předchozí "žádost" - jedná se o optimistický přístup, čas zas nesmí být zbytečně dlouhý
- Pozastaví stroj příkazem 'xm pause'
- Provede sync a vyprázdní souborové buffery, opomíjené ale důležité. Nebo se pletu a následný příkaz to má již v sobě?…
- Vytvoří LVM snapshot svazek
- Každý stroj z pole PAUSE_VIRTUALS opět spustí příkazem 'xm unpause'
- Namontuje svazek LVM_SNAPSHOT do adresáře MNT_DIR
- Vstoupí do MNT_DIR (zde možná schází možnost definice podadresáře, script předpokládá, že pro XEN stroje je zvlášť LVM svazek)
- Provede příkaz:
tar -czf "$HOMEBCKP/$BACKUPNAME.tar.gz" --exclude='*.iso' .
Což je tar.gz všeho v MNT_DIR, ale bez souborů '*.iso'. Záleží na tom jestli je třeba zálohovat tyto soubory (obrazy) ale také kde jsou umístněny. - Provede 'cd' do INUSE_DIR a tím uvolní používání MNT_DIR
- Provede sync - asi není nutné :)
- Odmontuje MNT_DIR (LVM_SNAPSHOT)
- Odstraní LVM snapshot
- Zapíše do BCKPDATETIME datum zálohy
- Zapíše do logu 'backup-virtuals: OK'
Co když script zklame
Co se stane
- Pokusí se o uvedení do stavu před zálohou
- Zapíše se do logu 'backup-virtuals: Failure. Message: xxxxx'
- Pošle se email s případným komentářem jestli je třeba zničit snapshot
Co je třeba udělat co nejdříve
- Prohlédnou výstup scriptu (stdout, stderr) viz spouštění cronem
- Ověřit existenci snapshot svazku pomocí 'lvdisplay' nebo případně 'lvdisplay /dev/main/lvmbackup' - dle nastavení
Existuje-li:- Je-li namontován svazek (/dev/main/lvmbackup), odmontovat např. 'umount /mnt/lvmbackup' - dle nastavení
- Zničiti lvm snapshot svazek (opatrně, ničit jen to co je třeba) například 'lvremove -f /dev/main/lvmbackup' - dle nastavní
- Zjisti jak příště – lépe :)
Zdroje informací:
- man crontab
- man logger
- man lvm
- man lvcreate
- man lvremove
- man lvdisplay
- LVM-HOWTO
- RAID and LVM
- Wikipedia Cron
- Bash manual
- Wikipedia vi editor - česky :)