Snapshots
En la nostra infraestructura, la seguretat de les dades és un aspecte fonamental. Per això, és crucial disposar de mecanismes que ens permetin recuperar la informació en cas de pèrdua o corrupció. Un d’aquests mecanismes són les instantànies (snapshots), que ens permeten fer còpies de seguretat dels nostres volums lògics en un moment determinat sense interrompre el servei. Aquesta funcionalitat és possible gràcies a la tècnica de COW (copy-on-write) de LVM, que clona les dades originals abans de ser modificades.
Un cas d'ús comú, per exemple, en el nostre servei web, seria per realitzar una còpia de seguretat de la carpeta de dades abans de realitzar un canvi important. Una opció seria comprimir tots els fitxers de /opt/web/data
en un arxiu tar i desar-lo en un directori de backup. No obstant això, com la web està en funcionament, els fitxers poden canviar durant el procés de compressió, cosa que podria provocar un error de 'file was changed as we read it'. Per evitar aquest problema, podem utilitzar snapshots per fer una còpia de seguretat dels fitxers en un moment determinat, sense interrompre el servei.
- Creació de snapshots: Crearem un snapshot del volum lògic
/dev/vg_webapp/lv_data
per fer una còpia de seguretat dels fitxers de la carpeta/opt/webapp/data
. - Crearem una còpia de la informació: Crearem una còpia de la informació llegint l'snapshot que hem creat, mentre el volum lògic original està en funcionament i els usuaris continuen treballant.
- Mourem la còpia de seguretat: Mourem la còpia de seguretat a un altre servidor o sistema de backup.
- Neteja: Un cop hem acabat la còpia de seguretat, eliminarem l'snapshot.
Preparació
-
Utilitzeu la màquina virtual creada en els apartats anteriors.
-
Assegureu-vos que teniu el volum lògic
/dev/vg_webapp/lv_data
creat i muntat en el directori/opt/webapp/data
. -
Elimineu els fitxers de prova de la carpeta
/opt/webapp/data
:rm -rf /opt/webapp/data
-
Creeu dades de prova en el directori
/opt/webapp/data
:echo "Hello, World1!" > /opt/webapp/data/file1.txt echo "Hello, World2!" > /opt/webapp/data/file2.txt echo "Hello, World3!" > /opt/webapp/data/file3.txt
Tasques
Creació d'snapshots
El primer pas per realitzar una còpia de seguretat dels nostres fitxers, creant un snapshot del volum lògic /dev/vg_webapp/lv_data
.
-
Creeu un snapshot del volum lògic
/dev/vg_webapp/lv_data
:lvcreate -L 1G -s -n snap_data /dev/vg_webapp/lv_data
Nota: La mida d'un snapshot hauria de ser suficient per guardar els fitxers actuals del volum lògic. Per tant, és important ajustar la mida de l'snapshot segons les necessitats del nostre sistema. En aquest laboratori, assumirem que 1GB és suficient per a les nostres dades.
Si tot ha anat bé, hauríeu de veure un missatge com aquest:
Logical volume "snap_data" created.
-
Comproveu que l'snapshot s'ha creat correctament:
lvs
Aquesta comanda us mostrarà informació rellevant sobre l'snapshot:
LV VG Attr LSize Pool Origin Data% snap_data vg_webapp swi-a-s--- 1.00g lv_data 0.01
On
snap_data
és el nom de l'snapshot,vg_webapp
és el grup de volums,swi-a-s---
són els atributs de l'snapshot:- (s): és un snapshot
- (w): té permisos d'escriptura
- (i): indica que és un volum lògic heretat, és a dir, que depèn d'un altre volum lògic.
- (a): indica que el volum lògic està actiu
Si us fixeu, entre
a-s
indica que el dispositiu (snapshot) no ha estat obert, ja que no està muntat. Ho podeu comprovar amb el volum lògic original/dev/vg_webapp/lv_data
que està muntat.La columna
Data
indica el percentatge de dades que conté l'snapshot.1.00g
és la mida de l'snapshot,lv_data
és el volum lògic original,0.01
és el percentatge de dades que conté l'snapshot. -
Creeu un punt de muntatge per a l'snapshot:
mkdir /snaps
-
Munteu l'snapshot en el directori
/snaps
:mount /dev/vg_webapp/snap_data /snaps
-
Comproveu amb
lvs
com ara l'snapshot està muntada:swi-aos---
.lvs
-
Compareu el contingut del directori
/opt/webapp/data
amb el de l'snapshot:diff -r /opt/webapp/data /snaps
En aquest punt, els dos directoris haurien de ser idèntics. Per tant, no s'hauria de mostrar cap sortida.
-
Reviseu els atributs de la carpeta
/snaps
i/opt/webapp/data
mostrant informació dels inodes:ls -li /opt/webapp/data /snaps/
Cal destacar que un snapshot conté enllaços físics als inodes reals de les dades. Això significa que, mentre les dades no canviïn, l' snapshot només contindrà referències als fitxers originals. No obstant això, si les dades del volum original es modifiquen, l'snapshot clonarà automàticament la informació abans de ser modificada, mantenint els fitxers originals a l'snapshot i les dades noves al sistema de fitxers actiu. A més, les dades que s'escriuen a l'snapshot es marquen com a utilitzades i no es copien al volum original.
/opt/webapp/data: total 12 11 -rw-r--r--. 1 root root 15 Jul 16 09:26 file1.txt 12 -rw-r--r--. 1 root root 15 Jul 16 09:26 file2.txt 13 -rw-r--r--. 1 root root 15 Jul 16 09:26 file3.txt /snaps/: total 12 11 -rw-r--r--. 1 root root 15 Jul 16 09:26 file1.txt 12 -rw-r--r--. 1 root root 15 Jul 16 09:26 file2.txt 13 -rw-r--r--. 1 root root 15 Jul 16 09:26 file3.txt
-
Modifiqueu el fitxer
file3.txt
amb la comandadd
per escriure-hi un nou contingut (per exemple, 100MB de zeros):dd if=/dev/zero of=/opt/webapp/data/file3.txt bs=1M count=100
-
Compareu de nou el contingut del directori
/opt/webapp/data
amb el de l'snapshot:diff -r /opt/webapp/data /snaps
En aquest punt, els dos directoris haurien de ser diferents. Per tant, hauríeu de veure les diferencies amb la comanda
diff
.Binary files /opt/webapp/data/file3.txt and /snaps/file3.txt differ
-
Realitzeu, un nou snapshot del volum lògic
/dev/vg_webapp/lv_data
, i després modifiqueu el fitxerfile2.txt
:lvcreate -L 1G -s -n snap_data2 /dev/vg_webapp/lv_data && dd if=/dev/zero of=/opt/webapp/data/file2.txt bs=1M count=100
-
Desmuntem el primer snapshot:
umount /snaps
-
Muntem el segon snapshot:
mount /dev/vg_webapp/snap_data2 /snaps
-
Compareu de nou els atributs de la carpeta
/snaps
:ls -li /opt/webapp/data /snaps/
/opt/webapp/data: total 204804 11 -rw-r--r--. 1 root root 15 Jul 16 17:39 file1.txt 12 -rw-r--r--. 1 root root 104857600 Jul 16 17:40 file2.txt 13 -rw-r--r--. 1 root root 104857600 Jul 16 17:40 file3.txt /snaps/: total 102408 11 -rw-r--r--. 1 root root 15 Jul 16 17:39 file1.txt 12 -rw-r--r--. 1 root root 15 Jul 16 17:39 file2.txt 13 -rw-r--r--. 1 root root 104857600 Jul 16 17:40 file3.txt
Fixeu-vos que el fitxer
file2.txt
de l'snapshot no ha canviat, ja que les dades originals s'han clonat abans de ser modificades. En canvi, el fitxerfile2.txt
del directori/opt/webapp/data
ha canviat. Tot i això, segueixen tenint el mateix inode. Això és possible gràcies a la funcionalitat de COW (copy-on-write) dels snapshots.
En aquest punt, podria'm realitzar una còpia de seguretat de la carpeta /opt/webapp/data
sense interrompre el servei. Es podria utilitzar les eines cp
o rsync
per copiar els fitxers de l'snapshot a un altre sistema de backup.
Recuperant dades de l'snapshot
Imaginem que el fitxer file2.txt
s'han incorporat canvis incorrectes i volem restaurar la versió original. Per fer-ho, utilitzarem el segon snapshot snap_data2
que hem creat anteriorment.
-
Desmuntem el volum lògic original:
umount /dev/vg_webapp/lv_data
Nota: Aquest punt provocarà una interrupció del servei, ja que el volum lògic original està en ús.
-
Fusionem l'snapshot amb el volum lògic original:
lvconvert --merge /dev/vg_webapp/snap_data2
Merging of volume vg_webapp/snap_data2 started. vg_webapp/lv_data: Merged: 90.73% vg_webapp/lv_data: Merged: 100.00%
Nota: Aquest procés pot trigar una estona, ja que implica la fusió de les dades de la snapshot amb el volum lògic original.
-
Montem el volum lògic original:
mount /dev/vg_webapp/lv_data /opt/webapp/data
-
Comproveu que el fitxer
file2.txt
ha estat restaurat:ls -l /opt/webapp/data
Aquesta acció ha implicat aturar el servei durant un temps, ja que hem hagut de desmuntar el volum lògic original per fusionar-lo amb l'snapshot. Aquesta és una de les limitacions dels snapshots de LVM.
Propietats dels snapshots
Fins ara, hem vist com crear i utilitzar snapshots. Ara bé, un error comú es no tenir en compte que tot i que els snapshots no són incrementals, si que són diferencials. Això vol dir que els snapshots no guarden totes les versions anteriors de les dades, sinó només les diferències amb les dades originals. Aquesta característica ens permet registrar les diferències entre les dades originals i els snapshots, però no tenir un històric dels canvis. Això es deu a la tècnica de COW (copy-on-write) que utilitza LVM per als snapshots. Aquesta tècnica clona les dades originals abans de ser modificades.Ara bé, les dades originals es clonen només si es modifiquen, i l'únic que es clona és el bloc de dades modificat.
-
Comproveu l'estat inicial del lv i de l'snapshot amb la comanda
lvs
:LV VG Attr LSize Pool Origin Data% lv_data vg_webapp owi-aos--- 1.00g snap_data vg_webapp swi-a-s--- 1.00g lv_data 0.01
-
Afegiu un nou fitxer de 100MB al directori
/opt/webapp/data
:dd if=/dev/zero of=/opt/webapp/data/file4.txt bs=1M count=100 oflag=dsync
-
Comproveu amb
lvs
l'estat del volum lògic i de l'snapshot:LV VG Attr LSize Pool Origin Data% root almalinux -wi-ao---- 16.41g swap almalinux -wi-ao---- 2.00g lv_data vg_webapp owi-aos--- 20.00g lv_run vg_webapp -wi-a----- 1.00g lv_sources vg_webapp -wi-a----- 1.00g snap_data vg_webapp swi-a-s--- 1.00g lv_data 10.00
Fixeu-vos que la columna
Data
de l'snapshot ha augmentat al 10%. Això indica que l'snapshot ha registrat els canvis que hem fet al volum lògic original. Però, tal com hem vist abans, aquest fitxer no es pot visualitzar si munteu l'snapshot i comproveu el seu contingut. Això és perquè els snapshots de LVM són diferencials, no incrementals. -
Per actualitzar el contingut de l'snapshot, hauriam d'eliminar-lo i crear-ne un de nou:
lvremove /dev/vg_webapp/snap_data lvcreate -L 1G -s -n snap_data /dev/vg_webapp/lv_data
Molts us preguntareu, si no puc recuperar o veure les modificacions sense crear-ne un de nou i a més l'snapshot ocupa espai per les diferencia, quin sentit té? El sentit dels snapshots és poder fer còpies de seguretat o realitzar tasques de manteniment sense afectar el rendiment del sistema, ja que només es guarden les diferències respecte les dades originals. Això permet estalviar espai i recursos en comparació amb altres mètodes de còpia de seguretat.
Escenari: El LV original creix més que l'snapshot
Imagina que el volum lògic original /dev/vg_webapp/lv_data
creix més en mida que l'snapshot snap_data
. Si la mida de l'snapshot no és suficient per registrar totes les modificacions del volum lògic original, l'snapshot es corromprà.
-
Creeu un fitxer de 1GB en el directori
/opt/webapp/data
:dd if=/dev/zero of=/opt/webapp/data/file4 bs=1G count=1 oflag=dsync
Nota: Recordeu que la mida de l'snapshot és de 1GB. El fitxer
file4
fa que el volum lògic original/dev/vg_webapp/lv_data
creixi més en mida que l'snapshotsnap_data
. -
Comproveu la situació amb la comanda
lvs
:[root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root almalinux -wi-ao---- 16.41g swap almalinux -wi-ao---- 2.00g lv_data vg_webapp owi-aos--- 20.00g lv_run vg_webapp -wi-a----- 1.00g lv_sources vg_webapp -wi-a----- 1.00g snap_data vg_webapp swi-I-s--- 1.00g lv_data 100.00
Fixeu-vos que l'snapshot
snap_data
està al 100% de la seva capacitat ja que no pot registrar més canvis del volum lògic original. -
Comproveu que l'snapshot es desactiva amb la comanda
lvdisplay
:lvdisplay /dev/vg_webapp/snap_data
--- Logical volume --- LV Path /dev/vg_webapp/snap_data LV Name snap_data VG Name vg_webapp LV UUID UxIwLW-sppS-fxAt-ojqy-dWlx-0xhY-tu0CuR LV Write Access read/write LV Creation host, time localhost.localdomain, 2024-07-16 10:21:33 +0200 LV snapshot status INACTIVE destination for lv_data LV Status available # open 0 LV Size 20.00 GiB Current LE 5120 COW-table size 1.00 GiB COW-table LE 256 Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:7
-
Feu servir la comanda
dmsetup
per obtenir una informació semblant:dmsetup status | grep snap_data
Per fer-ho, podem filtrar la sortida amb la comanda
grep
. Recordeu quedmsetup
és una eina que permet gestionar dispositius de dispositius de blocs, com ara els volums lògics de LVM.vg_webapp-snap_data: 0 41943040 snapshot Invalid vg_webapp-snap_data-cow: 0 2097152 linear
En aquesta sortida, podem veure que l'snapshot
snap_data
ha canviat d'estat aInvalid
. Això significa que l'snapshot ja no és vàlida i s'ha desactivat. -
Finalment, podeu comprovar els missatges del sistema amb la comanda
grep
:grep Snapshot /var/log/messages
WARNING: Snapshot vg_webapp-snap_data changed state to: Invalid and should be removed.
En totes les comandes anteriors, es pot veure que l'snapshot snap_data
s'ha corromput i s'ha desactivat. Per tant, elimineu-la amb la comanda lvremove
:
lvremove /dev/vg_webapp/snap_data
Do you really want to remove active logical volume vg_webapp/snap_data? [y/n]: y
Creu un nou snapshot amb mida suficient per registrar les dades del volum lògic original:
lvcreate -L 2G -s -n snap_data /dev/vg_webapp/lv_data
Configuració dels snapshots
LVM ens permet configurar els snapshots perquè s'estenguin automàticament quan arribin a un determinat límit de capacitat. Per exemple, si un snapshot arriba al 70% de la seva capacitat, es pot estendre automàticament un 50% més per evitar que es corrompi. Això és útil per a sistemes on les dades canvien ràpidament i els snapshots poden quedar obsoletes ràpidament. Per fer-ho, cal modificar el fitxer de configuració de LVM /etc/lvm/lvm.conf
.
-
Obriu el fitxer de configuració de LVM amb un editor de text:
vi /etc/lvm/lvm.conf
Utilizeu
\
per buscar la secciósnapshot_autoextend_threshold
isnapshot_autoextend_percent
i afegiu-hi els valors següents:snapshot_autoextend_threshold = 70 snapshot_autoextend_percent = 50
-
Després de fer els canvis, deseu i tanqueu l'editor de text.
-
Reinicieu el servei de LVM:
systemctl restart lvm2-lvmpolld
-
Creeu un nou snapshot amb una mida petita:
lvcreate -L 1G -s -n snap_data /dev/vg_webapp/lv_data
-
Afegiu un fitxer de 500MB al directori
/opt/webapp/data
:dd if=/dev/zero of=/opt/webapp/data/file5.txt bs=1M count=500 oflag=dsync
-
Comproveu l'estat de l'snapshot amb la comanda
lvs
:LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root almalinux -wi-ao---- 16.41g swap almalinux -wi-ao---- 2.00g lv_data vg_webapp owi-aos--- 20.00g lv_run vg_webapp -wi-a----- 1.00g lv_sources vg_webapp -wi-a----- 1.00g snap_data vg_webapp swi-a-s--- 1.00g lv_data 50.10
-
Modifiqueu el fitxer
/opt/webapp/data
:dd if=/dev/zero of=/opt/webapp/data/file5.txt bs=1M count=300 oflag=dsync
-
Comproveu l'estat de l'snapshot amb la comanda
lvs
:LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root almalinux -wi-ao---- 16.41g swap almalinux -wi-ao---- 2.00g lv_data vg_webapp owi-aos--- 20.00g lv_run vg_webapp -wi-a----- 1.00g lv_sources vg_webapp -wi-a----- 1.00g snap_data vg_webapp swi-a-s--- 1.00g lv_data 64.12
Com hem modificat el fitxer
file5.txt
, l'snapshot ha augmentat la seva capacitat al 64%. -
Modifiqueu de nou el fitxer
/opt/webapp/data
:dd if=/dev/zero of=/opt/webapp/data/file5.txt bs=1M count=200 oflag=dsync
-
Comproveu l'estat de l'snapshot amb la comanda
lvs
:LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root almalinux -wi-ao---- 16.41g swap almalinux -wi-ao---- 2.00g lv_data vg_webapp owi-aos--- 20.00g lv_run vg_webapp -wi-a----- 1.00g lv_sources vg_webapp -wi-a----- 1.00g snap_data vg_webapp swi-a-s--- 1.00g lv_data 72.41
Fixeu-vos que l'snapshot
snap_data
ha arribat al 72% de la seva capacitat. Això hauria d'activar l'extensió automàtica de l'snapshot. -
Torneu a comprobar l'estat amb
lvs
:
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root almalinux -wi-ao---- 16.41g
swap almalinux -wi-ao---- 2.00g
lv_data vg_webapp owi-aos--- 20.00g
lv_run vg_webapp -wi-a----- 1.00g
lv_sources vg_webapp -wi-a----- 1.00g
snap_data vg_webapp swi-a-s--- 1.50g lv_data 48.28
De forma automàtica, l'snapshot s'ha ampliat un 50% més de la seva capacitat original. Això permet que l'snapshot s'adapti als canvi i redueixi la probabilitat de corrupció.
Neteja
-
Elimineu els fitxers de prova:
rm -rf /opt/webapp/data/*
-
Elimineu la carpeta
/snaps
:rm -rf /snaps
-
Elimineu l'snapshot:
lvremove /dev/vg_webapp/snap_data
Anàlisi de l'ús dels snapshots
En el context de la nostra webapp que utilitza LVM, necessitem realitzar un backup de la nostra carpeta de dades que triga aproximadament 1 hora. Durant aquesta hora, es creen o modifiquen aproximadament 1GB de dades. Quines consideracions hauríem de tenir en compte per establir una política eficient d'snapshots, tenint en compte factors com el temps, l’espai, la freqüència i la retenció?