08 ene

Gestión de Snapshots con OpenZFS

Dentro de la sorpresa y la emoción de OpenZFS, voy a explicar cómo funcionan los snapshots y los clones de ZFS, es un post continuación del Instalar OpenZFS en Linux, y complemento de los anteriores:

  1. Comandos zpool
  2. Optimización de ZFS
  3. Tipos de caches en ZFS

Situación

  • Un pool con dos discos, en nuestro caso en RAID 0 a lo loco.
[email protected]:~# df -h
other                          9,8G      0  9,8G   0% /other
[email protected]:~# zpool iostat -v 2
other        748K  9,94G      0      0      0      0
sdf1       448K  4,97G      0      0      0      0
sde1       301K  4,97G      0      0      0      0

Actualmente en ese recurso no tenemos nada, así que vamos a hacer diferentes snapshots para ver claramente el concepto.

Creación de snapshots

Vamos a crear un snapshot con el nombre snap1, del pool other, pensar que donde ponemos poner snap1 puede ser el día de la semana o el mes o algo más descriptivo

[email protected]:/storage# zfs snapshot [email protected]

Ahora podemos verlo listando, para ver todos los que tenemos en cualquier pool, haremos

zfs list -t snapshot

Para ver únicamente los de nuestro pool, haremos

[email protected]:/storage# zfs list -r -t snapshot -o name,creation other
NAME         CREATION
[email protected] lun dic  9 15:56 2013

Ya tenemos un snapshot, lo que nos puedo interesar hacer es ver que diferencias tenemos entre el snapshot y la situación actual.

[email protected]:/storage# zfs diff -FHt [email protected]
[email protected]:/storage#

Como es lógico no nos sale nada, pues vamos a cambiar cosas para que esto se nos mueva un poco.

Vamos a hacer, por ejemplo, la creación de ficheros, en ese pool

while (true); do; /other/file.$RANDOM; sleep 1; done

Lo dejamos un rato y volvemos mirar las diferencias, donde ahora si que veremos cosas.

[email protected]:/other# zfs diff -FHt [email protected]
1386601533.500608604    M       /       /other/
1386601529.484608700    +       F       /other/file.18132
1386601530.488608676    +       F       /other/file.15910
1386601531.488608652    +       F       /other/file.18620
1386601532.492608628    +       F       /other/file.14556
1386601533.500608604    +       F       /other/file.799

Donde podemos ver como nos dice que todos esos “file” están en el disco “+” y no en el snapshot.

Ahora vamos a hacer otro snapshot y después eliminaremos uno de los ficheros y veremos lo que nos dice.

[email protected]:/storage# zfs snapshot [email protected]
[email protected]:rm -rf /other/file.14556

 

[email protected]:/other# zfs diff -FHt [email protected]
1386601765.588603052    M       /       /other/
1386601532.492608628    -       F       /other/file.14556

Y como es lógico (menos mal) nos enseña el fichero que hemos borrado, y nos dice que ese fichero no existe en el snap2.

Comprobamos que supone hacer un snapshot cuando el sistema tiene bastante carga, y lo hacemos con un dd y ¡un gif súper chulo!
snap
El snapshot tarda un poco más, pero no se corta el dd ni baja significativamente el rendimiento.

Pues ahora que tenemos 3-4 snapshot vamos a jugar como ellos.

Rolling back

Aquí tenemos que tener claro que por ejemplo en nuestro caso tenemos 4 snapshots, su volvemos por ejemplo al 2, no podemos volver ni al 3 ni al 4 y estos los perderemos, pongamosnos en la situación que queremos recuperar el fichero file.14556, que borramos unos pasos más atrás.

[email protected]:/other# zfs diff -FHt [email protected]
1386602119.328594591    M       /       /other/
1386601532.492608628    -       F       /other/file.14556
1386602227.756591997    +       F       /other/prueba3.dd
[email protected]:/other# zfs diff -FHt [email protected]
1386602227.756591997    M       F       /other/prueba3.dd
[email protected]:/other# zfs diff -FHt [email protected]
1386602119.328594591    M       /       /other/
1386601532.492608628    -       F       /other/file.14556
1386602227.756591997    +       F       /other/prueba3.dd
[email protected]:/other# ll /other/file.14556
ls: no se puede acceder a /other/file.14556: No existe el archivo o el directorio
[email protected]:/other#

ROLLBACK!!!

[email protected]:/other# zfs rollback -r [email protected]
[email protected]:/other# ll /other/file.14556
-rw-r--r-- 1 root root 0 dic  9 16:05 /other/file.14556
[email protected]:/other#

Pues ahí lo tenemos, ¿Cuál es el problema? Pues muy claro que hemos perdido también todos los cambios que hemos hecho desde el snap2 hacia adelante, e incluso nuestro querido prueba3.dd, entonces lo que esta claro es que tenemos que tener alguna forma de recuperar ese fichero sin perder el resto… pues lo explico más abajo, no nos desviemos!

Vamos a eliminar el snap1 que no nos sirve para nada

Eliminación de Snapshots

[email protected]:/other# zfs list -r -t snapshot -o name,creation other
NAME         CREATION
[email protected] lun dic  9 15:56 2013
[email protected] lun dic  9 16:07 2013
[email protected]:/other# zfs destroy [email protected]
[email protected]:/other# zfs list -r -t snapshot -o name,creation other
NAME         CREATION
[email protected] lun dic  9 16:07 2013

Y ya esta solo queda 1…

Ahora pongamosnos en la situación que tenemos un snapshot del sábado que no queremos borrar bajo ningún concepto, pues lo que podremos hacer es bloquear el snapshot, de la siguiente forma!

[email protected]:/other# zfs snapshot [email protected]
[email protected]:/other# zfs hold noborrar [email protected]
[email protected]:/other# zfs destroy [email protected]
cannot destroy snapshots in [email protected]: dataset is busy
[email protected]:/other# zfs release noborrar [email protected]
[email protected]:/other# zfs destroy [email protected]
[email protected]:/other#

Con la opción hold ponemos un tag (noborrar) en el snapshot, de esta manera evitamos que pueda ser borrado, si nos fijamos cuando intentamos lanzar el destroy nos da un error “cannot destroy snapshots in [email protected]: dataset is busy”, para liberarlo deberemos lanzar el comando release y después el destroy.

También podemos ver la lista de tags con el comando zfs holds

[email protected]:/other# zfs holds [email protected]
NAME         TAG       TIMESTAMP
[email protected] noborrar  lun dic  9 17:48 2013

Clones

Bueno volvemos al caso anterior donde hemos hecho la restauración de un snapshot y por consiguiente hemos perdió los cambias desde el snapshot hasta el momento actual, ¿Cómo evitaremos esto? pues con los clones!!

Vamos a ver un ejemplo:

Tenemos el recurso other, el cual vamos a crear ficheros y haremos un snapshot, después creamos más ficheros e intentamos recuperar el primer snapshot sin perder los datos hasta el momento actual.

Utilizamos el mismo while que hemos utilizado antes.

  while (true); do   ; /other/file.$RANDOM   ; sleep 1; done  

Vamos a listar los ficheros que no tenemos snapshot clone1, respecto a la base, para así saber que es lo que vamos a recuperar.

Imaginemos que queremos recuperar el fichero file.3984, que no esta en la lista, bueno pues vamos a “montar” el clone en una directorio, para poder acceder a los ficheros.

zfs clone [email protected] [email protected]:/other/clone1#
ls -la /other/clone1/file.3984
-rw-r--r-- 1 root root 0 dic 17 10:41 /other/clone1/file.3984

Y ahí lo tenemos, en un directorio a parte, podemos ver que tenemos un nuevo recurso montado con la carpeta clone1.

[email protected]:/other/clone1# df -h | grep clone1
other/clone1                   9,8G      0  9,8G   0% /other/clone1

Una vez terminado de recuperar los datos pues eliminamos el clone…

zfs destroy other/clone1

Vamos a poner otro ejemplo, pensemos que hemos estado trabajando con el clone1 y ahora se convirtió en importante y queremos empezar a utilizarlo como sustitución del recurso actual, o sea, queremos promocionarlo.

Promocionar clone

Vamos a cambiar el escenario, vamos hacerlo con números para que se entienda bien, o sea, “uno” sera el recurso de producción, “dos” el clone restaurado y “tres” el rename de “uno”

Creamos un nuevo recurso

[email protected]:~# zfs create other/uno

Realizamos el snapshot con el que trabajaremos y lo promocionaremos

[email protected]:~# zfs snapshot [email protected][email protected][email protected][email protected]                         

Ahora lo montamos en un directorio llamado dos

[email protected]:~# zfs clone [email protected] other/dos

Y lo promocionamos.

[email protected]:~# zfs promote other/dos

De la forma más lógica cambiamos el nombre recurso uno a tres, para poder liberar el nombre de uno y ponérselo al dos, que actualmente es nuestra copia.

[email protected]:~# zfs rename other/uno other/tres

Y con esto ya tenemos restaurado la versión del recurso que nos interesaba

[email protected]:~# zfs rename other/dos other/uno

Pues con esto ya podemos empezar a jugar con los snapshot de openZFS