Introducción

En este post vamos a ver cómo crear un cluster DRBD + OCFS2 para almacenar datos en un entorno de alta disponibilidad. Para ello, vamos a utilizar dos maquinas virtuales, a las que les vamos a añadir dos discos adicionales de 2GB para que la sincronización de los datos sea más rápida.

Creación de las máquinas virtuales

Para crear las máquinas virtuales, vamos a montarlas con Vagrant con el siguiente fichero:

Vagrant.configure("2") do |config|
  config.vm.define :mac1 do |mac1|
    mac1.vm.box = "debian/bullseye64"
    mac1.vm.hostname = "mac1"
    mac1.vm.synced_folder ".", "/vagrant", disabled: true
    mac1.vm.network "private_network", ip: "10.0.0.20"
    mac1.vm.provider :libvirt do |libvirt|
        libvirt.storage :file, :size => '2G'
        libvirt.storage :file, :size => '2G'
    end
  end
  config.vm.define :mac2 do |mac2|
    mac2.vm.box = "debian/bullseye64"
    mac2.vm.hostname = "mac2"
    mac2.vm.synced_folder ".", "/vagrant", disabled: true
    mac2.vm.network "private_network", ip: "10.0.0.30"
    mac2.vm.provider :libvirt do |libvirt|
        libvirt.storage :file, :size => '2G'
        libvirt.storage :file, :size => '2G'
  end
 end
end

Instalación

Para realizar este establecimiento, instalar el paquete DRBD:

apt install drbd-utils -y

Y para la implementación del sistema de ficheros, vamos a instalar OCFS2:

apt install ocfs2-tools -y

Creación de los recursos DRDB

Una vez realizada la instalación de ambos paquetes, vamos a configurar el DRBD. Para ello, vamos a editar el fichero /etc/drbd.d/wwwdata.res. Deberemos añadir los dos discos que hemos creado en las máquinas virtuales, y añadir la siguiente configuración:

resource wwwdata {
  protocol C;
  meta-disk internal;
  device /dev/drbd1;
  syncer {
    verify-alg sha1;
  }
  net {
    allow-two-primaries;
  }
  on mac1 {
    disk /dev/vdb;
    address 10.0.0.20:7789;
  }
  on mac2 {
    disk /dev/vdb;
    address 10.0.0.30:7789;
  }
}

Creado el fichero anterior, lo siguiente es crear el recurso en ambas máquinas:

drbdadm create-md wwwdata

Lo mismo que hemos hecho ahora lo haremos con el segundo recurso, que se llamará dbdata.res:

resource dbdata {
  protocol C;
  meta-disk internal;
  device /dev/drbd2;
  syncer {
    verify-alg sha1;
  }
  net {
    allow-two-primaries;
  }
  on mac1 {
    disk /dev/vdc;
    address 10.0.0.20:7790;
  }
  on mac2 {
    disk /dev/vdc;
    address 10.0.0.30:7790;
  }
}

Creado el fichero anterior, lo siguientees crear el recurso en ambas máquinas:

drbdadm create-md dbdata

Configuración Single-Primary de wwwdata

Ahora vamos a configurar wwwdata en modo Single Primary. Para ello, los activamos con el comando drbdadm up wwwdata y miramos el estado en ambas máquinas:

Como podemos ver en las imágenes anteriores, ambos recursos están en modo Secondary/Secondary. Para cambiar esto, vamos a hacer que uno de los recursos sea primario, en este caso, wwwdata:

drbdadm primary --force wwwdata

Al pasar escaso tiempo, podemos ver que el estado del recurso pasará a UpToDate/UpToDate. Esto quiere decir están sincronizados.

El siguiente paso que deberíamos hacer es darle formato al recurso que acabamos de crear, de momento en la primera máquina:

apt install xfsprogs

mkfs.xfs /dev/drbd1

Lo montamos y creamos un fichero para comprobar su funcionamiento:

mount /dev/drbd1 /mnt

echo "Hola mundo" > /mnt/hola.txt

Si intentásemos montar el mismo recurso en la segunda máquina, no podríamos, ya que el recurso está en modo Secondary. Para poder montarlo, deberíamos desmontar el recurso, cambiar los roles y volver a montarlo pero en la segunda máquina:

  • Error de montaje:
  • Desmontaje del recurso en mac1:
  • Cambiamos los roles, ponemos la mac1 en modo secundaria y la mac2 en modo primario:
#mac1
drbdadm secondary wwwdata
#mac2
drbdadm primary --force wwwdata

El mismo montaje que hemos realizado en la primera máquina, lo haremos en la segunda:

mount /dev/drbd1 /mnt

Y como podemos ver en la imagen anterior, el fichero que creamos en la primera máquina, podemos ver que sigue existiendo.

Configuración del recurso dbdata en modo Dual-Primary

Ahora vamos a configurar el recurso dbdata en modo Dual-Primary. Para ello, vamor a levantar el recurso en ambas máquinas.

drbdadm up dbdata
drbdadm status dbdata

Ya con el recurso levantado vamos a configurarlo en modo Dual-Primary. Para ello vamos a configurar el recurso en ambos nodos como primarios:

drbdadm primary --force dbdata

Para poder hacer que los dos recursos sean primarios, deberemos cambiar el sistema de ficheros por OCFS2. Pero, ¿qué es OCFS2?

Oracle Cluster File System (OCFS2) es un sistema de archivos de código abierto que se basa en el sistema de archivos de Linux. Es un sistema de archivos de cluster de alto rendimiento que se puede utilizar para crear un sistema de archivos distribuido en un cluster de Linux.

Una vez entendido esto, instalamos el paquete ocfs2-tools:

apt install ocfs2-tools

Creamos el cluster y añadimos los nodos a este mismo de la siguiente manera:

#Creación del cluster
o2cb add-cluster tclust
#Añadir nodos al cluster
o2cb add-node tclust mac1 --ip 10.0.0.20
o2cb add-node tclust mac2 --ip 10.0.0.30

Todo esto lo realizaremos en el mac1. Y como podemos ver en la imagen, el cluster se ha creado correctamente y los nodos están añadidos.

El contenido que vemos en esta imagen, será el contenido del mismo fichero en la máquina mac2 ya que hemos copiado el fichero de configuración del cluster de la máquina mac1 a la máquina mac2.

Ahora vamos a modificar el fichero /etc/default/o2cb en ambas máquinas de la siguiente manera:

# 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=tclust

# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
O2CB_HEARTBEAT_THRESHOLD=31

# O2CB_IDLE_TIMEOUT_MS: Time in ms before a network connection is considered dead.
O2CB_IDLE_TIMEOUT_MS=30000

# O2CB_KEEPALIVE_DELAY_MS: Max. time in ms before a keepalive packet is sent.
O2CB_KEEPALIVE_DELAY_MS=2000

# O2CB_RECONNECT_DELAY_MS: Min. time in ms between connection attempts.
O2CB_RECONNECT_DELAY_MS=2000

Para que funciones de forma correcta, deberemos modificar el kernel con ciertos parámetros en ambas máquinas. Para eso, modificamos el fichero /etc/sysctl.conf:

kernel.panic = 30
kernel.panic_on_oops = 1

Aplicamos los cambios con un sysctl -p.

Para finalizar, ponemos en marcha el cluster en ambas máquinas:

o2cb register-cluster tclust
o2cb cluster-status tclust

Tras verificar que el estado de nuestro cluster es online, vamos a crear el sistema de ficheros OCFS2 en el recurso dbdata:

sudo mkfs.ocfs2 --cluster-stack=o2cb --cluster-name=tclust /dev/drbd2

Desde la mac2 podemos verificr que el sistema de ficheros OCFS2 se ha creado correctamente:

Una vez realizado el formateo del sistema de ficheros, montamos los nodos en el directorio /mnt:

mount /dev/drbd2 /mnt

Para comprobar que funciona correctamente, vamos a crear un fichero en mac1 y lo vamos a editar desde mac2. Tras ello, comprobamos los cambios en mac1:

  • Creamos el fichero en mac1:
echo "Hola mundo" > /mnt/hola.txt
  • Comprobamos su contenido y lo editamos:
cat /mnt/hola.txt
echo "Hola mundo 2" > /mnt/hola.txt
  • Comprobamos los cambios en mac1:
cat /mnt/hola.txt