Almacenamiento en clúster para pequeños clústeres web basados ​​en drbd+ocfs2

De qué hablaremos:
Cómo implementar rápidamente almacenamiento compartido para dos servidores basado en soluciones drbd+ocfs2.

Para quién será útil:
El tutorial será útil para los administradores de sistemas y para cualquiera que elija un método de implementación de almacenamiento o quiera probar la solución.

¿Qué decisiones rechazamos y por qué?

A menudo nos enfrentamos a una situación en la que necesitamos implementar almacenamiento compartido con buen rendimiento de lectura y escritura en un pequeño clúster web. Probamos varias opciones para implementar almacenamiento compartido para nuestros proyectos, pero pocas lograron satisfacernos en varios indicadores a la vez. Ahora te contamos por qué.

  • Glusterfs no nos satisfizo con el rendimiento de lectura y escritura, hubo problemas con la lectura simultánea de una gran cantidad de archivos y hubo una gran carga en la CPU. El problema con la lectura de archivos podría resolverse accediendo a ellos directamente desde el bloque, pero esto no siempre es aplicable y generalmente es incorrecto.

  • A Ceph no le gustó la excesiva complejidad, que puede ser perjudicial en proyectos con 2-4 servidores, especialmente si el proyecto se mantiene posteriormente. Nuevamente, existen serias limitaciones de rendimiento que nos obligan a crear clústeres de almacenamiento separados, como ocurre con glusterfs.

  • El uso de un servidor NFS para implementar almacenamiento compartido plantea dudas en términos de tolerancia a fallos.

  • s3 es una excelente solución popular para una determinada gama de tareas, pero no es un sistema de archivos, lo que limita su alcance.

  • lsyncd. Si ya hemos empezado a hablar de "sistemas que no son de archivos", entonces vale la pena repasar esta popular solución. No sólo no es adecuado para el intercambio bidireccional (sino que si realmente lo desea, puede hacerlo), sino que tampoco funciona de manera estable con una gran cantidad de archivos. Una buena adición a todo esto es que es de un solo subproceso. La razón está en la arquitectura del programa: utiliza inotify para monitorear los objetos de trabajo, que asigna al inicio y durante el nuevo escaneo. rsync se utiliza como medio de transferencia.

Tutorial: cómo implementar almacenamiento compartido basado en drbd+ocfs2

Una de las soluciones más convenientes para nosotros fue el enlace ocfs2+drbd. Ahora le diremos cómo puede implementar rápidamente almacenamiento compartido para dos servidores basado en una base de datos de solución. Pero primero, un poco sobre los componentes:

DRBD - un sistema de almacenamiento de la distribución estándar de Linux que le permite replicar datos entre servidores en bloques. La aplicación principal es crear almacenamiento tolerante a fallas.

OCFS2 - un sistema de archivos que proporciona el uso compartido del mismo almacenamiento por varios sistemas. Incluido en la distribución de Linux es un módulo de kernel y herramientas de espacio de usuario para trabajar con FS. OCFS2 se puede utilizar no sólo sobre DRBD, sino también sobre iSCSI con múltiples conexiones. En nuestro ejemplo utilizamos DRBD.

Todas las acciones se realizan en el servidor ubuntu 18.04 con una configuración mínima.

Paso 1. Configurar 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;
}
}

metadisco interno — utilizar los mismos dispositivos de bloque para almacenar metadatos
dispositivo /dev/drbd0 — utilice /dev/drbd0 como ruta al volumen drbd.
disco /dev/vdb1 - utilizar /dev/vdb1
sincronizador {tasa 1000M; } — utilizar ancho de banda de canal gigabit
permitir-dos-primarias - una opción importante que permite aceptar cambios en dos servidores principales
después-sb-0pri, después-sb-1pri, después-sb-2pri - opciones responsables de las acciones del nodo cuando se detecta splitbrain. Se pueden encontrar más detalles en la documentación.
convertirse en primario en ambos — establece ambos nodos en primario.

En nuestro caso, tenemos dos máquinas virtuales absolutamente idénticas, con una red virtual dedicada con un rendimiento de 10 gigabits.

En nuestro ejemplo, los nombres de red de dos nodos del clúster son drbd1 y drbd2. Para un funcionamiento adecuado, debe hacer coincidir los nombres y direcciones IP de los hosts en /etc/hosts.

10.10.10.192 drbd1
10.10.10.193 drbd2

Paso 2. Configurar nodos:

En ambos servidores ejecutamos:

drbdadm create-md drbd0

Almacenamiento en clúster para pequeños clústeres web basados ​​en drbd+ocfs2

modprobe drbd
drbdadm up drbd0
cat /proc/drbd

Obtenemos lo siguiente:

Almacenamiento en clúster para pequeños clústeres web basados ​​en drbd+ocfs2

Puede iniciar la sincronización. En el primer nodo necesitas ejecutar:

drbdadm primary --force drbd0

Veamos el estado:

cat /proc/drbd

Almacenamiento en clúster para pequeños clústeres web basados ​​en drbd+ocfs2

Genial, la sincronización ha comenzado. Esperamos hasta el final y vemos la imagen:

Almacenamiento en clúster para pequeños clústeres web basados ​​en drbd+ocfs2

Paso 3. Inicie la sincronización en el segundo nodo:

drbdadm primary --force drbd0

Obtenemos lo siguiente:

Almacenamiento en clúster para pequeños clústeres web basados ​​en drbd+ocfs2

Ahora podemos escribir en drbd desde dos servidores.

Paso 4. Instale y configure ocfs2.

Usaremos 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

Es necesario anotarlo en /etc/ocfs2/cluster.conf en ambos nodos.

Creamos un FS en drbd0 en cualquier nodo:

mkfs.ocfs2 -L "testVol" /dev/drbd0

Aquí creamos un sistema de archivos con la etiqueta testVol en drbd0, usando los parámetros predeterminados.

Almacenamiento en clúster para pequeños clústeres web basados ​​en drbd+ocfs2

En /etc/default/o2cb necesita configurar (como en nuestro archivo de configuración)

O2CB_ENABLED=true 
O2CB_BOOTCLUSTER=ocfs2cluster 

y ejecutar en cada nodo:

o2cb register-cluster ocfs2cluster

Luego encendemos y agregamos todas las unidades que necesitamos para ejecutar automáticamente:

systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2

Parte de esto ya se estará ejecutando durante el proceso de configuración.

Paso 5. Agregue puntos de montaje a fstab en ambos nodos:

/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0

Dirección /medios/compartido debe crearse con antelación.

Aquí usamos las opciones noauto, lo que significa que el archivo no se montará al inicio (prefiero montar archivos de red a través de systemd) y heartbeat=local, lo que significa usar el servicio heartbeat en cada nodo. También existe un latido global, que es más adecuado para grupos grandes.

A continuación puedes montar /medios/compartido y comprobar la sincronización del contenido.

¡Ya está! Como resultado, obtenemos un almacenamiento más o menos tolerante a fallos con escalabilidad y rendimiento decente.

Fuente: habr.com

Añadir un comentario