Almacenamiento distribuido con glusterfs

Almacenamiento distribuido y persistente con contenedores Docker

A medida que nuestras aplicaciones van siendo más potentes y sobre todo tienen
que dar soporte a más usuario el crecimiento se complica. Por ello es necesario
que nuestra app esté diseñada para trabajar con microservicios.

Para que este diseño sea eficiente tendremos que tener en una ubicación aislada
todo lo que queramos almacenar de manera persistente ya que los contenedores
por definición son volátiles. Si nuestra herramienta permite incluir
avatares de nuestros usuarios, esto se deberían guardar en una ruta separada
del código, la cual le diremos a Docker que es una almacenamiento
persistente.

Puede que no hayas tenido todavía ningún problema con el almacenamiento
persistente
debido a que el uso que le das a los contenedores no necesiten
crear un cluster. Pero si estás ante este problema podemos ayudarte con la
solución.

El problema ocurre cuando tienes una máquina física o virtual no nos
proporciona el proceso suficiente y nuestra aplicación comienza a ir lenta.
Esto nos obliga a ampliar el hardware, pero siguiendo el principio de escalado
horizontal lo que haremos será incluir otra máquina u otras y crearemos un
cluster.

Almacenamiento interno

Como se ve en la imagen los contenedores tendrán acceso al almacenamiento sólo
a los volúmenes que estén en la misma máquina. Esto ocasionará una
inconsistencia en los datos y ocasionará, por ejemplo, que las imágenes de una
web se vean solo a veces.

Solución de sistemas.

La he llamado así porque sería un procedimiento que no tendría que ver con los
contenedores y simplemente nos valdríamos de una tecnología que permita
compartir por red el almacenamiento.

Para esta solución disponemos de algunas opciones, desde las más clásicas como
NFS, hasta las más modernas como GlusterFS

Con estos sistemas conseguimos separar el sistema de proceso (los host que
ejecutan los contenedores) del almacenamiento. Este sería un ejemplo con
NFS.

Almacenamiento distribuido con NFS

El almacenamiento con Glusterfs va un paso más allá y nos permite disponer
de nodos de almacenamiento que se pueden ir añadiendo para conseguir que el
almacenamiento también pueda escalar horizontalmente.

Almacenamiento distribuido con GlusterFS

Como montar el sistema GlusterFS.

El procedimiento es realmente sencillo y solo necesita de unos cuantos paquetes
y de una configuración sencilla. Tenemos que diferenciar entre nodos, que
constituirán el enjambre de almacenamiento y los clientes que usarán este
almacenamiento.

La creación del enjambre consta de la siguiente instalación en todos los nodos.

>_ # INSTALACION EN DEBIAN
>_ wget -O - http://download.gluster.org/pub/gluster/glusterfs/3.8/LATEST/rsa.pub | apt-key add -
>_ echo "deb http://download.gluster.org/pub/gluster/glusterfs/3.8/LATEST/Debian/stretch/apt stretch main" | sudo tee /etc/apt/sources.list.d/gluster.list
>_ sudo apt-get update && sudo apt-get install glusterfs-server

Ahora vamos a formatear una partición y crear un sistema de ficheros donde
vamos a montar la la ruta a compartir. El sistema de ficheros será de tipo XFS Al cual
se le supone ventajas entre ellas la gestión de volúmenes lógicos y su
ampliación o el sistema de journaling. De todas formas si ya tienes un
sistema de ficheros de otro tipo (por ejemplo ext4) o quieres crearlo de este
tipo no habría problema solo habría que ejecutar mkfs.ext4

>_ sudo mkfs.xfs -i size=512 /dev/sdb1
>_ sudo mkdir -p /data/datastore1
>_ # Ahora lo incluimos en fstab para montarlo al arranque
>_ echo ‘/dev/sdb1 /data/datastore1 xfs defaults 1 2’ >> /etc/fstab
>_ sudo mount -a && sudo mount
>_ # Arrancamos Glusterfs-server 
>_ service glusterd start
glusterd.service - LSB: glusterfs server
       Loaded: loaded (/etc/rc.d/init.d/glusterd)
   Active: active (running) since Mon, 13 Aug 2012 13:02:11 -0700; 2s ago
  Process: 19254 ExecStart=/etc/rc.d/init.d/glusterd start (code=exited, status=0/SUCCESS)
   CGroup: name=systemd:/system/glusterd.service
       ├ 19260 /usr/sbin/glusterd -p /run/glusterd.pid
       ├ 19304 /usr/sbin/glusterfsd --xlator-option georep-server.listen-port=24009 -s localhost...
       └ 19309 /usr/sbin/glusterfs -f /var/lib/glusterd/nfs/nfs-server.vol -p /var/lib/glusterd/...

Estos pasos los tendremos que ejecutar en todos los nodos que queramos incluir
en el enjambre. Suponiendo que tenemos 2 nodos ya funcionando vamos a unirlos
al enjambre.

1>_ # Probamos que tenemos acceso de uno a otro y viceversa.
1>_ sudo gluster peer probe server2
1>_ ssh server2
2>_ sudo gluster peer probe server1
1>_ # Vamos a crear el primer volumen llamado gv0
1>_ sudo mkdir -p /data/datastore1/gv0
1>_ sudo gluster volume create gv0 replica 2 server1:/data/datastore1/gv0 server2:/data/datastore1/gv0
1>_ sudo gluster start gv0

Ya tendríamos el volumen listo. Ahora solo tendríamos que montarlo en aquellos
nodos que vayan a usar los datos. Por ejemplo el nodo 1 y nodo 2. En ambos
tendríamos que instalar el glusterfs-client

>_ # INSTALACION EN DEBIAN
>_ wget -O - http://download.gluster.org/pub/gluster/glusterfs/3.8/LATEST/rsa.pub | apt-key add -
>_ echo "deb http://download.gluster.org/pub/gluster/glusterfs/3.8/LATEST/Debian/stretch/apt stretch main" | sudo tee /etc/apt/sources.list.d/gluster.list
>_ sudo apt-get update && sudo apt-get install glusterfs-client
>_ # Ahora montamos la carpeta volumes de Docker
>_ sudo mount -t glusterfs server1:/gv0 /var/lib/docker/volumes/

Repetimos el mismo paso en todos los nodos donde queramos disponer de este
almacenamiento y ya tendremos aislados los datos de manera persistente.

Uso de drivers de almacenamiento.

Aunque es una solución válida, Docker nos permite conectar con este y otros
tipos de almacenamientos distribuidos de manera “nativa”, mediante drivers de
almacenamiento.

Si mal no recuerdo, en julio de 2015 #14659 Docker incluyo oficialmente la
posibilidad de que la comunidad construyera sus propios plugins y ampliarán
las funciones de Docker. Los plugins podrían ampliar las topologías de red,
el sistema de almacenamiento o los permisos.

Gracias a estas funciones se abrió un mundo de posibilidades. Podremos cambiar
el comportamiento de Docker y hacer que conviva con otras tecnologías que
no incluía inicialmente.

Dado que el uso de plugins daría para escribir uno o varios post, nos vamos
a centrar en los plugins de almacenamiento. Y si vamos a la documentación
oficial de plugs de almacenamiento para Docker nos encontraremos que
actualmente tenemos 25 tipos distintos de almacenamiento. Seguramente haya
muchos más ya que la web no recoge todos los datos, además de que cualquiera
puede hacer un plugin.

Plugin Description
Azure File Storage plugin Lets you mount Microsoft Azure File Storage shares to Docker containers as volumes using the SMB 3.0 protocol. Learn more.
Blockbridge plugin A volume plugin that provides access to an extensible set of container-based persistent storage options. It supports single and multi-host Docker environments with features that include tenant isolation, automated provisioning, encryption, secure deletion, snapshots and QoS.
Contiv Volume Plugin An open source volume plugin that provides multi-tenant, persistent, distributed storage with intent based consumption. It has support for Ceph and NFS.
Convoy plugin A volume plugin for a variety of storage back-ends including device mapper and NFS. It’s a simple standalone executable written in Go and provides the framework to support vendor-specific extensions such as snapshots, backups and restore.
DRBD plugin A volume plugin that provides highly available storage replicated by DRBD. Data written to the docker volume is replicated in a cluster of DRBD nodes.
Flocker plugin A volume plugin that provides multi-host portable volumes for Docker, enabling you to run databases and other stateful containers and move them around across a cluster of machines.
gce-docker plugin A volume plugin able to attach, format and mount Google Compute persistent-disks.
GlusterFS plugin A volume plugin that provides multi-host volumes management for Docker using GlusterFS.
Horcrux Volume Plugin A volume plugin that allows on-demand, version controlled access to your data. Horcrux is an open-source plugin, written in Go, and supports SCP, Minio and Amazon S3.
HPE 3Par Volume Plugin A volume plugin that supports HPE 3Par and StoreVirtual iSCSI storage arrays.
IPFS Volume Plugin An open source volume plugin that allows using an ipfs filesystem as a volume.
Keywhiz plugin A plugin that provides credentials and secret management using Keywhiz as a central repository.
Local Persist Plugin A volume plugin that extends the default local driver’s functionality by allowing you specify a mountpoint anywhere on the host, which enables the files to always persist, even if the volume is removed via docker volume rm.
NetApp Plugin (nDVP) A volume plugin that provides direct integration with the Docker ecosystem for the NetApp storage portfolio. The nDVP package supports the provisioning and management of storage resources from the storage platform to Docker hosts, with a robust framework for adding additional platforms in the future.
Netshare plugin A volume plugin that provides volume management for NFS 3/4, AWS EFS and CIFS file systems.
OpenStorage Plugin A cluster-aware volume plugin that provides volume management for file and block storage solutions. It implements a vendor neutral specification for implementing extensions such as CoS, encryption, and snapshots. It has example drivers based on FUSE, NFS, NBD and EBS to name a few.
Portworx Volume Plugin A volume plugin that turns any server into a scale-out converged compute/storage node, providing container granular storage and highly available volumes across any node, using a shared-nothing storage backend that works with any docker scheduler.
Quobyte Volume Plugin A volume plugin that connects Docker to Quobyte’s data center file system, a general-purpose scalable and fault-tolerant storage platform.
REX-Ray plugin A volume plugin which is written in Go and provides advanced storage functionality for many platforms including VirtualBox, EC2, Google Compute Engine, OpenStack, and EMC.
Virtuozzo Storage and Ploop plugin A volume plugin with support for Virtuozzo Storage distributed cloud file system as well as ploop devices.
VMware vSphere Storage Plugin Docker Volume Driver for vSphere enables customers to address persistent storage requirements for Docker containers in vSphere environments.

Como vemos en la tabla tenemos de todo tipo, desde los servicios Saas como
Amazon AWS o Google Cloud hasta los sistemas de ficheros nativos de linux como
Convoy o Flocker.

Funcionamiento del plugin.

Básicamente, Docker permite desde el acceso de desde el mismo u otros hosts
al daemon Docker. Usando sockets unix accederemos al API de Docker y
podremos extender el funcionamiento del mismo.

Los plugins requieren de los siguientes ficheros:

  • .sock socket unix del plugin.
  • .spec contiene la url del socket local o la conexión tcp a otro servidor.
  • .json fichero con la especificación del plugin/ Ejemplo de fichero de plugin json/
    {
    “Name”: “plugin-example”,
    “Addr”: “https://example.com/docker/plugin”,
    “TLSConfig”: {
    “InsecureSkipVerify”: false,
    “CAFile”: “/usr/shared/docker/certs/example-ca.pem”,
    “CertFile”: “/usr/shared/docker/certs/example-cert.pem”,
    “KeyFile”: “/usr/shared/docker/certs/example-key.pem”,
    }
    }

No voy a profundizar más en esto pero siguieres saber todo sobre los plugins
puedes visitar la documentación en github de docker.

Ejemplo con DRBD

Como ya hemos dicho hay muchos plugin pero uno de los que más me gusta el
sistema de DRBD. Este es un sistema de almacenamiento de alta
disponibilidad y redundado con un enfoque totalmente cloud.

Aunque es verdad que mi opción personal, de sistema de ficheros el
Glusterfs pero su plugin para Docker ha sido abandonado lo cual descarta
totalmente su uso o al menos de momento.

La instalación de DRBD es relativamente sencilla, y si usamos Ubuntu,
todavía más.

Añadimos el repositorio:

>_ sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
>_ sudo apt-get update

Ahora suponiendo que tenemos un nodo destinado únicamente a almacenamiento
instalaremos el sistema de DRBD:

>_ sudo apt-get install drbd-utils python-drbdmanage drbd-dkms

Una vez instalado crearemos el pool LVM.

>_ sudo vgcreate drbdpool /dev/sdb1

drbdpool es el nombre por defecto, se puede cambiar por otro pero hay que
modificar también la configuración.

El segundo paso es definir cual va ser la IP que va a tener el nodo. Esta ip
será accesible por otros nodos o por aquellos que necesiten hacer uso de
datos.

>_ sudo drbdmanage init 10.43.100.2

Una de las ventajas que tiene el sistema es que como Glusterfs podemos
añadir nodos de manera sencilla y con una simple orden se adiaren al cluster.

>_ sudo drbdmanage add-node nodo2 10.43.100.3

Para nuestra toma de contacto solo usaremos un nodo. Además DRBD cuenta con
múltiples topologías que aportan una gran versatilidad.

Con esto ya tendríamos lo mínimo para disponer de nuestro nodo de
almacenamiento. Ahora vamos a instalar el plugin en los nodos que albergarán
los contenedores.

>_ sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
>_ sudo apt-get update
>_ sudo apt-get install drbdmanage-docker-volume

Una vez instalado el plugin ya podremos crear volumenes sin la necesidad de
usar el comando drbdmanage y utilizaremos los comandos de Docker.

>_ docker volume create -d drbdmanage --name=dockervolume

Podremos verificar con drbdmanage que se ha creado el volumen.

>_ sudo drbdmanage list-resources
+----------------------------------------------+
| Name           |                    | State  |
+----------------------------------------------+
| dockervolume   |                    |    OK  |
+----------------------------------------------+

Ahora podemos arrancar la aplicación y usar el nuevo volumen para almacenar las
imágenes de los usuarios.

>_ docker run --name wordpress \
-v dockervolume:/var/www/html/wp-content/uploads \
-p 80:80 wordpress:latest

Ahora todas las subidas que realicemos a nuestro wordpress tendrán persistencia
y aunque eliminemos el contenedor y lo arrancásemos en otro nodo dispondremos
de los datos.

Como puedes ver descentralizar el almacenamiento es fundamental para disponer
de una escalabilidad horizontal. Esto a menudo es un quebradero de cabeza para
los especialistas en sistemas. Pero con la llegada de Docker la complejidad
se reduce mucho y todo se hace más “mágico”.

Y hasta aquí mi pequeña aportación sobre el almacenamiento persistente y
distribuido. Espero que te aporte ideas o trucos para que puedas disponer de
esta tecnología.

Gracias por leernos y si te ha gustado compártelo en las redes sociales.

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *