Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Backup live con gli snapshot LVM su Linux

Utilizzare la tecnologia LVM e gli snapshot da essa supportati per eseguire backup dei dati su Linux, senza dover interrompere alcun servizio in esecuzione.
Utilizzare la tecnologia LVM e gli snapshot da essa supportati per eseguire backup dei dati su Linux, senza dover interrompere alcun servizio in esecuzione.
Link copiato negli appunti

LVM (Logical Volume Manager) è un software, tipicamente incorporato sui sistemi operativi GNU/Linux, che offre un livello di astrazione delle unità di storage molto potente. Attraverso LVM è possibile, ad esempio, definire un volume logico grande quanto la somma di 2 o più volumi fisici. Inoltre, i volumi logici possono essere espansi o ridotti all’occorrenza anche con l’aggiunta di ulteriori volumi fisici. Tra le tante funzionalità possibili grazie a questo livello di astrazione ci sono gli snapshot.

Uno snapshot è un volume logico che rappresenta l’istantanea di un certo disco al momento della sua creazione. Quindi può essere usato come punto di partenza per creare un backup senza fermare nessun servizio: ciò è molto utile per effettuare backup di database, server di file come FTP, revision control system come SVN, eccetera.

In questo articolo vedremo come utilizzare la tecnologia LVM e gli snapshot proprio per creare un backup "live", cioè senza dover fermare alcun servizio o applicativo in esecuzione.

Virtualmente uno snapshot è grande quanto il disco di cui si è "catturata" l’istantanea. In realtà, esso contiene tutte le modifiche che sono avvenute dal momento della creazione dell’istantanea, quindi può avere dimensioni molto ridotte.

Prima di passare agli snapshot vediamo come creare un volume logico con LVM. Questo passo è necessario per potere usare gli snapshot.

Creazione di unità logiche

Per prima cosa, supponiamo di aggiungere due nuovi dischi, uno da 500GB e uno da 200GB, alla nostra macchina, su cui andranno i file del nostro database o servizio.

Supponiamo che i nuovi dischi abbiano una partizione ciascuno, entrambe grandi quanto tutto il disco, e che esse siano state mappate rispettivamente su /dev/sdb1 e /dev/sdc1. Si noti che, per sapere quali sono i dischi presenti nel sistema, possiamo usare il comando lvm lvmdiskscan.

Per prima cosa dobbiamo censire in LVM le partizioni; nel gergo di LVM, dobbiamo creare un physical volume (PV) su ogni partizione:

# lvm pvcreate /dev/sdb1

Se l’operazione va a buon fine, la risposta (con LVM 2.02) sarà:

Physical volume "/dev/sdb1" successfully created

Dopo aver censito tutte le partizioni, possiamo chiedere a LVM la lista dei volumi fisici:

# lvm pvscan

La risposta sarà una tabella in cui, oltre alla dimensione, per ogni volume fisco verrà indicato, se presente, il volume group (VG) di appartenenza. Il concetto di volume group permette quel livello di astrazione a cui abbiamo accennato all’inizio: esso è il punto di giuntura tra volumi fisici e volumi logici (i volumi che monteremo sulle cartelle del nostro disco fisso).

Quindi adesso creiamo un volume group chiamato datafiles con i nostri dischi, usando il comando:

# lvm vgcreate datafiles /dev/sdb1 /dev/sdc1

Supponiamo di aver bisogno per ora di un volume di circa 600GB per i nostri file. Dobbiamo creare un logical volume (LV). Un volume logico è un volume che possiamo utilizzare come se fosse una normale partizione. In realtà, un volume logico potrebbe essere composto di più dischi oppure essere una parte di un disco molto più grande: LVM si occupa di gestire questi dettagli.

Creiamo dunque il nostro volume logico, chiamato datavolume, di 600 GB:

# lvm lvcreate --size 600GB --name datavolume datafiles

A questo punto possiamo formattare il nostro volume (ad esempio con ext4) e montarlo in una directory:

# mkfs.ext4 /dev/datafiles/datavolume
# mkdir /mnt/databases
# mount /dev/datafiles/datavolume /mnt/databases

Possiamo notare come indirizziamo il volume logico: /dev/<VG>/<LV>.

Backup tramite snapshot

Uno snapshot è un particolare tipo di volume logico che permette di accedere allo stato di un altro volume nel momento in cui è stato creato. Per fare ciò, come dicevamo, lo snapshot in realtà internamente memorizza le modifiche avvenute da quel momento in poi al volume originale. Questo significa che la dimensione dello snapshot non dipende tanto dalla dimensione del volume originale, bensì dalla velocità con qui questo varia.

Ad esempio, creiamo uno snapshot di datavolume, della dimensione di 2GB:

# lvm lvcreate --size 2GB --snapshot  --name snap1 /dev/datafiles/datavolume

Questo snapshot, di nome snap1, sarà valido finché faremo meno di 2GB di modifiche al volume logico datavolume. In questo lasso di tempo, possiamo effettuare il backup su file o su nastro del nostro snapshot, ad esempio:

# dd if=/dev/datafiles/snap1 | gzip > backup.gz

È importante notare che la dimensione del backup sarà di dimensioni uguali al database originale, quindi 600GB, e non 2GB.

Una volta fatto il backup, possiamo eliminare lo snapshot con il comando:

# lvm lvremove /dev/datafiles/snap1

Per effetuare il ripristino del backup, è sufficiente creare un disco logico (che qui chiamiamo restore1) grande quanto tutto il volume iniziale (nel nostro caso di 600GB) e copiarvi dentro i dati per poi montarlo in una directory apposita:

# lvm lvcreate --size 600GB --name restore1 datafiles
# gzip -d -c backup.gz | dd of=/dev/datafiles/restore1
# mkdir /mnt/restore1
# mount /dev/datafiles/restore1 /mnt/restore1

Pianificazione dei backup

Possiamo automatizzare il tutto in uno script e schedularlo, ad esempio per essere eseguito una volta a settimana. Creiamo quindi uno script in /root/bin/backup-databases.sh con il contenuto seguente:

#!/bin/bash
lvm lvcreate --size 200MB --snapshot  --name snap1 /dev/datafiles/datavolume
dd if=/dev/datafiles/snap1 | gzip > "/root/backup-$(date +%F).gz"
lvm lvremove /dev/datafiles/snap1 -f

Il flag -f è necessario per evitare che il comando richieda la conferma. Tramite il comando date abbiamo aggiunto al nome del file di backup anche la data dell’esecuzione.

Dopo aver reso il file eseguibile con chmod +x, possiamo programmarne l'esecuzione con cron. Lanciamo crontab -e e, una volta apparso l’editor, inseriamo:

0 2 * * Sun /root/bin/backup-databases.sh

Così facendo, lo script sopra definito sarà eseguito ogni domenica alle 2 di notte.

Ti consigliamo anche