Fórum Root.cz

Hlavní témata => Server => Téma založeno: darebacik 31. 03. 2019, 18:40:43

Název: Pokročilejší automatizovaná záloha
Přispěvatel: darebacik 31. 03. 2019, 18:40:43
Po niekolkych rokoch som sa trocha zacal zaujmat aj o zalohovanie  ;D
Sice to co potrebujem, tak zalohovane mam, ale nepaci sa mi ako to zalohujem, chcel by som to trocha zautomatizovat.
Nedavno som riesil ako zalohovat jednoducho mariadb a obsah webov, tak som pouzil tento skript
Kód: [Vybrat]
#!/bin/bash
mysqldump nazov_db > ~/nazov_db-$(date +%Y-%m-%d-%H.%M.%S).sql
tar -cvzf ~/backup_nazov_webu-$(date +%Y-%m-%d-%H.%M.%S).tar.gz  /var/www/www.nazov_webu.info
Funguje to celkom OK, ale po nejakej zmene na webe, alebo v DB, tie backupy vymazem a spravim nove zalohy.
Urcite su na to nejake ficurky ako robit aj inkrementalne zalohy, ale chcem sa predsa skusenejsich opytat.
Predstavoval by som si to takto:

Je to takto dobre ? Ako to mate poriesene vy ?
Ja nie som firma, mam len maly domaci server, preto to chcem zalohovat mimo moje disky, niekde von.
Teoreticky by to stacilo zalohovat niekde na kluc v desktope, alebo to by som musel kazdy den robit rucne (vlozit kluc, spustit skript atd ...).

Alebo este ma napadla myslinka, pychnut kluc do servera, namountovat ho tam a nechat zalohy robit tam.
Název: Re:pokrocilejsi automatizovana zaloha
Přispěvatel: LA_user 31. 03. 2019, 22:02:42
Jelikož všude používám ZFS, bylo otázkou chvíle napsání scriptu, co udelá zfs send a zfs recv dle mých potřeb:

Kód: [Vybrat]
#!/bin/bash
(
     flock -n 200 || { echo 'locked via flock on file /var/lock/zfs-backup-mm' ; exit 1; }

zfsnap_block () {

IFS='
'
if [ $zfsnap_enable = "y" ]; then
for dataset in $source_datasets;
do
echo "Tuning zfSnap for "$dataset""
for command in $(zfSnap -n -d -zpool28fix -a "$zfsnap_days_keep_snaps"d "$dataset" | grep "$dataset")
do
echo "Doing "$command""
eval "$command";
done
done
backup_block
else
echo "zfsnap_enable is not set to Y, skipping creating snapshots"
backup_block
fi
}

backup_block () {

source_zfs_snapshots=$(zfs list -t snapshot)
backups_server_zfs_snapshots=$(ssh -$backup_server_ipv -p $backup_server_port $backup_server zfs list -t snapshot)

for dataset in $source_datasets;
do

source_snap=$(echo "$source_zfs_snapshots" | grep "$dataset"@ | grep -E "....-..-.._........--"$zfsnap_days_keep_snaps"d" | tail -n1 | cut -d"@" -f2 | cut -d" " -f1)
dataset_clean=$(echo $dataset | grep -o '[^/]*$')
backup_snap=$(echo "$backups_server_zfs_snapshots" | grep "$backup_server_dataset"/"$dataset_clean"@ | grep -E "....-..-.._........--"$zfsnap_days_keep_snaps"d" | tail -n1 | cut -d"@" -f2 | cut -d" " -f1)

if [ -z "$backup_snap" ]
then
echo "Snapshot on backup server not found, sending "$dataset"@"$source_snap" to server "$backup_server" "$backup_server_dataset"/"$dataset_clean""
zfs send -c "$dataset"@"$source_snap" | pv | ssh -$backup_server_ipv "$backup_server" -p "$backup_server_port" zfs recv "$backup_server_dataset"/"$dataset_clean" && echo "Send OK"
else
echo "Snapshot on backup server found, sending incremental from "$dataset"@"$backup_snap" to "$dataset"@"$source_snap" to server "$backup_server" "$backup_server_dataset"/"$dataset_clean""
zfs send -ci "$dataset"@"$backup_snap" "$dataset"@"$source_snap" | pv | ssh -$backup_server_ipv "$backup_server" -p "$backup_server_port" zfs recv "$backup_server_dataset"/"$dataset_clean" -F && echo "Send OK"
fi
done
del_snaps_block
}

del_snaps_block () {
if [ $backup_server_delete_old_snaps = "y" ]; then
for dataset in $source_datasets;
do
dataset_clean=$(echo $dataset | grep -o '[^/]*$')
snaps_to_delete=$(echo "$backups_server_zfs_snapshots" | grep "$backup_server_dataset"/"$dataset_clean"@ | grep -E "....-..-.._........--"$zfsnap_days_keep_snaps"d" | head -n -"$backup_server_number_keep_snaps" | cut -d" " -f1)

for snap in $snaps_to_delete
do
echo "Deleting snapshot "$snap" on "$backup_server""
ssh -$backup_server_ipv "$backup_server" -p "$backup_server_port" zfs destroy "$snap"
done

done
else
echo "backup_server_delete_old_snaps is not set to Y, skipping deleting snapshots"
fi
exit 0
}

if [[ $# -eq 0 ]] ; then
echo 'Config file is not set'
exit 1
fi
source $1
zfsnap_block
) 200>/var/lock/zfs-backup-mm

Jako parametr je potřeba přidat konfigurační soubor v této podobě:
Kód: [Vybrat]
#Backup server settings

backup_server="192.168.0.10"
backup_server_port="22"
backup_server_ipv=4
backup_server_dataset="tank/backups"
backup_server_delete_old_snaps=y
backup_server_number_keep_snaps=31

#Source server settings
#DO NOT CHANGE zfsnap_days_keep_snaps AFTER FIRST FULL BACKUP!

zfsnap_enable=y
zfsnap_days_keep_snaps=7

source_datasets="
tank/dataset1
tank/dataset2
"
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: Homeatcloud 01. 04. 2019, 10:47:59
Nevim, jak dulezite veci mate na domacim serveru, ale za predpokladu, ze jsou to veci, ktere musi bezet nepretrzite, tak bych doporucil misto zalohovani reseni pro Disaster Recovery, ktere umozni server kdykoli (v radu desitek minut) spustit v cloudu a prevest na nej provoz.
Principielne je to podobne jako ZFS send/recv v tom, ze to posila jen zmeny, ale je to podstatne univerzalnejsi, protoze to pracuje na blokove urovni (precijen na ZFS mnoho provideru nejede). Na cilove strane se udrzuje aktualni obraz VM, ktery lze kdykoli spustit.
Mame pripravenou sirokou skalu softwarovych provideru, ze kterych se vybere reseni pro VMware, OpenStack, fyzicke stroje, Linux i Windows.
Z open-source to podle popisu umi asi jenom UrBackup pro Windows, ale nezkousel jsem ho.
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: darebacik 01. 04. 2019, 11:49:54
Jelikož všude používám ZFS, bylo otázkou chvíle napsání scriptu, co udelá zfs send a zfs recv dle mých potřeb:
  • Automatické vytváření snapshotů a jejich odmazávání na zdroji/cíli
  • Rozpoznání jestli je na cíli přítomný backup pro rozdílové zálohy, pokud ne, pošle se full backup
  • Možnost spustit podle cronu jednou za minutu(uzamykání flockem), nebo jednou za den, jak je libo

Kód: [Vybrat]
#!/bin/bash
(
     flock -n 200 || { echo 'locked via flock on file /var/lock/zfs-backup-mm' ; exit 1; }

zfsnap_block () {

IFS='
'
if [ $zfsnap_enable = "y" ]; then
for dataset in $source_datasets;
do
echo "Tuning zfSnap for "$dataset""
for command in $(zfSnap -n -d -zpool28fix -a "$zfsnap_days_keep_snaps"d "$dataset" | grep "$dataset")
do
echo "Doing "$command""
eval "$command";
done
done
backup_block
else
echo "zfsnap_enable is not set to Y, skipping creating snapshots"
backup_block
fi
}

backup_block () {

source_zfs_snapshots=$(zfs list -t snapshot)
backups_server_zfs_snapshots=$(ssh -$backup_server_ipv -p $backup_server_port $backup_server zfs list -t snapshot)

for dataset in $source_datasets;
do

source_snap=$(echo "$source_zfs_snapshots" | grep "$dataset"@ | grep -E "....-..-.._........--"$zfsnap_days_keep_snaps"d" | tail -n1 | cut -d"@" -f2 | cut -d" " -f1)
dataset_clean=$(echo $dataset | grep -o '[^/]*$')
backup_snap=$(echo "$backups_server_zfs_snapshots" | grep "$backup_server_dataset"/"$dataset_clean"@ | grep -E "....-..-.._........--"$zfsnap_days_keep_snaps"d" | tail -n1 | cut -d"@" -f2 | cut -d" " -f1)

if [ -z "$backup_snap" ]
then
echo "Snapshot on backup server not found, sending "$dataset"@"$source_snap" to server "$backup_server" "$backup_server_dataset"/"$dataset_clean""
zfs send -c "$dataset"@"$source_snap" | pv | ssh -$backup_server_ipv "$backup_server" -p "$backup_server_port" zfs recv "$backup_server_dataset"/"$dataset_clean" && echo "Send OK"
else
echo "Snapshot on backup server found, sending incremental from "$dataset"@"$backup_snap" to "$dataset"@"$source_snap" to server "$backup_server" "$backup_server_dataset"/"$dataset_clean""
zfs send -ci "$dataset"@"$backup_snap" "$dataset"@"$source_snap" | pv | ssh -$backup_server_ipv "$backup_server" -p "$backup_server_port" zfs recv "$backup_server_dataset"/"$dataset_clean" -F && echo "Send OK"
fi
done
del_snaps_block
}

del_snaps_block () {
if [ $backup_server_delete_old_snaps = "y" ]; then
for dataset in $source_datasets;
do
dataset_clean=$(echo $dataset | grep -o '[^/]*$')
snaps_to_delete=$(echo "$backups_server_zfs_snapshots" | grep "$backup_server_dataset"/"$dataset_clean"@ | grep -E "....-..-.._........--"$zfsnap_days_keep_snaps"d" | head -n -"$backup_server_number_keep_snaps" | cut -d" " -f1)

for snap in $snaps_to_delete
do
echo "Deleting snapshot "$snap" on "$backup_server""
ssh -$backup_server_ipv "$backup_server" -p "$backup_server_port" zfs destroy "$snap"
done

done
else
echo "backup_server_delete_old_snaps is not set to Y, skipping deleting snapshots"
fi
exit 0
}

if [[ $# -eq 0 ]] ; then
echo 'Config file is not set'
exit 1
fi
source $1
zfsnap_block
) 200>/var/lock/zfs-backup-mm

Jako parametr je potřeba přidat konfigurační soubor v této podobě:
Kód: [Vybrat]
#Backup server settings

backup_server="192.168.0.10"
backup_server_port="22"
backup_server_ipv=4
backup_server_dataset="tank/backups"
backup_server_delete_old_snaps=y
backup_server_number_keep_snaps=31

#Source server settings
#DO NOT CHANGE zfsnap_days_keep_snaps AFTER FIRST FULL BACKUP!

zfsnap_enable=y
zfsnap_days_keep_snaps=7

source_datasets="
tank/dataset1
tank/dataset2
"
Vyzera to pre mna dost zlozito  :)

Nevim, jak dulezite veci mate na domacim serveru, ale za predpokladu, ze jsou to veci, ktere musi bezet nepretrzite, tak bych doporucil misto zalohovani reseni pro Disaster Recovery, ktere umozni server kdykoli (v radu desitek minut) spustit v cloudu a prevest na nej provoz.
Principielne je to podobne jako ZFS send/recv v tom, ze to posila jen zmeny, ale je to podstatne univerzalnejsi, protoze to pracuje na blokove urovni (precijen na ZFS mnoho provideru nejede). Na cilove strane se udrzuje aktualni obraz VM, ktery lze kdykoli spustit.
Mame pripravenou sirokou skalu softwarovych provideru, ze kterych se vybere reseni pro VMware, OpenStack, fyzicke stroje, Linux i Windows.
Z open-source to podle popisu umi asi jenom UrBackup pro Windows, ale nezkousel jsem ho.
Nemam tam nic dolezite. Weby + nejake dalsie veci, ktore chcem zalohovat bezia v LXC (prip. niektore veci v KVM) vsetko na proxmoxe. Vytvaram si backups celych kontajnerov a KVM (asi raz za 2-4 tyzdne), cize su tam zalohovane aj tie weby.
Nemam ZFS, ale ext4. Ako som uviedol vyssie, momentalne nepotrebujem ziadne HA, nie som ziadna firma (som domaci kutil, ktory sa hraje s linuxom) a chem nejak zalohovanie zautomatizovat a presvedcit sa ako to vsetko funguje.
Som zamestnany clovek, takze toho casu mam menej a ked sa nejaky najde, tak sa venujem takymto srandickam (nemam nad sebou ziadneho sefa, cize nikde ma nikto netlaci).

Cize nepotrebujem nejake specialne enterprise riesenia, len sa snazim najst nejaky skript (kedze sam si to asi nedokazem napisat) a dat to nejak dokopy.
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: ZAJDAN 01. 04. 2019, 12:02:34
já zálohování dělám na úrovni LVM (ext3, ext4, xfs)
je to velice podobné jako již zde zmíněné ZFS
snapshotnu si LVMko a rsyncnu ho kam potrebuji
poté snapshot smažu/zničím
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: Jose D 01. 04. 2019, 12:18:11
zalohovanie

koukni se na duplicity, http://duplicity.nongnu.org. Umí to, myslím, všechno co chceš.
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: to_je_jedno 01. 04. 2019, 12:41:18
pouzivam automysqlbackup. to pak zalohuju pres rsync do NASu.
stejne tak var/www/ posilam rsyncem do NASu (zde NEmam --delete protoze nikdy nepotrebuju obnovit cely web)

Jo a cely ten "virtual" denne snapshotuje vpsfree.cz a zachova 14 snapshotu :-)
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: k3dAR 01. 04. 2019, 12:44:13
[...] tar -cvzf ~/backup_nazov_webu-$(date +%Y-%m-%d-%H.%M.%S).tar.gz  /var/www/www.nazov_webu.info [...]
  • Dalsie zalohy by boli inkrementalne (cize ak sa v ten den nic na webe nezmeni, tak nic sa nebude zalohovat).
  • Na to by bol asi vhodny rdiff-backup (resp. rsync).
[...]
rdiff-backup je urcite vhodnej na inkrementalne zalohy, jen si nejsem jistej zda v pripade tar.gz bude dostatecne ucinej, protoze v tar.gz znovuzabelenem se pocitam bude lisit vice nez jen zmeny obsahu...

jinak k rdiff-backup doporucuju rdiff-backup-fs, umozni ti pripojit zalohy tak ze mas snadno prisutpne i ty rozdilove jako adresare s kterejch lze primo otevirat/kopirovat... bud muzes vzit z repa distra, nebo tady: https://github.com/k3dar/rdiff-backup-fs
pridaval sem tam nejake patche z *buntu + sem menil aby vychozi cas zobrazenejch zaloh byl LocalTime a ne GPT:
https://github.com/k3dar/rdiff-backup-fs/commits/master
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: Homeatcloud 02. 04. 2019, 15:25:52
Kdysi jsem pouzival bzip2 prave proto, ze se archiv nezmeni, kdyz se nezmeni vstupni data. Od te doby pridali do gzipu argument --rsyncable :-).
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: Miroslav Šilhavý 02. 04. 2019, 17:02:36
Velmi příjemně se pracuje s: https://borgbackup.readthedocs.io/en/stable/, ale vyžaduje to nainstalovanou podporu i na straně serveru (tj. nehodí se to pro neznámá úložiště bez další podpory).

Dříve jsem uvažoval i o: https://restic.net/.

Jejich srovnání: https://stickleback.dk/borg-or-restic/.
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: opiio 02. 04. 2019, 17:59:26
Resil jsem neco podobneho - zaloha weboveho serveru.

Soubory se zalohuji rozdilove rsyncem, udrzuju dva adresare
/full - aktualni stav na serveru
/diff - rozdilove zalohy mesic zpet, nazev podadresaru je 1-31

1/ spusti se rsync (--dry-run --itemize-changes) ktery porovna adresar /full se serverem a vytvori seznam zmen (upravene/odstranene soubory) od posledni zalohy
2/ odstrani se adresar /diff/[denvmesici] s mesic starou zalohou
3/ podle sezamu zmen se presunou soubory do /diff/[denvmesici]
4/ spusti se rsync s --delete do adresare /full pro vytvoreni kopie

Takto mam vzdy max 24h stary stav souboru na serveru + zmeny mesic zpet. Kdyby doslo k vetsi ztrate souboru na serveru (nechtene smazani, filesystem chyba apod.) soubory se jen presunou do adresare /diff. Toho jsem se u rsync --delete bal nejvic.
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: k3dAR 02. 04. 2019, 18:06:08
[...] Soubory se zalohuji rozdilove rsyncem, udrzuju dva adresare [...]
neslysel si o rdiff-backup (https://forum.root.cz/index.php?topic=20985.msg308849#msg308849) ? ;-)
posledni zaloha je celistva, predchozi zalohy to dela mezi sebou interne diff, posledni je dostupna primo, predchozi lze primo pomoci rdiff-backup
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: Ondřej Kolín 04. 04. 2019, 15:50:16
Ahoj, pouzivame klient server reseni, `Bacula` je to zdarma, opensource a super vcetne weboveho klikatka v novejsi verzi. Vyhodou je, ze nebastlis reseni na koleni, spolehlivy system zaloh, ktery je siroce konfigurovatelny, nevyhodou je trochu delsi nastaveni a nez tomu clovek zacne naplno rozumet a orientovat se.
Název: Re:Pokročilejší automatizovaná záloha
Přispěvatel: Miroslav Šilhavý 04. 04. 2019, 15:54:00
Ahoj, pouzivame klient server reseni, `Bacula` je to zdarma, opensource a super vcetne weboveho klikatka v novejsi verzi. Vyhodou je, ze nebastlis reseni na koleni, spolehlivy system zaloh, ktery je siroce konfigurovatelny, nevyhodou je trochu delsi nastaveni a nez tomu clovek zacne naplno rozumet a orientovat se.

Pokud zmiňujete Baculu, tak pak bych asi doporučil na jejího pokračovatele, Bareos (www.bareos.org).

Bohužel, jak Bacula, tak Bareos trpí spoustou neduhů a jedná se o zastaralý systém. Zejména chybí možnost deduplikace. Systém záloh na "volumes" odpovídá zálohování na pásky. Ten, kdo používá pásky a changer, to ocení; ti, kdo zálohují na disk, pro ně je to jen komplikace.