domingo, 3 de agosto de 2014

Gluster: graficando mi Gluster I

Hace unos meses comencé a utilizar Gluster en el trabajo y la verdad que me resulta una herramienta para soluciones de almacenamiento mas que interesante. Gluster permite a partir de ladrillos (puntos de montaje en los servidores) crear volúmenes de almacenamiento de tamaños exorbitantes. Estos volúmenes creados, pueden ser:

  • Distribuidos: los archivos se distribuyen entre los diferentes ladrillos que componen el volumen. Este escenario tiene un rendimiento muy interesante pero carece de redundancia a nivel de gluster (claro que uno podría usar RAID para combatir esta falencia)
  • Distribuido-Replicado: aquí los archivos además de estar distribuidos en los diferentes ladrillos se encuentran replicados (1, 2, 3 o n veces), de forma tal que se penaliza la escritura por ejemplo pero se beneficia la lectura y la redundancia de la información. 
  • Otros.
Luego de unos meses de usarlo comencé a notar que se volvía cada vez mas complicado hacerme una imagen mental de la distribución de los ladrillos en el cluster y saber a qué volumen pertenece cada uno de ellos. Así fue que comencé a buscar formas de lograr una imagen que representara la configuración actual.
  • Papel: por mas precámbrico que parezca fue la primera aproximación y dada su simplicidad y la poca dinámica de la configuración fue útil por bastante tiempo.
  • Archivo de texto: el paso siguiente fue crear una imagen con graphviz a partir de un archivo de texto que se cargaba manualmente.
  • Java y script automático: el primer intento fue con perl, pero mi manejo de perl no fue suficiente y recurrí a la abstracción de Java.
Actualmente el script tiene dos entradas fundamentales:
  • Un archivo donde se definen los hosts que conforman el cluster de la forma: host:IP
  • Un archivo que se crea a partir de la salida del comando: gluster vol info > gluster_info
La imagen generada es la siguiente:


  • Los nodos son representados como rectángulos con su etiqueta y los ladrillos que contienen.
  • A la derecha tenemos el código de colores para cada volumen.
  • Cada ladrillo es del color del volumen al que pertenece.
  • Los ladrillos que formen parte de un volumen con réplica tendrán asociado un código de réplica. Éste servirá para identificar sus réplicas. Por ejemplo en el volumen vol4, el ladrillo l1 del nodo nodo01 y el ladrillo l1 del nodo nodo04 tienen el mismo código COD0 lo que indica que son réplicas uno de otro.

Demo:

Archivos que componen el script:

juan@moon:~/Escritorio/devnull$ ls
gluster_graph.jar  gluster_info  hosts  lanzar.sh
juan@moon:~/Escritorio/devnull$ 

Archivo hosts

juan@moon:~/Escritorio/devnull$ cat hosts
gfsc-nodo01:172.16.16.190
gfsc-nodo02:172.16.16.191
gfsc-nodo03:172.16.16.192
gfsc-nodo04:172.16.16.193
juan@moon:~/Escritorio/devnull$ 

Archivo gluster_info:

juan@moon:~/Escritorio/devnull$ cat gluster_info 
Volume Name: vol2
Type: Distribute
Volume ID: 1f9db37d-fc16-433e-9c39-af526ea32027
Status: Started
Number of Bricks: 1
Transport-type: tcp
Bricks:
Brick1: gfsc-nodo03:/ladrillos/l1
Options Reconfigured:
performance.cache-size: 256MB

Volume Name: vol1
Type: Distribute
Volume ID: 1f9db37d-fc16-433e-9c39-af526ea32024
Status: Started
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: gfsc-nodo01:/ladrillos/l4
Brick1: gfsc-nodo02:/ladrillos/l4
Brick1: gfsc-nodo03:/ladrillos/l3
Options Reconfigured:
performance.cache-size: 256MB
Volume Name: vol4
Type: Distributed-Replicate
Volume ID: f0570fe5-93fa-45f3-b875-41760a466a9a
Status: Started
Number of Bricks: 6 x 2 = 12
Transport-type: tcp
Bricks:
Brick1: gfsc-nodo04:/ladrillos/l1
Brick2: gfsc-nodo01:/ladrillos/l1
Brick3: gfsc-nodo04:/ladrillos/l2
Brick4: gfsc-nodo01:/ladrillos/l2
Brick5: gfsc-nodo04:/ladrillos/l3
Brick6: gfsc-nodo02:/ladrillos/l1
Brick7: gfsc-nodo03:/ladrillos/l2
Brick8: gfsc-nodo02:/ladrillos/l2
Brick9: gfsc-nodo04:/ladrillos/l5
Brick10: gfsc-nodo02:/ladrillos/l3
Brick11: gfsc-nodo01:/ladrillos/l3
Brick12: gfsc-nodo04:/ladrillos/l4
Options Reconfigured:
server.statedump-path: /var/log/glusterfs/
performance.cache-size: 640MB
diagnostics.client-log-level: ERROR

Volume Name: vol5
Type: Distributed-Replicate
Volume ID: 1f9db37d-fc16-433e-9c39-af526ea32024
Status: Started
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: gfsc-nodo01:/ladrillos/l5
Brick1: gfsc-nodo02:/ladrillos/l5
Brick1: gfsc-nodo03:/ladrillos/l4
Options Reconfigured:
performance.cache-size: 256MB
juan@moon:~/Escritorio/devnull$ 

El archivo lanzar.sh es un simple script en bash que facilita la ejecucón del jar y el armado del png:

juan@moon:~/Escritorio/devnull$ cat lanzar.sh 
#!/bin/bash
#
#Pavlik salles Juan Jose 02/08/2014
#
#Version 0.1: 
# - Admite volumenes Distribute y Distributed-Replicate sin importar el numero de ladrillos, ni de nodos, ni de replicas. Al menos en teoria.
# - Debido a que los colores estan hardcoded el numero maximo de volumenes es 18 (TOCHANGE)
# - 
#
#Comentarios a jjpavlik@gmail.com o en https://viviendolared.blogspot.com
#
#Requiere:
# - Graphviz y dot
#
#Funcionamiento:
# 1-Armar el archivos hosts con los hosts que conforman el cluster de gluster, el archivo tiene el formato hostname:IP
# 2-Armar el archivo de configuracion de gluster corriendo "gluster vol info > gluster_info"
# 3-Ubicar ambos archivos en el mismo directorio donde se encuentra este script
# 4-Lanzar este script ./lanzar
# 5-La imagen sera out.png
# --Los ladrillos de un mismo volumen tendran el mismo color
# --Los ladrillos con replicas podran ser identificados por su codigo. Por ejemplo si el ladrillo 1 del nodo 2 es replica del ladrillo 2 del nodo 1, ambos tendran el mismo codigo

if [ ! -e hosts ]; then
echo "Couldn't find hosts file."
exit
fi

if [ ! -e gluster_info ]; then
echo "Couldn't fine gluster_info file. You can build it running \"gluster vol info > gluster_info\"."
exit
fi

cat gluster_info | java -jar gluster_graph.jar > out.dot
dot -Tpng out.dot > out.png
juan@moon:~/Escritorio/devnull$ 

El archivo gluster_graph.jar es el jar del proyecto Java que hice en Eclipse.

Ejecución:

juan@moon:~/Escritorio/devnull$ ./lanzar.sh 
juan@moon:~/Escritorio/devnull$ ls
gluster_graph.jar  gluster_info  hosts  lanzar.sh  out.dot  out.png
juan@moon:~/Escritorio/devnull$ 

Ahora ye tenemos generada la imagen correspondiente en out.png.



El código de gluster_graph es bastante simple, pero aun no se dónde subirlo. Si a alguien le interesa por favor avisar y vemos cómo lo comparto. 

Por ahora solo lo probé con volumenes Distribute y Distributed-Replicate, con las configuraciones que mostré por lo tanto es posible que falta depurar muchas cosas.

Saludos

No hay comentarios:

Publicar un comentario