03 ago

LXC integrado con ZFS

Sin títuloNunca trabajé muy seriamente con lxc hasta ahora, total que estuve mirando para aprender sobre el tema y resulta que sacaron lxc 1.0.3, con un monton de cosas muy molonas, entre ellas la posibilidad de que se integre con sistemas de ficheros, desconozco si las versiones anteriores ya podían hacer, yo parto de la 1.0.3 y todo lo anterior esta obsoleto :).

Total que esta integración la tiene con bastantes sistemas, pero me pareció muy interesante dos de ellos btrfs (que también empece a trabajar con el y me parece muy interesante) y por supuesto zfs. Así que no hay mejor forma de entender que leer y después probar.

 

Este post me centrare en hacer trabajar lxc con zfs de forma celestial .

Pues venga al lío que se nos va el Domingo.

Instalación de LXC y ZFS

Primero de todo instalaremos lxc y zfs, la parte de zfs la podéis encontrar explicada en en Instalar OpenZFS en LINUX

[email protected]:~# apt-get install ubuntu-zfs lxc

En mi caso la máquina tiene un disco principal de 8GB y vamos añadir dos más de 10GB cada uno, para poder hacer raidz-1 con zfs, y allí es donde montaremos nuestros lxc,  lo haremos en dos partes, primero zfs.

Los discos que tenemos son los siguientes.

ZFS

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Haremos el pool con los dos de 10GB, sdb y sdc

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

[email protected]:~# df -h

containers      9.8G     0  9.8G   0% /containers

Pues ya tenemos el sitio donde meter los containers, ahora a por lxc

LXC

Primero de todo tenemos que decirle a lxc que coloque los containers en el pool de zfs, lo haremos con dos directivas en el fichero

vim /etc/lxc/lxc.conf
lxc.lxcpath = /containers/lxc
lxc.bdev.zfs.root = /containers/lxc

lxc.lxcpath -> Path donde estarán todos los container

lxc.bdev.zfs.root -> Nombre por defecto del zfs root

Deberemos crear el directorio lxc dentro del pool containers,  sino mal asunto.

[email protected]:~# zfs create containers/lxc

[email protected]:~# df -h

containers             9.8G 128K 9.8G  1%     /containers
containers/lxc    9.8G 128K 9.8G  1%    /containers/lxc

Y con esto ya tenemos el entorno montado, ahora es el momento de probar!

LXC más ZFS

Vamos a crear un container de forma normal, pero le daremos la opción -B zfs, es el valor predeterminado del directorio, pero si asignamos zfs o btrfs o lvm, lo que nos debería hacer es que el sistema de ficheros sea zfs y nos generara un nuevo volumen por contenedor y –zfsroot donde le diremos donde esta el container.

[email protected]:~# lxc-create -t ubuntu -n test -B zfs --zfsroot containers/lxc

Como es el primer container, esta descargando la imagen y eso lleva un ratillo… una vez termine nos dice este mensaje que es muy interesante y útil.

##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##

Pues vamos a ver como quedo la situación

[email protected]:~# zfs list
NAME                 USED AVAIL REFER MOUNTPOINT
containers           318M 9.47G 31K /containers
containers/lxc       318M  9.47G 34K /containers/lxc
containers/lxc/test  318M 9.47G 318M /containers/lxc/test/rootfs

Ahí lo tenemos test esta listo para arrancar, no la hagamos esperar mas.

lxc-start --name test

Y ya tenemos el tema andando, ahora por último lo que vamos hacer es sacarle un poco de jugo al zfs, que para eso lo hemos montado, vamos a jugar con la compresión, deduplicacion y snapshots.

Tenemos más detalle de los mismos en post anteriores, así que aquí vamos a ir al lío directamente.

Deduplicacion y compresion

Snapshots

Compresion, deduplicacion y snapshots

zfs set dedup=on containers

zfs set compression=lz4 containers

zpool set listsnapshots=on containers

La compresión en lz4 que es lo que se lleva ahora ;).

Comprobamos que este todo activado.

[email protected]:~# zfs get compression
NAME                PROPERTY    VALUE SOURCE
containers          compression lz4   local
containers/lxc      compression lz4   inherited from containers
containers/lxc/test compression lz4   inherited from containers
[email protected]:~# zfs get dedup
NAME                 PROPERTY VALUE SOURCE
containers           dedup on local
containers/lxc       dedup on inherited from containers
containers/lxc/test  dedup on inherited from containers

Pues venga a jugar!!!

Vamos a crear otro container a ver como se comporta la deduplicacion y la compresion.

lxc-create -t ubuntu -n test2 -B zfs --zfsroot containers/lxc

Una vez creado si comprobamos nos llevaremos una sorpresa

[email protected]:~# zfs get compressratio

containers/lxc/test compressratio 1.00x -
containers/lxc/test2 compressratio 2.10x -

[email protected]:~# zpool list

containers 19.9G 947M 19.0G 4% 1.01x ONLINE -

Uno de los containers esta comprimido pero el otro no, y aún por encima no aplico nada de deduplicacion :(, esto es sencillamente porque hemos aplicado esas características después de crear “test”, así que hay que tenerlo en cuenta.

Vamos hacer un snapshot y crear un nuevo container, ahí si que veremos que la deduplicacion surge efecto.

Creamos el snapshot.

[email protected]:~# zfs snapshot [email protected]
[email protected]:~# zfs list -t snapshot
NAME USED AVAIL REFER MOUNTPOINT
[email protected] 0 - 31K -

Creamos test3

lxc-create -t ubuntu -n test3 -B zfs --zfsroot containers/lxc

Y comprobamos

[email protected]:~# zpool list
containers 19.9G 962M 18.9G 4% 2.02x ONLINE -

Ahora si, tenemos test2 y test3 ocupando como si solo fuera 1 a más a más como están comprimidos el tamaño es inferior respecto test1

containers/lxc/test  319M  4% /containers/lxc/test/rootfs
containers/lxc/test2 153M  2% /containers/lxc/test2/rootfs

Por ultimo los snapshots, como habeis visto hemos realizado un snapshot con zfs, pues otra de las cosas molonas que trae esta version de lxc es que puede controlar los snapshots de zfs, btrfs, lo podemos comprobar haciendo.

[email protected]:~# lxc-snapshot -n test3 -L
snap0 (/containers/lxcsnaps/test3) 2014:08:02 04:53:18
snap1 (/containers/lxcsnaps/test3) 2014:08:02 04:53:33

Ahí los tenemos :)

Podemos crear snapshot de zfs directamente de lxc en un container especifico.

[email protected]:~# lxc-snapshot -n test2
could not find any snapshots to destroy; check snapshot names.

[email protected]:~# zfs list -t snapshot -o name,creation
NAME CREATION
containers/lxc/[email protected] Sat Aug 2 4:58 2014

Lo lanzamos con lxc y lo comprobamos con zfs, al revés que en el caso anterior, parece que si que se entienden(que era el objetivo del post :) )

Pues ya tenemos el sistema montado…

Ale a desfrutarlo!

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
22 may

Tipos de caches ZFS

Vamos a explicar que tipos de cache tenemos disponible en ZFS y como trabaja cada una de ellas, este post es  un añadido al mejora del rendimiento ZFS,  hechas las presentaciones vamos al lio.

Como sabemos ZFS nos permite hacer miles de cosas que difícilmente las podemos encontrar en los sistemas tradicionales de almacenamiento, e incluso algunas de ellas no están presente entre los grandes como EMC o Hitachi, pero bien estamos viendo que con el paso del tiempo hemos conseguido aumentar el numero de cpu’s, los GB de RAM e incluso los miles de TB de nuestros discos duros, pero aún así seguimos pecando de la velocidad de los discos, así que dada esta situación solo nos queda meter caches intermedias para conseguir darle un poco de brío al tema, en esta situación tenemos lo que popularmente se esta conociendo como Hybrid Storage, que no es más que la unificación de un disco duro + un disco SSD + RAM, la cantidad de cada una de las partes en nuestro sistema dependerá una vez mas de los leuros que tengamos encima de la mesa.

En los tiempos que corren, lo mas normal es que tengamos muchos discos rotativos, poca ram y algún SSD, así que vamos a centrarnos en esta situación para explicar como funcionan y como debemos organizar las caches del sistema ZFS. Dónde tenemos el problema?, pues en el acceso aleatorio a los datos, la búsqueda del sector, más el movimiento de la aguja que nos lleva a tener una latencia importante.

Vamos a ver el esquema de sistemas de cache que tiene ZFS y explicar cada una de ellas.

arcCache ARC -> Muy por encima, ubicado en RAM, es la cache de primer nivel de ZFS, si no le decimos nada ZFS intentara ubicar en ella lo máximo posible, ya que al estar en RAM es la más rápida.(uberblock y punteros  a los arboles de datos, para acceder de la forma mas rápida posible a los mismos).

L2ARC: Cache de segundo nivel de lectura, esto son los discos SSD, zfs ubicará  todos los datos que no pudo ubicar en ARC (debemos recordar que zfs hace un uso intensivo del sistema de prefetch inteligente), esto se puede modificar y decidir que parte queremos enviar al ARC y que parte quedarnos en el L2ARC, esta explicado entre otras variables en el post “Mejorar rendimiento de ZFS“.

ZIL: Más disco SSD, cache de segundo nivel de escritura, ahí meteremos el log, el  zfs intent log que acelerará las escrituras de tipo sincrono.

Disk storage pool: Pues los discos, cuando llegamos aquí ya tenemos que tenerlo todo montadito, que sino empieza a ir todo lento lento….

Entonces como nos quedaría?, pues algo tal que así.

Diagrama1

Cosas a tener en cuenta para entender mejor la arquitectura:

  1. El incremento del rendimiento se notara tras varias horas de funcionamiento con la estructura montada, ya que el sistema L2ARC/ZiL, ira almacenando en cache, los datos que mayor acceso tengan.
  2. El L2ARC, esta pensado para sistemas de write one, read many, o sea mucha lectura poca escritura, y lectura de datos de tipo aleatorio, la lectura de datos secuenciales zfs no hará uso de L2ARC (de cualquier modo el sistema de prefetcht integrado en zfs ya esta suficientemente optimizado para el envío de datos).
  3. ZIL, esto nos ayudara a compensar las escrituras a disco, la verdad es que yo recomiendo activar ambos, ya que obtendremos el mejor rendimiento posible.

Por último, recordad que una vez montado la arquitectura deberías revisar los parámetros, pasaros por el post Mejorar rendimiento de ZFS

Como montar esto?

Fácil

zpool add <pool> cache <disco>

 

zpool add <pool> log <disco>

El primer comando activaremos la cache de L2ARC y con la opción log del segundo comando activaremos la cache ZiL
Ale a disfrutarlo!