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

09 dic

Instalar OpenZFS en LINUX

20131209-084324.jpgParece ser que tenemos una versión estable de openZFS, así que como es un tema que me gusta bastante, pues os voy a explicar como instalarlo en Linux y comprobar su funcionamiento, si queréis saber cosas mas a fondo de ZFS, pues pasaros por los artículos anteriores:

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

Situación

  1. Esta disponible para los kernels Linux 2.6.26 – 3.11.
  2. No se recomienda instalarlo en sistemas de 32bits
  3. Mínimo 2GB de RAM, si queréis utilizar deduplicacion o compresión, bueno entonces pensar en poner una cuanta más.. os podéis hacer a la idea en los post que comento mas arriba.

Por qué sale OpenZFS?

  1. Oracle registró el nombre ZFS como marca comercial complicando su uso (MAL)
  2. Sale OpenZFS como proyecto “protesta” open source del proyecto ZFS de SUN, por los problemas con Oracle. (BIEN)
  3. Uno de los lideres es Matt Ahrens, co-fundador del proyecto ZFS (BIEN)
  4. La idea es unificar el desarrollo en FreeBSD, Linux, Mac OS X, and illumos (BIEN)
  5. 3 BIEN – 1 MAL así que vamos a explicarlo.

Nosotros lo vamos a montar en un Ubuntu server 13.10.

Creación

Primero de todo añadiremos los el ppa para bajarnos los paquetes:

sudo add-apt-repository ppa:zfs-native/stable

Deberemos instalar lo siguiente

apt-get install zfs-dkms parted mountall spl-dkms spl ubuntu-zfs zfsutils

Una vez finalice hacemos un reboot y listos ya tenemos zfs en linux (sin fuse)

Ahora que lo tenemos vamos a probar algunas de las cosas que dicen que hace…. :)

Creación de RAID Z

Añadir un par de discos y montamos, por ejemplo un Raid Z mirror


Disco /dev/sdb: 8589 MB, 8589934592 bytes
Disco /dev/sdc: 8589 MB, 8589934592 bytes

 

[email protected]:~# zpool create -f storage raidz /dev/sdb /dev/sdc
[email protected]:~# df -h

S.ficheros Tamaño Usados Disp Uso% Montado en
storage 7,9G 0 7,9G 0% /storage

Como bien sabemos así  de sencillo se crea un RAID, si queréis algo mas complejo, pues lo dicho a los post anteriores.

Forzar un error de disco

Ahora lo que vamos a probar es quitar un disco mientras escribimos en el otro…  hice un gif para que se vea que no se pierde escritura.
En el gif podéis ver 4 pantallas que os explico en la siguiente imagen.

teste mirror 1
Y en el gif, el casque

mirror1_fail

En el recuadro de abajo a la izquierda vemos como se esta lanzando un dd, vemos la tasa de escritura en el de la derecha, y arriba como quitamos el disco del pool lo añadimos y empezamos a ver como se resincroniza, para cubrirnos un poco ante un fallo de disco, podemos añadir otro en spare

Añadir disco en SPARE

zpool add -f storage spare /dev/sdd

diskspare

Fallo de disco, con un disco spare

Por defecto, el spare entra en funcionamiento automáticamente en el caso que tener un fallo de uno de los dos del mirror, pero como no puedo quitar el disco a lo burro, pues vamos hacer la emulación, a más que así también aprendemos como se hace manualmente, que ha veces lo automático deja de ser lo.

  • Ponemos uno de los discos del mirror en offline.
zpool offline storage sdc

fail online disk

Ahora de forma manual le vamos a decir que remplace el disco “roto” por el spare.

  • Remplazo del disco por el spare.
 zpool replace storage sdc sd

Y veremos
remplazo

Si nos fijamos en el disco sdd a pasado a estar dentro del pool y estado ONLINE, esto que quiere decir, pues que aun que tengamos el sdc OFFLINE, el sdd ya esta recibiendo peticiones y forma parte del RAID

Aquí se ve claramente

spareonlineEn este punto tenemos dos caminos o volvemos a poner el disco sdc ONLINE o lo eliminamos, de tal manera que el sdd pasara a formar parte de el pool en la misma situación que el sdc cuando funcionaba, pues probamos los dos casos!

  • Ponemos el sdc en ONLINE
zpool online storage sdc

Ahora lo que pasará es que tendremos el sdc y el sdd como discos spare asociados a ese pool, pero estando los 3 activos, si nos fijamos hemos pasado de tener un disco spare disponible a activo, cuando este esta activo queda asociado al pool en el cual empezó a trabajar, cuando nosotros hicimos el replace lo asociamos al pool de storage, entonces cuando ponemos el sdc ONLINE, lo que tendremos es lo siguiente.

todoonlineFijaros como el sdc paso a estar en uso, en la imagen anterior cuando lo añadimos estaba en disponible.

todoonline

Ahora hacemos escrituras veremos como los 3 están escribiendo.

todosescribiendoPERO! Cuantos utilizaremos si leemos?

Pues dos, los dos que están activos realmente, para atender a todas las peticiones.
lectura

  • Dejar todo como estaba

Vale, bueno ahora lo que nos interesa es volver a dejar un disco en spare, disponible para todos los pools que tengamos, el sdd como nuevo disco dentro del raidz, o sea todo tal y como estaba, la verdad es que no se si es la mejor forma, pero no encontré otra mejor… tendremos que  ponerlo offline y hacer el detach

zpool offline storage sdc
zpool detach storage sdc

Y todo volverá a la normalidad, pero teniendo el RAID montado con el sdb y el sdd en vez de con el sdb y el sdc, que este ahora será spare disponible para todos los pools

normalidad

Si llegados a este punto estamos convencidos de que vamos a utilziar zfs, pues lo que nos gustará hacer es que cuando arranque nos monte el pool. para eso deberemos hacer dos cosas:

Editar

vim /etc/default/zfs

ZFS_MOUNT='yes'

ZFS_UNMOUNT='yes'

Y os preguntareis que linea hay que meter en el fstab?, pues ninguna ya que el demonio zfs se encarga de montar el pool que tenemos configurado al arrancar, esto lo hace partiendo de la información del fichero zpool.cache (fichero importante) y se crea cuando creamos el pool o podemos recrearlo con el siguiente comando.

zpool set cachefile=/etc/zfs/zpool cache pool

Si en algún momento queremos montar o desmontar el pool nosotros mismos, es tan sencillo como hacer

zfs mount pool
zfs umont pool