miércoles, 12 de noviembre de 2014

Gluster: usando quotas

Una de las funcionalidades de gluster que me resultó de gran utilidad en estos días dada la escasez de espacio son las quotas. Básicamente las quotas nos permiten asignar límites de uso de espacio a directorios dentro de los volúmenes de gluster.

Supongamos que tenemos 2 aplicaciones aplicacion1 y aplicacion2 que tienen acceso a directorios homónimos dentro de un volumen gluster replicado llamado contenedor. A continuación vemos el volumen en cuestión:


[root@gluster-server-2 ~]# gluster vol info

Volume Name: contenedor
Type: Replicate
Volume ID: 3933514f-f5a4-4260-9d40-964c6cc44b59
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 172.16.47.15:/mnt/1
Brick2: 172.16.47.16:/mnt/1
[root@gluster-server-2 ~]# 

El primer paso para utilizar quotas es habilitarlas en el volumen:

[root@gluster-server-2 ~]# gluster vol quota contenedor enable
Enabling quota has been successful
[root@gluster-server-2 ~]# 

Verificamos que la operación se haya concretado correctamente:

[root@gluster-server-2 ~]# gluster vol info
 
Volume Name: contenedor
Type: Replicate
Volume ID: 3933514f-f5a4-4260-9d40-964c6cc44b59
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 172.16.47.15:/mnt/1
Brick2: 172.16.47.16:/mnt/1
Options Reconfigured:
features.quota: on
[root@gluster-server-2 ~]# 

Ahora que las quotas están habilitadas podemos configurarlas. En este caso cofiguramos una quota de 1GB para el directorio aplicacion1 y 512MB para el directorio aplicacion2:

[root@gluster-server-2 ~]# gluster vol quota contenedor limit-usage /aplicacion1 1024MB
limit set on /aplicacion1
[root@gluster-server-2 ~]# gluster vol quota contenedor limit-usage /aplicacion2 512MB
limit set on /aplicacion2
[root@gluster-server-2 ~]# 

Corroboramos que se hayan aplicado las quotas:

[root@gluster-server-2 ~]# gluster vol info
 
Volume Name: contenedor
Type: Replicate
Volume ID: 3933514f-f5a4-4260-9d40-964c6cc44b59
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 172.16.47.15:/mnt/1
Brick2: 172.16.47.16:/mnt/1
Options Reconfigured:
features.limit-usage: /aplicacion1:1024MB,/aplicacion2:512MB
features.quota: on
[root@gluster-server-2 ~]# 

Ahora probamos las cuotas escribiendo en los directorios desde el cliente que monta el volumen. El volumen lo montamos en /mnt:

[root@gluster-client ~]# mount
/dev/vda1 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
172.16.47.15:/contenedor on /mnt type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)
[root@gluster-client ~]# ls /mnt/
aplicacion1  aplicacion2
[root@gluster-client ~]# 

Primero escribimos en ambos directorios hasta poco antes del límite:

[root@gluster-client ~]# dd if=/dev/zero of=/mnt/aplicacion1/archivo_grande bs=1M count=1020
1020+0 records in
1020+0 records out
1069547520 bytes (1.1 GB) copied, 32.5717 s, 32.8 MB/s
[root@gluster-client ~]# dd if=/dev/zero of=/mnt/aplicacion2/archivo_grande bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 14.0041 s, 37.4 MB/s
[root@gluster-client ~]# 

Vemos cuánto escribimos en cada directorio:

[root@gluster-client ~]# du -sch /mnt/*
1020M /mnt/aplicacion1
500M /mnt/aplicacion2
1.5G total
[root@gluster-client ~]# 

De momento nos mantuvimos por debajo de los límites definidos en las cuotas, por eso no tuvimos problema alguno. Podemos verificar el estado de las cuotas fijadas de la siguiente manera:

[root@gluster-server-2 ~]# gluster vol quota contenedor list
path  limit_set     size
----------------------------------------------------------------------------------
/aplicacion1             1024MB             1020.0MB
/aplicacion2              512MB              500.0MB
[root@gluster-server-2 ~]# 

Ahora ponemos a prueba el control escribiendo mas allá de lo permitido con un nuevo archivo:

[root@gluster-client ~]# dd if=/dev/zero of=/mnt/aplicacion1/archivo_chico bs=1M count=100
dd: escribiendo «/mnt/aplicacion1/archivo_chico»: Se ha excedido la cuota de disco
6+0 records in
5+0 records out
5898240 bytes (5.9 MB) copied, 0.141132 s, 41.8 MB/s
[root@gluster-client ~]# dd if=/dev/zero of=/mnt/aplicacion2/archivo_chico bs=1M count=100
dd: escribiendo «/mnt/aplicacion2/archivo_chico»: Se ha excedido la cuota de disco
dd: cerrando el fichero de salida «/mnt/aplicacion2/archivo_chico»: Se ha excedido la cuota de disco
[root@gluster-client ~]# 

JA! No pudimos escribir demasiado, alcanzamos los límites fijados por las cuotas:

[root@gluster-client ~]# du -sch /mnt/*
1.1G /mnt/aplicacion1
513M /mnt/aplicacion2
1.6G total
[root@gluster-client ~]# 

también lo podemos ver desde gluster:

[root@gluster-server-2 ~]# gluster vol quota contenedor list
path  limit_set     size
----------------------------------------------------------------------------------
/aplicacion1             1024MB                1.0GB
/aplicacion2              512MB              512.5MB
[root@gluster-server-2 ~]# 

Una vez alcanzada la cuota ni siquiera se nos permite crear nuevos archivos o directorios:

[root@gluster-client ~]# touch /mnt/aplicacion1/a
touch: no se puede efectuar `touch' sobre «/mnt/aplicacion1/a»: Se ha excedido la cuota de disco
[root@gluster-client ~]# touch /mnt/aplicacion2/a
touch: no se puede efectuar `touch' sobre «/mnt/aplicacion2/a»: Se ha excedido la cuota de disco
[root@gluster-client ~]# mkdir /mnt/aplicacion1/b
mkdir: no se puede crear el directorio «/mnt/aplicacion1/b»: Se ha excedido la cuota de disco
[root@gluster-client ~]# mkdir /mnt/aplicacion2/b
mkdir: no se puede crear el directorio «/mnt/aplicacion2/b»: Se ha excedido la cuota de disco
[root@gluster-client ~]# 

Las cuotas pueden ser aplicadas a sub directorios también, y un punto a considerar es que se trata de cuotas duras, es decir que NO se pueden sobrepasar.