Base de datos · 8 min read · Dec 07, 2025

Cómo configurar la alta disponibilidad de MariaDB con Heartbeat y DRBD en Ubuntu 16.04 LTS

Heartbeat y DRBD se utilizan para una solución de clúster para cualquier aplicación que use dos servidores. Ambos servidores funcionan en modo activo y pasivo, un servidor funcionará al mismo tiempo y el otro servidor como servidor de respaldo. DRBD (Distributed Replicated Block Device) es un servicio a nivel de kernel que sincroniza datos entre dos servidores en tiempo real. Heartbeat es un programa de código abierto que permite a un servidor Linux primario y a un servidor de respaldo determinar si el otro está “vivo” y, si el primario no lo está, transferir recursos al respaldo. También gestionará la IP de alta disponibilidad y otros servicios en sus servidores.

En este tutorial, aprenderemos cómo lograr la alta disponibilidad de MariaDB utilizando Heartbeat y DRBD en el servidor Ubuntu 16.04.

Requisitos

  • Dos nodos con Ubuntu 16.04 instalado.
  • Dos tarjetas de red instaladas en cada nodo.
  • Disco duro adicional no particionado instalado en cada nodo.
  • Usuario no root con privilegios sudo configurado en cada nodo.

Comenzando

Antes de comenzar, necesitará configurar la dirección IP en cada nodo. Use la siguiente dirección IP en cada nodo:

Nodo1 :

172.16.0.1 en eth0 y 192.168.0.101 en eth1

Nodo2 :

172.16.0.2 en eth0 y 192.168.0.102 en eth1

La IP 192.168.0.103 será la IP de alta disponibilidad.

A continuación, también necesitará configurar el nombre de host y la resolución de nombres en cada nodo. Así cada nodo podrá comunicarse entre sí. En el primer nodo, abra el archivo /etc/hosts y el archivo /etc/hostname:

sudo nano /etc/hosts

Agregue las siguientes líneas al final del archivo:

172.16.0.1  Node1
172.16.0.2  Node2
sudo nano /etc/hostname

Cambie el archivo como se muestra a continuación:

Node1

Guarde y cierre el archivo cuando haya terminado.

En el segundo nodo, abra el archivo /etc/hosts y el archivo /etc/hostname:

sudo nano /etc/hosts

Agregue las siguientes líneas al final del archivo:

172.16.0.1  Node1
172.16.0.2  Node2
sudo nano /etc/hostname

Cambie el archivo como se muestra a continuación:

Node2

Guarde y cierre el archivo cuando haya terminado.

A continuación, actualice cada nodo con la última versión con el siguiente comando:

sudo apt-get update -y  
sudo apt-get upgrade -y

Una vez que su sistema esté actualizado, reinicie el sistema para aplicar estos cambios.

Instalar DRBD y Heartbeat

A continuación, necesitará instalar DRBD y Heartbeat en ambos nodos. Por defecto, ambos están disponibles en el repositorio predeterminado de Ubuntu 16.04. Puede instalarlos simplemente ejecutando el siguiente comando en ambos nodos:

sudo apt-get install drbd8-utils heartbeat -y

A continuación, inicie el servicio DRBD y Heartbeat y habilítelos para que se inicien en el arranque:

sudo systemctl start drbd  
sudo systemctl start heartbeat  
systemctl enable drbd  
systemctl enable heartbeat

Configurar DRBD y Heartbeat

A continuación, necesitará configurar el dispositivo DRBD en cada nodo. Cree una única partición en el segundo disco no particionado /dev/sdb en cada nodo.

Puede hacer esto simplemente ejecutando el siguiente comando en cada nodo:

sudo echo -e 'n\np\n1\n\n\nw' | fdisk /dev/sdb

A continuación, necesitará configurar DRBD en ambos nodos. Puede hacer esto creando el archivo /etc/drbd.d/r0.res en cada nodo.

sudo nano /etc/drbd.d/r0.res

Agregue las siguientes líneas:

global {
usage-count no;
}
resource r0 {
protocol C;
startup {
degr-wfc-timeout 60;
}
disk {
}
syncer {
rate 100M;
}
net {
cram-hmac-alg sha1;
shared-secret "aBcDeF";
}
on Node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.1:7789;
meta-disk internal;
}
on Node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.2:7789;
meta-disk internal;
}
}

Guarde y cierre el archivo cuando haya terminado, luego abra otro archivo de configuración en cada nodo:

sudo nano /etc/ha.d/ha.cf

Agregue las siguientes líneas:

# Intervalo de verificación
keepalive 1
# Tiempo antes de que el servidor se declare muerto
deadtime 10
# Retraso de espera secundario al arrancar
initdead 60
# Auto-failback
auto_failback off
# Interfaz de Heartbeat
bcast eth1
# Nodos a monitorear
node Node1
node Node2

Guarde y cierre el archivo.

A continuación, abra el archivo de recursos /etc/ha.d/haresources en cada nodo:

sudo nano /etc/ha.d/haresources

Agregue las siguientes líneas:

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime

Aquí, Node1 es el nombre de host de su nodo activo principal, 192.168.0.103 es la dirección IP flotante, /var/lib/mysql es un punto de montaje y /dev/drbd0 es el dispositivo DRBD.

A continuación, necesitará definir y almacenar claves de autorización idénticas en ambos nodos. Puede hacer esto en el archivo /etc/ha.d/authkeys en cada nodo:

sudo nano /etc/ha.d/authkeys

Agregue las siguientes líneas:

auth1
1 sha1 su-contraseña-segura

Aquí, su-contraseña-segura es su contraseña segura. Use la misma contraseña en ambos nodos.

A continuación, cree e inicie DRBD ejecutando el siguiente comando en Node1:

sudo drbdadm create-md r0  
sudo systemctl restart drbd  
sudo drbdadm outdate r0  
sudo drbdadm -- --overwrite-data-of-peer primary all  
sudo drbdadm primary r0  
sudo mkfs.ext4 /dev/drbd0  
sudo chmod 600 /etc/ha.d/authkeys  
sudo mkdir /var/lib/mysql

Una vez que el disco DRBD esté creado en Node1, cree el disco DRBD en Node2 con el siguiente comando:

sudo drbdadm create-md r0  
sudo systemctl restart drbd  
sudo chmod 600 /etc/ha.d/authkeys  
sudo mkdir /var/lib/mysql

Ahora, puede verificar que el disco DRBD está conectado y se está sincronizando correctamente ejecutando el siguiente comando:

sudo cat /proc/drbd

Si todo está bien, debería ver la siguiente salida:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:210413 nr:0 dw:126413 dr:815311 al:35 bm:0 lo:0 pe:11 ua:0 ap:0 ep:1 wo:f oos:16233752
[>....................] sync'ed: 3.3% (14752/14350)M
finish: 0:12:23 speed: 12,156 (16,932) K/sec

A continuación, inicie heartbeat en ambos nodos para habilitar la parte de failover de su configuración.

sudo systemctl start heartbeat

A continuación, verifique la partición DRBD montada con el siguiente comando en Node1:

sudo mount | grep drbd

Debería ver la siguiente salida:

/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

A continuación, verifique que la IP flotante solo esté vinculada a Node1 con el siguiente comando:

sudo ip addr show | grep 192.168.0.103

Debería ver la siguiente salida:

inet 192.168.0.103/24 brd 192.168.0.255 scope global secondary eth1:0

Instalar y configurar MariaDB

Una vez que todo esté configurado correctamente en ambos nodos, es hora de instalar el servidor MariaDB en ambos nodos.

Ejecute el siguiente comando en ambos nodos para instalar el servidor MariaDB:

sudo apt-get install mariadb-server -y

A continuación, necesitará deshabilitar el servicio de MariaDB en ambos nodos:

sudo systemctl disable mysql

Aquí, utilizaremos Node1 como primario y las bases de datos en Node2 deben ser creadas y pobladas a través de la sincronización con Node1. Así que necesitará detener el servicio de MariaDB y eliminar el contenido dentro de /var/lib/mysql en Node2. Puede hacer esto con el siguiente comando:

sudo systemctl stop mysql  
sudo rm -rf /var/lib/mysql/*

A continuación, necesitará copiar el archivo de configuración de mantenimiento de MySQL de Node1 a Node2. Puede hacer esto ejecutando el siguiente comando:

sudo scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

A continuación, necesitará crear un usuario root para la gestión remota y el acceso a las bases de datos en la instancia de MySQL altamente disponible.

Puede hacer esto ejecutando el siguiente comando en Node1:

mysql -u root -p

Ingrese su contraseña de root, luego cree un usuario root con el siguiente comando:

MariaDB [(none)]> CREATE USER 'root'@'192.168.0.%' IDENTIFIED BY 'contraseña';  
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0..%' WITH GRANT OPTION;  
MariaDB [(none)]> FLUSH PRIVILEGES;  
MariaDB [(none)]> QUIT;

A continuación, establezca la dirección de enlace para MySQL en ambos nodos con el siguiente comando:

sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mariadb.conf.d/*.cnf

Iniciar Heartbeat para el servicio de MariaDB

A continuación, necesitará agregar el servicio de MariaDB en sus instancias de heartbeat en ambos nodos. Puede hacer esto editando el archivo /etc/ha.d/haresources:

sudo nano /etc/ha.d/haresources

Modifique las siguientes líneas:

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime mysql

Guarde y cierre el archivo cuando haya terminado.

Una vez que el heartbeat esté configurado, necesitará reiniciarlo en ambos nodos.

Primero, reinicie heartbeat en Node1:

sudo systemctl restart heartbeat

A continuación, espere 50 segundos, luego reinicie el servicio de heartbeat en Node2:

sudo systemctl restart heartbeat

Probar Heartbeat y DRBD

Ahora, todo está configurado correctamente, es hora de realizar una serie de pruebas para verificar que heartbeat realmente activará una transferencia del servidor activo al servidor pasivo cuando el servidor activo falle de alguna manera.

Primero, verifique que Node1 sea el nodo primario de drbd con el siguiente comando en Node1:

sudo cat /proc/drbd

Debería ver la siguiente salida:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
O cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:22764644 nr:256 dw:529232 dr:22248299 al:111 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

A continuación, verificaremos que el disco DRBD esté montado con el siguiente comando:

sudo mount | grep drbd
/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

A continuación, verifique el servicio de MariaDB con el siguiente comando:

sudo systemctl status mysql

A continuación, acceda al servidor MariaDB desde la máquina remota utilizando la IP flotante y cree una base de datos de prueba:

mysql -h 192.168.0.103 -u root -p
MariaDB [(none)]> create database test;  
MariaDB [(none)]> quit

A continuación, reinicie heartbeat en Node1:

sudo systemctl restart heartbeat

Ahora, heartbeat interpretará este reinicio como una falla de MariaDB en Node1 y debería activar el failover para hacer de Node2 el servidor primario.

Puede verificar que DRBD ahora está tratando a Node1 como el servidor secundario con el siguiente comando en Node1:

sudo cat /proc/drbd

Debería ver la siguiente salida:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:22764856 nr:388 dw:529576 dr:22248303 al:112 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

Ahora, verifique que Node2 sea el nodo primario de drbd ejecutando el siguiente comando en Node2:

sudo cat /proc/drbd

Debería ver la siguiente salida:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:412 nr:20880892 dw:20881304 dr:11463 al:7 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

A continuación, verifique que MariaDB esté ejecutándose en Node2:

sudo systemctl status mysql

Ahora, conéctese al servidor MariaDB utilizando la IP flotante en Node2 desde un usuario remoto.

mysql -h 192.168.0.103 -u root -p

A continuación, vea la base de datos de prueba que creamos anteriormente mientras Node1 era el servidor primario.

MariaDB [(none)]> show databases;

Debería ver la siguiente salida:

 +--------------------+
| Database           |
+--------------------+
| test               |
| information_schema  |
| lost+found         |
| mysql              |
| performance_schema  |
+--------------------+
5 rows in set (0.04 sec)
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.