De qué hablaremos:
Cómo desplegar rápidamente un almacenamiento compartido para dos servidores utilizando soluciones drbd+ocfs2.
A quién puede ser útil:
Este tutorial será útil para administradores de sistemas y para aquellos que buscan una forma de implementar almacenamiento o quieren probar la solución.
De qué soluciones nos hemos despedido y por qué
A menudo nos encontramos con la situación de tener que implementar un almacenamiento compartido en un pequeño clúster web con un buen rendimiento de lectura y escritura. Hemos probado varias opciones para implementar almacenamiento compartido para nuestros proyectos, pero pocas lograron satisfacernos en varios aspectos. Ahora explicaremos por qué.
- Glusterfs no nos convenció por su rendimiento en lectura y escritura, surgieron problemas con la lectura simultánea de un gran número de archivos, lo que generó alta carga en la CPU. El problema de lectura de archivos podría resolverse accediendo a ellos directamente en los bricks, pero no siempre es viable y, en general, es incorrecto.
- Ceph no nos gustó por su complejidad excesiva, que puede ser perjudicial en proyectos con 2-4 servidores, especialmente si el proyecto es más adelante mantenido. Además, existen serias limitaciones de rendimiento que obligan a construir clústeres de almacenamiento separados, al igual que con Glusterfs.
- El uso de un solo servidor NFS para implementar almacenamiento compartido plantea dudas en términos de disponibilidad.
- s3 es una excelente solución popular para ciertos tipos de tareas, pero no es un sistema de archivos, lo que limita su área de aplicación.
- lsyncd. Si ya hemos comenzado a hablar de "no-sistemas de archivos", vale la pena mencionar esta solución popular. Además de que no es adecuada para intercambio bidireccional (aunque si realmente lo deseas, se puede hacer), tampoco funciona de manera estable con un gran número de archivos. Un punto a favor es que es de un solo hilo. La razón está en la arquitectura del programa: utiliza inotify para monitorear objetos de trabajo, los cuales se asocian al iniciarlo y al reescaneado. Se utiliza rsync como medio de transferencia.
Tutorial: cómo desplegar un almacenamiento compartido basado en drbd+ocfs2
Una de las soluciones más convenientes para nosotros ha sido la combinación ocfs2+drbd. Ahora explicaremos cómo se puede desplegar rápidamente un almacenamiento compartido para dos servidores sobre la base de soluciones de datos. Pero primero, un poco sobre los componentes:
DRBD — un sistema de almacenamiento que se incluye por defecto en Linux, que permite replicar datos entre servidores en bloques. Su principal aplicación es en la construcción de almacenes de alta disponibilidad.
OCFS2 — un sistema de archivos que permite el uso compartido de un mismo almacenamiento por varios sistemas. Se incluye en la distribución de Linux y consiste en un módulo del kernel y herramientas de espacio de usuario para trabajar con el sistema de archivos. OCFS2 se puede usar no sólo sobre DRBD, sino también sobre iSCSI con múltiples conexiones. En nuestro ejemplo, estamos utilizando DRBD.
Todas las acciones se realizan en Ubuntu Server 18.04 con una configuración mínima.
Paso 1. Configuramos DRBD:
En el archivo /etc/drbd.d/drbd0.res describimos nuestro dispositivo de bloque virtual /dev/drbd0:
resource drbd0 {
syncer { rate 1000M; }
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
startup { become-primary-on both; }
on drbd1 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.192:7789;
}
on drbd2 {
meta-disk internal;
device /dev/drbd0;
disk /dev/vdb1;
address 10.10.10.193:7789;
}
} meta-disk internal — usar los mismos dispositivos de bloque para almacenar los metadatos
device /dev/drbd0 — usar /dev/drbd0 como la ruta hacia drbd.
disk /dev/vdb1 — usar /dev/vdb1
syncer { rate 1000M; } — usar un ancho de banda de canal de gigabit
allow-two-primaries — una opción importante que permite realizar cambios en dos servidores primarios
after-sb-0pri, after-sb-1pri, after-sb-2pri — opciones que determinan las acciones del nodo al detectar un split-brain. Se puede consultar más en la documentación.
become-primary-on both — establece ambos nodos como primarios.
En nuestro caso, tenemos dos VM idénticas, con una red virtual dedicada con un ancho de banda de 10 gigabits.
En nuestro ejemplo, los nombres de red de los dos nodos del clúster son drbd1 y drbd2. Para un funcionamiento correcto, es necesario mapear en /etc/hosts los nombres y las direcciones IP de los nodos.
10.10.10.192 drbd1
10.10.10.193 drbd2Paso 2. Configuramos los nodos:
En ambos servidores ejecutamos:
drbdadm create-md drbd0 
modprobe drbd
drbdadm up drbd0
cat /proc/drbdObtenemos lo siguiente:

Se puede iniciar la sincronización. En el primer nodo se debe ejecutar:
drbdadm primary --force drbd0Verificamos el estado:
cat /proc/drbd 
Excelente, la sincronización ha comenzado. Esperamos a que termine y vemos el resultado:

Paso 3. Iniciamos la sincronización en el segundo nodo:
drbdadm primary --force drbd0
Obtenemos lo siguiente:

Ahora podemos escribir en drbd desde ambos servidores.
Paso 4. Instalación y configuración de ocfs2.
Utilizaremos una configuración bastante trivial:
cluster:
node_count = 2
name = ocfs2cluster
node:
number = 1
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.192
name = drbd1
node:
number = 2
cluster = ocfs2cluster
ip_port = 7777
ip_address = 10.10.10.193
name = drbd2
Debemos escribirlo en /etc/ocfs2/cluster.conf ambos nodos.
Creamos un sistema de archivos en drbd0 en cualquier nodo:
mkfs.ocfs2 -L "testVol" /dev/drbd0
Aquí hemos creado un sistema de archivos con la etiqueta testVol en drbd0, utilizando los parámetros por defecto.

En /etc/default/o2cb es necesario establecer (como en nuestro archivo de configuración)
O2CB_ENABLED=true
O2CB_BOOTCLUSTER=ocfs2cluster y ejecutar en cada nodo:
o2cb register-cluster ocfs2clusterDespués activamos y añadimos al inicio automático todas las unidades necesarias:
systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2Parte de esto ya se estará ejecutando durante la configuración.
Paso 5. Agregamos puntos de montaje en fstab en ambos nodos:
/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0El directorio /media/shared debe ser creado de antemano.
Aquí usamos las opciones noauto, que significa que el sistema de archivos no se montará al inicio (prefiero montar sistemas de archivos de red a través de systemd) y heartbeat=local, que indica el uso del servicio heartbeat en cada nodo. También existe heartbeat global, que es más adecuado para clústeres grandes.
A continuación, se puede montar /media/shared y verificar la sincronización del contenido.
¡Listo! Como resultado, obtenemos un almacenamiento relativamente tolerante a fallos con capacidad de escalado y un rendimiento decente.
Fuente: habr.com
