MogileFS, sistema de ficheros distribuido a través de la red

MogileFS es un sistema de ficheros distribuido que funciona en activo-activo o dicho de otra forma, es un RAID a través de la red. Algunas de sus características:

  • No requiere de ningún parche en kernel ni módulos especiales ya que funciona completamente a nivel de aplicación.

  • No hay ningún SPOF(single point of failure) ya que todos los elementos que forman MogileFS pueden estar distribuidos en múltiples máquinas.

  • Se pueden especificar clases de ficheros. Las clases definirán cuantas réplicas pueden llegar a tener. Por ejemplo, un fichero de log poco importante puede ser suficiente con dos réplicas, pero los datos bancarios de la empresa necesita 10 réplicas. Dependiendo de la clase, MogileFS hará automáticamente las réplicas que sea necesario.

  • No importa el sistema de ficheros que tengamos debajo. Puede ser Ext3, Ext4, XFS…

Está compuesto por varios componentes, cada uno de los cuales puede estár en diferentes máquinas y replicado tantas veces como quieras:

  • Base de datos: MySQL 😉 Se almacenan los metadatos y los namespaces y debería estar en HA o tendremos un punto de fallo.

  • Tracker (mogilefsd): es el proceso encargado de recibir las peticiones del cliente y gestionarlas.

  • Nodos de almacenamiento (mogstored): donde los datos se guardan físicamente. Estos nodos son simplemente servidores HTTP que recibe peticiones PUT, GET, DELETE

Vamos con la instalación 😉

1- Instalar dependencias:

 # apt-get install debhelper dpkg-dev fakeroot
 # apt-get install libio-aio-perl libdanga-socket-perl libnet-netmask-perl libstring-crc32-perl
 # apt-get install gearman-server libgearman-client-perl libgearman-client-async-perl

2- Instalar perlbal:

 # cd /usr/src
 # svn co http://code.sixapart.com/svn/perlbal
 # cd perlbal/trunk
 # dpkg-buildpackage -rfakeroot
 # dpkg -i ../libperlbal-perl_1.70-1_all.deb

3- Instalar mogileFS:

 # cd /usr/src
 # svn co http://code.sixapart.com/svn/mogilefs
 # cd mogilefs/trunk
 # bin/build-all-debian.sh
 # dpkg -i ./api/perl/libmogilefs-perl_1.00-1_all.deb
 # bin/build-all-debian.sh
 # dpkg -i packages/mogilefsd_1.00-2_all.deb packages/mogilefs-utils_0.01-1_all.deb packages/mogstored_1.00-2_all.deb

4- Crear base de datos:

 $ mysql -u root -p
  mysql> create database mogilefs;
  mysql> grant all on mogilefs.* to 'mogile'@'%' identified by 'mogilepw';
  mysql> flush privileges;
  mysql> quit

5- Crear esquema:

 $ /usr/bin/mogdbsetup --yes --dbname=mogilefs --dbuser=mogile --dbpassword=mogilepw

Al menos tiene que existir un tracker, se puede configurar en el mismo nodo de storage:

zimbra:/var/mogdata# cat /etc/mogilefs/mogilefsd.conf 
\#daemonize = 1
\# Database connection information
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogile
db_pass = mogilepw
\# IP😛ORT to listen on for mogilefs client requests
listen = 127.0.0.1:7001
\# Optional, if you don't define the port above.
conf_port = 7001
\# Number of query workers to start by default.
query_jobs = 10
\# Number of delete workers to start by default.
delete_jobs = 1
\# Number of replicate workers to start by default.
replicate_jobs = 5
\# Number of reaper workers to start by default.
\# (you don't usually need to increase this)
reaper_jobs = 1
\# Number of fsck workers to start by default.
\# (these can cause a lot of load when fsck'ing)
\#fsck_jobs = 1
\# Minimum amount of space to reserve in megabytes
\# default: 100
\# Consider setting this to be larger than the largest file you
\# would normally be uploading.
\#min_free_space = 200
\# Number of seconds to wait for a storage node to respond.
\# default: 2
\# Keep this low, so busy storage nodes are quickly ignored.
\#node_timeout = 2
\# Allow replication to use the secondary node get port,
\# if you have apache or similar configured for GET's
\#repl_use_get_port = 1

Una vez hecho, se añaden los hosts de almacenamiento:

mogadm --trackers=127.0.0.1:7001 host add hostmolon1 --ip=10.10.0.122 --port 7500 --status=alive
mogadm --trackers=127.0.0.1:7001 host add hostmolon2 --ip=10.10.0.122 --port 7500 --status=alive

Se listan para ver si es correcto:

zimbra:/var/mogdata# mogadm --trackers=127.0.0.1:7001 host list
hostmolon1 [1]: alive
  IP: 127.0.0.1:7500

hostmolon2 [2]: alive
  IP: 10.10.0.122:7500

Se añaden los dispositivos de almacenamiento:

mogadm --trackers=127.0.0.1:7001 device add hostmolon1 1
mogadm --trackers=127.0.0.1:7001 device add hostmolon2 2

El último valor es el id, por lo tanto en hostmolon1 habrá que crear la carpeta:

/var/mogdata/dev1/

y en hostmolon2:

/var/mogdata/dev2/

El propietario de la carpeta tiene que ser “mogstored”. Generalmente lo que se suele hacer es montar discos duros sata directamente en dichas carpetas.

Comprobamos que tira:

zimbra:/var/mogdata# mogadm --trackers=127.0.0.1:7001 device list
hostmolon1 [1]: alive
                   used(G) free(G) total(G)
  dev1: alive 1.539 5.567 7.106 

hostmolon2 [2]: alive
                   used(G) free(G) total(G)
 dev2: alive 2.502 4.604 7.106

Para poder catalogar los ficheros es necesario definir dos cosas, dominios y clases. El dominio sería como una separación de un grupo de ficheros. El dominio a su vez puede tener definido un número n de clases.

mogadm --trackers=127.0.0.1:7001 domain add irontec
mogadm --trackers=127.0.0.1:7001 class add irontec miclase

Y ya podemos añadir ficheros. Estos se deben gestionar mediante API, ya sea con PHP, Python o cualquier otro que nos guste más. Esto es así porque los ficheros no se escriben en la carpeta como si se tratase de un sistema de ficheros normal, si no que hay que hacerlo a través de un tracker para que este se encarge de las réplicas. Nosotros, en lugar de hacer uso de estas APIs, tiraremos de la herramienta de consola mogtool.

mogtool inject /boot/vmlinuz-2.6.26-2-686 vmlinuz --trackers=127.0.0.1:7001 --domain=irontec

Buscarlos:

zimbra:/var/mogdata# mogtool locate vmlinuz --trackers=127.0.0.1:7001 --domain=irontec
http://127.0.0.1:7500/dev2/0/000/000/0000000005.fid [^]
http://10.10.0.122:7500/dev10/0/000/000/0000000005.fid [^]
0000002 paths found

Y extraerlos:

zimbra:/var/mogdata# mogtool extract vmlinuz /tmp/test --trackers=127.0.0.1:7001 --domain=irontec
Fetching piece 1...
        Trying http://10.10.0.122:7500/dev10/0/000/000/0000000005.fid... [^]
Done.
zimbra:/var/mogdata# md5sum /tmp/test /boot/vmlinuz-2.6.26-2-686 
f6690b230573b7f791e84c33adf0804c /tmp/test
f6690b230573b7f791e84c33adf0804c /boot/vmlinuz-2.6.26-2-686

Todo esto tiene una mejora importante sobre los RAID por software o hardware. El RAID por si mismo te salva si se rompe alguno de los discos, ¿pero que pasa si se rompe el servidor? 😉 Nada mejor que un RAID distribuido a través de la red para evitar estos problemas.


Comments

    No se mucho, por no decir nada de Postgres, pero mogileFS es un sistema de ficheros distribuidos y lo puedes usar para múltiples aplicaciones o servicios. No tiene un único objetivo ni una lista de aplicaciones compatibles, su uso debe ser transparente para el servicio que lo use.

    Miguel Ángel Nieto on

    Puedo usar esta aplicación con Postgres 9.1?

    Archy on