Introducción a DRBD y OCFS2
DRBD
DRBD (Distributed Replicated Block Device) es un sistema de almacenamiento replicado distribuido para la plataforma Linux.
Es parecido a un RAID1, pero en este caso, se hace la duplicación de los datos entre diferentes dispositivos de bloque en diferentes hosts a través de la red.
DRBD es software libre desarrollado por la empresa LinBit. Documentación oficial.
Recurso DRBD
El recurso DRBD es el espacio de almacenamiento y la información relacionada administrada por DRBD. Un recurso tendrá cuatro características:
- Nombre
- Nombre del dispositivo de bloque que se crea (ejemplo:
/etc/drbd1
) - Configuración del dispositivo de bloque que se va a replicar en cada nodo.
- Configuración de red de los nodos del cluster.
Modos de funcionamiento DRBD
Podemos configurar DRBD en dos modos:
- Modo “Un sólo primario” (Single-primary): Uno de los nodos es el primario y el que puede montar el recurso. El otro nodo es el secundario y no podrá montar el recurso. Normalmente cuando el recurso lo formateamos con un sistema de archivo tradicional. Se utiliza para cluster activo-pasivo.
- Modo “Dos primarios” (Dual-primary): En este caso los dos nodos se configuran como primario, por lo que pueden montar el recurso al mismo tiempo. Es necesario usar un sistema de ficheros distribuidos (OCFS2, GlusterFS, …). Se utiliza en cluster activo-activo.
Configuración del modo Single-primary
Tenemos un escenario donde tenemos dos máquinas. Cada máquina tiene conectado un disco, que es el dispositivo de bloque que vamos a duplicar. Podemos usar el siguiente escenario Vagrant: Vagrantfile.
Lo primero que haremos es instalar las herramientas del espacio de usuario de DRBD:
apt install drbd-utils
Creamos el recurso DRBD. Creamos el fichero /etc/drbd.d/datos.res
:
resource datos {
protocol C;
meta-disk internal;
device /dev/drbd1;
syncer {
verify-alg sha1;
}
net {
allow-two-primaries;
}
on nodo1 {
disk /dev/sdb;
address 10.1.1.101:7789;
}
on nodo2 {
disk /dev/sdb;
address 10.1.1.102:7789;
}
}
En la creación del recurso hemos indicado:
- El nombre:
resource datos
. - El dispositivo de bloque que se va a crear:
device /dev/drbd1;
- Los dispositivos de bloque que se van a replicar en cada nodo:
disk /dev/sdb;
- Las direcciones ip de cada nodo y el puerto que se va a utilizar para la sincronización.
A continuación vamos a crear el recurso drbd y lo vamos a activar en ambos nodos:
drbdadm create-md datos
drbdadm up datos
Asignamos el nodo1 como primario y el nodo2 como secundario, por lo tanto ejecutamos en el nodo1:
drbdadm primary --force datos
Y comprobamos que empieza la sincronización de discos:
$ drbdadm status datos
datos role:Primary
disk:UpToDate
peer role:Secondary
replication:SyncSource peer-disk:Inconsistent done:1.86
Trascurrido un tiempo comprobamos que los discos ya están sincronizados:
$ drbdadm status datos
datos role:Primary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
Podemos ver la característica de nuestros recursos DRBD:
$ cat /proc/drbd
version: 8.4.10 (api:1/proto:86-101)
srcversion: 9B4D87C5E865DF526864868
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:530108 nr:0 dw:5872 dr:526461 al:14 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Y finalmente podemos formatear el dispositivo de bloque, montarlo y crear un fichero index.html
en el (todo esto se ejecuta en el nodo primario, en el nodo1):
$ apt install xfsprogs
$ mkfs.xfs /dev/drbd1
$ mount /dev/drbd1 /mnt
$ cd /mnt/
$ echo "<h1>Prueba</h1>" >> index.html
$ umount /mnt
Si en el nodo2 (que tiene el papel de secundario) intentamos montar el recurso:
$ mount /dev/drbd1 /mnt
mount: /mnt: mount(2) system call failed: Wrong medium type.
Configuración del modo Dual-primary
Si queremos que los dos nodos tengan montado simultáneamente el recurso tenemos que configurar los dos nodos como primario. En el nodo2:
$ drbdadm primary datos
$ drbdadm status datos
datos role:Primary
disk:UpToDate
peer role:Primary
replication:Established
peer-disk:UpToDate
$ mount /dev/drbd1 /mnt
Para que esto funcione de forma adecuada tenemos que usar un Sistema de Ficheros en Clúster o Distribuidos (por ejemplo OCFS2, GlusterFS,…)
OCFS2
OCFS (Oracle Cluster File System) es un sistema de archivos distribuido de alto rendimiento desarrollado por Oracle Corporation. Es un sistema de archivos nativo de clúster que permite a varios nodos del clúster acceder y modificar los mismos archivos al mismo tiempo.
Vamos a usar dos servicios:
- o2cb: Encargado de gestionar el clúster.
- ocfs2: Encargado de gestionar el sistema de fichero distribuido.
Para la instalación, ejecutamos en los dos nodos:
apt install ocfs2-tools
En primer lugar tenemos que crear un clúster ocfs2 indicando los nodos que van a formar parte de él. Ejecutamos lo siguiente en uno de los nodos e indicamos el nombre del clúster que vamos a crear:
o2cb add-cluster micluster
Ahora tenemos que añadir los nodos del clúster, desde uno de los nodos ejecutamos:
o2cb add-node micluster nodo1 --ip 10.1.1.101
o2cb add-node micluster nodo2 --ip 10.1.1.102
Podemos ver el estado del clúster ejecutando:
o2cb list-cluster micluster
node:
number = 0
name = nodo1
ip_address = 10.1.1.101
ip_port = 7777
cluster = micluster
node:
number = 1
name = nodo2
ip_address = 10.1.1.102
ip_port = 7777
cluster = micluster
cluster:
node_count = 2
heartbeat_mode = local
name = micluster
A continuación, copiamos el contenido del fichero /etc/ocfs2/cluster.conf
(que prácticamente es la salida del comando anterior) en la otra máquina.
En una de las máquinas editamos el fichero /etc/default/o2cb
y modificamos los siguientes parámetros:
# O2CB_ENABLED: 'true' means to load the driver on boot.
O2CB_ENABLED=true
# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
O2CB_BOOTCLUSTER=micluster # Cambiamos el valor de este parámetro por el nombre de nuestro cluster.
Para que o2cb funcione adecuadamente, añadimos los siguientes parámetros al fichero /etc/sysctl.conf
:
kernel.panic = 30
kernel.panic_on_oops = 1
Y recargamos sysctl:
sysctl -p
Antes de formatear el disco, tenemos que registrar el clúster (activar el clúster) en ambos nodos y comprobar que está online:
o2cb register-cluster micluster
o2cb cluster-status micluster
Ahora tenemos que formatear el dispositivo drbd, de nuevo en un solo nodo:
mkfs.ocfs2 --cluster-stack=o2cb --cluster-name=micluster /dev/drbd1
Y podemos comprobar que se ha formateado de forma adecuada en los dos nodos ejecutando:
o2info --volinfo /dev/drbd1
Ya tendríamos listo nuestro cluster, solo nos quedaría montarlo en ambas máquinas:
mount /dev/drbd1 /mnt
Podríamos probar que podemos escribir de forma simultánea, ejecutando la siguiente instrucción en cada nodo:
En el nodo1:
for ((;;)) do date >> /mnt/fecha_nodo1.txt;sleep 1; done
En el nodo 2:
for ((;;)) do date >> /mnt/fecha_nodo2.txt;sleep 1; done
Puedes acceder a uno de los nodos desde otra terminal y comprobar los ficheros que se están escribiendo en el directorio /mnt
:
root@nodo1:/mnt# ls -al
total 16
drwxr-xr-x 3 root root 3896 Jan 22 13:06 .
drwxr-xr-x 19 root root 4096 Jan 22 12:53 ..
-rw-r--r-- 1 root root 1740 Jan 22 13:08 fecha_nodo1.txt
-rw-r--r-- 1 root root 1885 Jan 22 13:08 fecha_nodo2.txt