Almacenamiento LINSTOR e integración con OpenNebula

Almacenamiento LINSTOR e integración con OpenNebula

No hace mucho, los chicos de LINBIT presentaron su nueva solución SDS: Linstor. Este es un almacenamiento completamente libre, basado en tecnologías probadas: DRBD, LVM, ZFS. Linstor combina simplicidad y una arquitectura bien desarrollada, lo que permite lograr estabilidad y resultados bastante impresionantes.

Hoy me gustaría hablar un poco más sobre él y mostrar lo fácil que es integrarlo con OpenNebula utilizando linstor_un, un nuevo controlador que desarrollé específicamente para este propósito.

Linstor, junto con OpenNebula, permite construir una nube rápida y confiable, que se puede desplegar sin problemas en la infraestructura propia.

Arquitectura de Linstor

Linstor no es ni un sistema de archivos ni un almacenamiento de bloques por sí solo; Linstor es un orquestador que proporciona una capa de abstracción que permite automatizar la creación de volúmenes en LVM o ZFS y replicarlos utilizando DRBD9.

Rompiendo estereotipos

Pero espera, ¿DRBD? — ¿Por qué automatizarlo y cómo puede funcionar esto en realidad?

Recordemos el pasado, cuando DRBD8 era muy popular. Su uso estándar implicaba crear un gran dispositivo de bloque y dividirlo en muchos pequeños trozos utilizando el mismo LVM. Una especie de RAID-1 con mdadm pero con replicación a través de la red.

Este enfoque no está exento de desventajas, y por eso, con la llegada de DRBD9, los principios de construcción del almacenamiento han cambiado; ahora se crea un dispositivo DRBD separado para cada máquina virtual.

El enfoque con dispositivos de bloque independientes permite una mejor utilización del espacio en el clúster, así como también añade una serie de funcionalidades adicionales. Por ejemplo, se puede definir la cantidad de réplicas para cada uno de estos dispositivos, su ubicación y configuraciones individuales. Es fácil crear/eliminar, hacer instantáneas, cambiar el tamaño, habilitar cifrado y mucho más. Cabe señalar que DRBD9 también soporta quórum, lo que evita situaciones de split-brain.

Recursos y backends

Al crear un nuevo dispositivo de bloque, Linstor coloca el número necesario de réplicas en diferentes nodos del clúster. Cada una de estas réplicas vamos a llamarla recurso DRBD.

Los recursos son de dos tipos:

  • Recurso de datos — representan un dispositivo DRBD ubicado en un nodo en un pool de LVM o ZFS.
    Actualmente, hay soporte para varios backends y su número está en constante crecimiento. Se admite LVM, ThinLVM y ZFS. Los últimos dos permiten crear y utilizar instantáneas.
  • Recurso sin disco — es un dispositivo DRBD situado en un nodo sin backend, pero que permite interactuar con él como si fuera un dispositivo de bloque normal; todas las operaciones de lectura/escritura se redirigirán a los recursos de datos. El análogo más cercano a los recursos sin disco es el LUN de iSCSI.

Cada recurso DRBD puede tener hasta 8 réplicas, y solo una de ellas puede estar activa por defecto — Primario, todas las demás serán Secundarias y su uso será imposible mientras haya al menos un Primario, es decir, simplemente replicarán datos entre sí.

Al montar un dispositivo DRBD en el sistema, se convierte automáticamente en Primario, por lo que incluso un recurso sin disco, en la terminología de DRBD, puede ser Primario.

¿Entonces, para qué sirve Linstor?

Al confiar todas las tareas intensivas en recursos al núcleo, Linstor es esencialmente una aplicación Java común que permite automatizar sin esfuerzo la creación de recursos DRBD.
Cada recurso creado por él será un clúster DRBD independiente que funciona de forma autónoma, sin importar el estado del plano de control y de otros recursos DRBD.

Linstor consta de solo dos componentes:

  • Linstor-controller — El controlador principal que proporciona una API para crear y gestionar recursos. También se comunica con los satélites, comprobando el espacio libre en ellos, y envía tareas para crear y eliminar nuevos recursos. Se ejecuta en una única instancia y utiliza una base de datos que puede ser interna (H2) o externa (PostgreSQL, MySQL, MariaDB).
  • Linstor-satellite — Se instala en todos los nodos de almacenamiento y proporciona al controlador información sobre el espacio libre, así como ejecuta tareas recibidas del controlador para crear y eliminar nuevos volúmenes y dispositivos DRBD sobre ellos.

Linstor opera con los siguientes conceptos clave:

  • Nodo — un servidor físico donde se crearán y utilizarán los recursos DRBD.
  • Grupo de Almacenamiento — un grupo LVM o ZFS creado en un nodo donde se alojarán los recursos DRBD. También es posible un grupo sin disco: un grupo en el que solo se alojarán recursos sin disco.
  • Definición de Recurso — Definición del recurso, que en esencia es un prototipo que describe el nombre y todas sus propiedades.
  • Definición del Volumen — Definición del volumen. Cada recurso puede constar de varios volúmenes, y cada volumen debe tener un tamaño.
  • Recurso — Instancia creada de un dispositivo de bloques, cada recurso debe estar alojado en un nodo específico y en algún grupo de almacenamiento.

Instalación de Linstor

Como sistema, recomiendo usar Ubuntu, ya que existe un PPA preparado:

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

O Debian, donde Linstor se puede instalar desde el repositorio oficial para Proxmox:

wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add -
PVERS=5 && echo "deb http://packages.linbit.com/proxmox/ proxmox-$PVERS drbd-9.0" > 
    /etc/apt/sources.list.d/linbit.list
apt-get update

Controlador

Aquí es muy sencillo:

apt-get install linstor-controller linstor-client
systemctl enable linstor-controller
systemctl start linstor-controller

Nodos de almacenamiento

En este momento, el núcleo de Linux incluye el módulo del núcleo in-tree DRBD8, desafortunadamente no nos sirve y necesitamos instalar DRBD9:

apt-get install drbd-dkms

La práctica muestra que la mayoría de las complicaciones surgen cuando el módulo DRBD8 está cargado en el sistema, y no DRBD9. Afortunadamente, esto se puede verificar fácilmente ejecutando:

modprobe drbd
cat /proc/drbd

Si ves version: 9 — entonces todo está bien, si version: 8 — significa que algo salió mal y necesitas tomar medidas adicionales para investigar las causas.

Ahora instalaremos linstor-satellite y drbd-utils:

apt-get install linstor-satellite drbd-utils
systemctl enable linstor-satellite
systemctl start linstor-satellite

Creación del clúster

Grupos de almacenamiento y nodos

Como backend, utilizaremos ThinLVM, ya que es el más simple y admite instantáneas.
Instala lvm2, si aún no lo has hecho, y vamos a crear un grupo ThinLVM en todos nuestros nodos de almacenamiento:

sudo vgcreate drbdpool /dev/sdb
sudo lvcreate -L 800G -T drbdpool/thinpool

Todas las acciones posteriores pueden llevarse a cabo directamente en el controlador:

Agreguemos nuestros nodos:

linstor node create node1 127.0.0.11
linstor node create node2 127.0.0.12
linstor node create node3 127.0.0.13

Crearemos grupos de almacenamiento:

linstor storage-pool create lvmthin node1 data drbdpool/thinpool
linstor storage-pool create lvmthin node2 data drbdpool/thinpool
linstor storage-pool create lvmthin node3 data drbdpool/thinpool

Ahora verifica los grupos creados:

linstor storage-pool list

Si todo se realizó correctamente, deberíamos ver algo como:

+-------------------------------------------------------------------------------------------------------+
| StoragePool | Node  | Driver   | PoolName          | FreeCapacity | TotalCapacity | SupportsSnapshots |
|-------------------------------------------------------------------------------------------------------|
| data        | node1 | LVM_THIN | drbdpool/thinpool |       64 GiB |        64 GiB | true              |
| data        | node2 | LVM_THIN | drbdpool/thinpool |       64 GiB |        64 GiB | true              |
| data        | node3 | LVM_THIN | drbdpool/thinpool |       64 GiB |        64 GiB | true              |
+-------------------------------------------------------------------------------------------------------+

Recursos de DRBD

Ahora intentemos crear nuestro nuevo recurso DRBD:

linstor resource-definition create myres
linstor volume-definition create myres 1G
linstor resource create myres --auto-place 2

Verifiquemos los recursos creados:

linstor resource list 

+------------------------------------------------------------------------------------------------------+
| Node  | Resource | StoragePool | VolumeNr | MinorNr | DeviceName    | Allocated  | InUse  |    State |
|------------------------------------------------------------------------------------------------------|
| node1 | myres    | data        | 0        | 1084    | /dev/drbd1084 | 52 KiB     | Unused | UpToDate |
| node2 | myres    | data        | 0        | 1084    | /dev/drbd1084 | 52 KiB     | Unused | UpToDate |
+------------------------------------------------------------------------------------------------------+

¡Excelente! — vemos que el recurso se creó en los primeros dos nodos, también podemos intentar crear un recurso sin disco en el tercero:

linstor resource create --diskless node3 myres

En los nodos siempre encontrarán este dispositivo como /dev/drbd1084 o /dev/drbd/by-res/myres/0

Así es como funciona Linstor, pueden obtener más información de documentación oficial.

Ahora les contaré cómo integrarlo con OpenNebula

Configuración de OpenNebula

No me profundizaré demasiado en el proceso de configuración de OpenNebula, ya que todos los pasos están detalladamente descritos en documentación oficial, que les recomiendo consultar, solo hablaré sobre la integración de OpenNebula con Linstor.

linstor_un

Para resolver esta tarea, escribí mi propio controlador — linstor_un, actualmente está disponible como plugin y debe instalarse por separado.

Toda la instalación se lleva a cabo en los nodos frontend de OpenNebula y no requiere acciones adicionales en los nodos de cómputo.

Lo primero que necesitamos es asegurarnos de que tenemos jq y linstor-client:

apt-get install jq linstor-client

Comando linstor node list debe mostrar la lista de nodos. Todos los nodos de cómputo de OpenNebula deben estar añadidos al clúster de Linstor.

Descarguemos e instalemos el plugin:

curl -L https://github.com/OpenNebula/addon-linstor_un/archive/master.tar.gz | tar -xzvf - -C /tmp

mv /tmp/addon-linstor_un-master/vmm/kvm/* /var/lib/one/remotes/vmm/kvm/

mkdir -p /var/lib/one/remotes/etc/datastore/linstor_un
mv /tmp/addon-linstor_un-master/datastore/linstor_un/linstor_un.conf /var/lib/one/remotes/etc/datastore/linstor_un/linstor_un.conf

mv /tmp/addon-linstor_un-master/datastore/linstor_un /var/lib/one/remotes/datastore/linstor_un
mv /tmp/addon-linstor_un-master/tm/linstor_un /var/lib/one/remotes/tm/linstor_un

rm -rf /tmp/addon-linstor_un-master

Ahora necesitamos agregarlo al config de OpenNebula, para ello realizamos unos sencillos pasos descritos aquí.

Después reiniciaremos OpenNebula:

systemctl restart opennebula

Y agregaremos nuestros datastores, el del sistema:

cat > system-ds.conf <<EOT
NAME="linstor-system"
TYPE="SYSTEM_DS"
STORAGE_POOL="data"
AUTO_PLACE="2"
CLONE_MODE="snapshot"
CHECKPOINT_AUTO_PLACE="1"
BRIDGE_LIST="node1 node2 node3"
TM_MAD="linstor_un"
EOT

onedatastore create system-ds.conf

Y el almacenamiento de imágenes:

cat > images-ds.conf <<EOT
NAME="linstor-images"
TYPE="IMAGE_DS"
STORAGE_POOL="data"
AUTO_PLACE="2"
BRIDGE_LIST="node1 node2 node3"
DISK_TYPE="BLOCK"
DS_MAD="linstor_un"
TM_MAD="linstor_un"
EOT

onedatastore create images-ds.conf

  • Parámetro AUTO_PLACE representa la cantidad de réplicas de datos que se crearán para cada nueva imagen en OpenNebula.
  • Parámetro CLONE_MODE indica cómo se clonarán las imágenes al crear nuevas máquinas virtuales, snapshot — creará un snapshot de la imagen y desplegará la máquina virtual desde el snapshot, copy — hará una copia completa de la imagen para cada máquina virtual.
  • En BRIDGE_LIST se recomienda indicar todos los nodos que se utilizarán para realizar operaciones de clonación de imágenes.

La lista completa de parámetros soportados se encuentra en README del proyecto.

Con esto la configuración está completa, ahora puedes cargar algún appliance del oficial OpenNebula Marketplace y crear máquinas virtuales a partir de él.

Enlace al proyecto:
https://github.com/OpenNebula/addon-linstor_un

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster