Clustering con Pacemaker y Corosync: Guía de Alta Disponibilidad Empresarial

Introducción

El clustering de alta disponibilidad es un componente crítico de la infraestructura empresarial, asegurando la entrega continua de servicios incluso cuando los nodos individuales fallan. Pacemaker y Corosync forman la columna vertebral de las soluciones de alta disponibilidad basadas en Linux, proporcionando capacidades robustas de gestión de recursos de cluster y comunicación entre nodos que impulsan aplicaciones de misión crítica en todo el mundo.

Pacemaker es un gestor de recursos de cluster sofisticado que determina qué nodos deben alojar qué servicios y maneja las operaciones de failover automáticamente. Corosync, por otro lado, proporciona la capa de comunicación del cluster utilizando el protocolo Totem, asegurando la entrega confiable de mensajes entre nodos del cluster y detectando fallos de nodos a través de mecanismos de heartbeat.

Juntas, estas tecnologías habilitan configuraciones de redundancia activo-pasivo, activo-activo y N+M que protegen contra fallos de hardware, caídas de software y ventanas de mantenimiento planificado. Las organizaciones que despliegan sistemas financieros, aplicaciones de salud, infraestructura de telecomunicaciones y plataformas de comercio electrónico dependen de clusters Pacemaker/Corosync para mantener acuerdos de nivel de servicio (SLAs) que demandan disponibilidad del 99.99% o superior.

Esta guía exhaustiva explora implementaciones de clusters de nivel empresarial, cubriendo diseño de arquitectura, patrones de configuración avanzados, optimización de rendimiento y estrategias de solución de problemas que los ingenieros de sistemas experimentados necesitan para construir soluciones de alta disponibilidad listas para producción.

Teoría y Conceptos Fundamentales

Fundamentos de Arquitectura de Cluster

Los clusters de alta disponibilidad construidos con Pacemaker y Corosync operan sobre varios principios fundamentales que los distinguen de mecanismos simples de balanceo de carga o redundancia.

Quorum y Prevención de Split-Brain: Los clusters utilizan mecanismos de votación para establecer quorum—el número mínimo de nodos requeridos para operar el cluster. Cuando ocurren particiones de red, solo la partición que contiene quorum puede continuar gestionando recursos, previniendo escenarios de split-brain donde múltiples particiones de cluster intentan gestionar los mismos recursos simultáneamente, llevando a la corrupción de datos.

Jerarquía de Gestión de Recursos: Pacemaker organiza los servicios en recursos con propiedades configurables:

  • Recursos Primitivos: Servicios individuales como direcciones IP, sistemas de archivos o aplicaciones
  • Grupos: Colecciones de recursos que deben ejecutarse juntos en el mismo nodo
  • Clones: Recursos que se ejecutan en múltiples nodos simultáneamente (activo-activo)
  • Recursos Master-Slave: Recursos donde una instancia es primaria y otras están en espera

Fencing y STONITH: Los mecanismos "Shoot The Other Node In The Head" apagan o aíslan forzosamente los nodos fallidos para garantizar que los sistemas defectuosos no puedan corromper recursos compartidos. El fencing es obligatorio para clusters de producción que gestionan recursos con estado como bases de datos o almacenamiento compartido.

Arquitectura de Comunicación de Corosync

Corosync implementa el protocolo Totem Single Ring Ordering and Membership, proporcionando:

Orden Total: Todos los mensajes se entregan a todos los nodos en el mismo orden, esencial para un estado de cluster consistente Sincronía Virtual: Grupos de nodos mantienen vistas sincronizadas de la membresía del cluster Protocolo de Anillo Redundante: Soporte para múltiples rutas de red para eliminar puntos únicos de fallo

La capa de comunicación opera usando UDP multicast o unicast, con intervalos de heartbeat configurables (típicamente 1-5 segundos) y tiempos de espera de detección de fallos que equilibran entre failover rápido y detección de falsos positivos.

Motor de Decisión de Pacemaker

El Policy Engine (PE) de Pacemaker evalúa continuamente el estado del cluster contra restricciones y políticas configuradas:

Restricciones de Ubicación: Definen qué nodos pueden o deben alojar recursos específicos Restricciones de Colocación: Especifican recursos que deben ejecutarse juntos o separados Restricciones de Orden: Definen secuencias de inicio/apagado para recursos dependientes Adhesividad de Recursos: Preferencia por mantener recursos en su nodo actual versus migrar

El Cluster Resource Manager (CRM) interpreta estas políticas y orquesta transiciones de recursos, minimizando la interrupción del servicio mientras respeta todas las restricciones configuradas.

Prerrequisitos

Requisitos de Hardware

Las implementaciones de clusters empresariales requieren una planificación cuidadosa del hardware:

Configuración Mínima:

  • Al menos 3 nodos (2 para servicios + 1 quorum/desempate)
  • Interfaces de red duales por nodo para comunicación redundante
  • Infraestructura de almacenamiento compartido (SAN, NAS o sistema de archivos distribuido)
  • Interfaces IPMI/iLO/BMC dedicadas para fencing STONITH
  • 4 núcleos de CPU mínimo por nodo
  • 8GB RAM mínimo por nodo (16GB+ recomendado)

Infraestructura de Red:

  • Red de interconexión de cluster dedicada (VLAN aislada)
  • Rutas de red redundantes con latencia inferior a 5ms
  • Soporte de tramas jumbo (MTU 9000) para redes de almacenamiento
  • Switches de red con IGMP snooping para multicast

Consideraciones de Almacenamiento:

  • Almacenamiento de bloques compartido para sistemas de archivos en cluster (GFS2, OCFS2)
  • Configuración RAID para redundancia de almacenamiento local
  • Caché con respaldo de batería para rendimiento de escritura
  • Configuración multipath para redundancia de rutas de almacenamiento

Prerrequisitos de Software

Compatibilidad de Sistema Operativo:

  • Red Hat Enterprise Linux 8/9 o compatible (Rocky Linux, AlmaLinux)
  • Ubuntu 20.04/22.04 LTS
  • SUSE Linux Enterprise Server 15
  • Debian 11/12

Paquetes Requeridos (RHEL/Rocky):

pacemaker corosync pcs fence-agents-all resource-agents

Paquetes Requeridos (Ubuntu/Debian):

pacemaker corosync crmsh fence-agents resource-agents

Requisitos de Configuración de Red

Todos los nodos requieren:

  • Tiempo sincronizado vía NTP/Chrony (crítico para operaciones de cluster)
  • Resolución de nombres de host vía /etc/hosts o DNS
  • Reglas de firewall que permitan comunicación de cluster
  • Políticas SELinux/AppArmor que permitan operaciones de cluster

Configuración Avanzada

Configuración Inicial del Cluster

Paso 1: Sincronización de Tiempo

Configurar chrony en todos los nodos:

# Instalar chrony
dnf install -y chrony

# Configurar fuentes NTP confiables
cat >> /etc/chrony.conf << EOF
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
EOF

systemctl enable --now chronyd

Paso 2: Configuración de Red y Nombres de Host

Configurar /etc/hosts en todos los nodos:

cat >> /etc/hosts << EOF
192.168.100.11  cluster-node1
192.168.100.12  cluster-node2
192.168.100.13  cluster-node3
EOF

Paso 3: Configuración de Firewall

Abrir puertos requeridos en todos los nodos:

# Comunicación Corosync
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --permanent --add-port=2224/tcp  # pcsd
firewall-cmd --permanent --add-port=3121/tcp  # pacemaker remote
firewall-cmd --permanent --add-port=5403/tcp  # corosync qnetd
firewall-cmd --permanent --add-port=5404-5412/udp  # corosync
firewall-cmd --reload

Paso 4: Instalar y Configurar Software de Cluster

En todos los nodos:

# Instalar paquetes de cluster
dnf install -y pacemaker corosync pcs fence-agents-all

# Habilitar e iniciar daemon pcsd
systemctl enable --now pcsd

# Establecer contraseña de hacluster (igual en todos los nodos)
echo "StrongClusterPassword123!" | passwd --stdin hacluster

Paso 5: Autenticar Nodos del Cluster

En node1:

# Autenticar todos los nodos
pcs host auth cluster-node1 cluster-node2 cluster-node3 \
  -u hacluster -p StrongClusterPassword123!

Paso 6: Crear el Cluster

# Crear cluster con todos los nodos
pcs cluster setup enterprise-cluster \
  cluster-node1 addr=192.168.100.11 \
  cluster-node2 addr=192.168.100.12 \
  cluster-node3 addr=192.168.100.13 \
  transport knet

# Habilitar servicios de cluster en el arranque
pcs cluster enable --all

# Iniciar el cluster
pcs cluster start --all

Configuración Avanzada de Corosync

Editar /etc/corosync/corosync.conf para optimización de producción:

totem {
    version: 2
    cluster_name: enterprise-cluster
    transport: knet

    # Detección agresiva de fallos
    token: 3000
    token_retransmits_before_loss_const: 10
    join: 60
    consensus: 3600

    # Habilitar cifrado
    crypto_cipher: aes256
    crypto_hash: sha256

    interface {
        ringnumber: 0
        bindnetaddr: 192.168.100.0
        broadcast: yes
        mcastport: 5405
    }

    # Anillo redundante para tolerancia a fallos
    interface {
        ringnumber: 1
        bindnetaddr: 192.168.101.0
        broadcast: yes
        mcastport: 5407
    }
}

quorum {
    provider: corosync_votequorum
    expected_votes: 3
    two_node: 0
    wait_for_all: 0
    last_man_standing: 1
    last_man_standing_window: 10000
}

logging {
    to_logfile: yes
    logfile: /var/log/cluster/corosync.log
    to_syslog: yes
    timestamp: on
    logger_subsys {
        subsys: QUORUM
        debug: off
    }
}

nodelist {
    node {
        ring0_addr: cluster-node1
        ring1_addr: cluster-node1-priv
        name: cluster-node1
        nodeid: 1
    }
    node {
        ring0_addr: cluster-node2
        ring1_addr: cluster-node2-priv
        name: cluster-node2
        nodeid: 2
    }
    node {
        ring0_addr: cluster-node3
        ring1_addr: cluster-node3-priv
        name: cluster-node3
        nodeid: 3
    }
}

Recargar configuración:

pcs cluster reload corosync --all

Configuración STONITH/Fencing

Configurar fencing basado en IPMI:

# Crear dispositivo fence para node1
pcs stonith create fence-node1 fence_ipmilan \
  pcmk_host_list="cluster-node1" \
  ipaddr="192.168.200.11" \
  username="admin" \
  password="ipmi_password" \
  lanplus=1 \
  cipher=1 \
  op monitor interval=60s

# Repetir para todos los nodos
pcs stonith create fence-node2 fence_ipmilan \
  pcmk_host_list="cluster-node2" \
  ipaddr="192.168.200.12" \
  username="admin" \
  password="ipmi_password" \
  lanplus=1 \
  cipher=1 \
  op monitor interval=60s

pcs stonith create fence-node3 fence_ipmilan \
  pcmk_host_list="cluster-node3" \
  ipaddr="192.168.200.13" \
  username="admin" \
  password="ipmi_password" \
  lanplus=1 \
  cipher=1 \
  op monitor interval=60s

# Habilitar STONITH globalmente
pcs property set stonith-enabled=true

# Probar fencing
pcs stonith fence cluster-node3

Ejemplos de Configuración de Recursos

Recurso de Dirección IP Virtual:

pcs resource create vip-public ocf:heartbeat:IPaddr2 \
  ip=192.168.100.100 \
  cidr_netmask=24 \
  nic=eth0 \
  op monitor interval=10s

Recurso de Servidor Web Apache:

pcs resource create webserver systemd:httpd \
  op monitor interval=30s \
  op start timeout=60s \
  op stop timeout=60s

# Asegurar que VIP inicie antes de webserver
pcs constraint order vip-public then webserver

# Asegurar que VIP y webserver se ejecuten en el mismo nodo
pcs constraint colocation add webserver with vip-public INFINITY

Recurso de Sistema de Archivos en Cluster:

# Crear recurso de grupo de volumen LVM
pcs resource create vg-cluster ocf:heartbeat:LVM-activate \
  vgname=cluster_vg \
  vg_access_mode=system_id \
  op monitor interval=30s \
  op start timeout=90s

# Crear recurso de sistema de archivos
pcs resource create fs-cluster Filesystem \
  device="/dev/cluster_vg/cluster_lv" \
  directory="/mnt/cluster" \
  fstype="xfs" \
  op monitor interval=20s \
  op start timeout=60s \
  op stop timeout=60s

# Crear grupo de recursos
pcs resource group add cluster-storage vg-cluster fs-cluster

Recurso de Base de Datos PostgreSQL:

pcs resource create postgres-db pgsql \
  pgctl="/usr/pgsql-14/bin/pg_ctl" \
  psql="/usr/pgsql-14/bin/psql" \
  pgdata="/var/lib/pgsql/14/data" \
  pgport="5432" \
  op start timeout=120s \
  op stop timeout=120s \
  op monitor interval=30s timeout=60s

# Agregar al grupo de recursos con almacenamiento y VIP
pcs constraint order cluster-storage then postgres-db
pcs constraint colocation add postgres-db with cluster-storage INFINITY

Optimización de Rendimiento

Ajuste de Corosync para Baja Latencia

Optimizar valores de token timeout basados en características de red:

# Detección rápida de fallos (redes de baja latencia)
pcs property set token=1000
pcs property set token_retransmits_before_loss_const=20

# Configuración de tiempo de ida y vuelta de red
pcs property set token_warning=75%

Adhesividad de Recursos y Umbral de Migración

Prevenir migraciones innecesarias de recursos:

# Adhesividad global de recursos
pcs resource defaults resource-stickiness=100

# Umbral de migración por recurso
pcs resource meta webserver migration-threshold=3
pcs resource meta webserver failure-timeout=300s

Operaciones de Fencing Concurrentes

Habilitar fencing paralelo para recuperación más rápida:

pcs property set concurrent-fencing=true
pcs property set stonith-max-attempts=5
pcs property set stonith-action=reboot

Optimización de Transición de Cluster

Reducir sobrecarga de recálculo del cluster:

pcs property set cluster-recheck-interval=2min
pcs property set dc-deadtime=20s
pcs property set election-timeout=2min

Ajuste de Operaciones de Recursos

Optimizar intervalos de verificación de recursos:

# Monitoreo menos frecuente para recursos estables
pcs resource op remove webserver monitor
pcs resource op add webserver monitor interval=60s timeout=30s

# Monitoreo agresivo para recursos críticos
pcs resource op remove postgres-db monitor
pcs resource op add postgres-db monitor interval=15s timeout=45s on-fail=restart

Patrones de Alta Disponibilidad

Configuración Activo-Pasivo

Cluster de failover estándar con servicios ejecutándose en un nodo:

# Deshabilitar clonación de recursos
pcs resource create app-service systemd:myapp \
  op monitor interval=30s

# Establecer nodo preferido
pcs constraint location app-service prefers cluster-node1=100
pcs constraint location app-service prefers cluster-node2=50

Activo-Activo con Recursos Clonados

Servicios ejecutándose simultáneamente en todos los nodos:

# Crear recurso clonado
pcs resource create app-clone systemd:myapp \
  clone notify=true globally-unique=false

# Establecer máximo de clones
pcs resource clone app-service clone-max=3 clone-node-max=1

Configuración Master-Slave (Clone Promocionable)

Replicación de base de datos con promoción automática:

# Replicación por streaming de PostgreSQL
pcs resource create postgres-ha pgsqlms \
  bindir="/usr/pgsql-14/bin" \
  pgdata="/var/lib/pgsql/14/data" \
  op start timeout=60s \
  op stop timeout=60s \
  op promote timeout=30s \
  op demote timeout=120s \
  op monitor interval=15s role="Master" \
  op monitor interval=30s role="Slave" \
  promotable notify=true

# La IP virtual sigue al master
pcs constraint colocation add vip-db with master postgres-ha-clone INFINITY
pcs constraint order promote postgres-ha-clone then start vip-db

Monitoreo y Observabilidad

Monitoreo de Estado del Cluster

Estado del cluster en tiempo real:

# Estado completo del cluster
pcs status --full

# Estado específico de recursos
pcs resource show --full

# Estado de nodos
pcs node attribute

Script de monitoreo para automatización:

#!/bin/bash
# /usr/local/bin/cluster-health-check.sh

OUTPUT_FILE="/var/log/cluster/health-$(date +%Y%m%d-%H%M%S).log"

{
    echo "=== Verificación de Salud del Cluster: $(date) ==="

    # Estado del cluster
    echo -e "\n--- Estado del Cluster ---"
    pcs status

    # Estado de quorum
    echo -e "\n--- Estado de Quorum ---"
    corosync-quorumtool

    # Restricciones de recursos
    echo -e "\n--- Restricciones de Recursos ---"
    pcs constraint --full

    # Acciones fallidas
    echo -e "\n--- Acciones Fallidas ---"
    pcs status --full | grep -A5 "Failed Actions" || echo "Ninguna"

    # Estado STONITH
    echo -e "\n--- Dispositivos STONITH ---"
    pcs stonith status

} > "$OUTPUT_FILE"

# Alertar sobre problemas
if pcs status 2>&1 | grep -q "Failed\|Error\|Unclean"; then
    mail -s "Alerta de Salud del Cluster" [email protected] < "$OUTPUT_FILE"
fi

Integración con Prometheus

Exportar métricas del cluster para monitoreo:

# Instalar ha_cluster_exporter
wget https://github.com/ClusterLabs/ha_cluster_exporter/releases/download/1.3.0/ha_cluster_exporter-amd64.tar.gz
tar -xvf ha_cluster_exporter-amd64.tar.gz -C /usr/local/bin/

# Crear servicio systemd
cat > /etc/systemd/system/ha_cluster_exporter.service << EOF
[Unit]
Description=HA Cluster Exporter
After=network.target

[Service]
Type=simple
User=hacluster
ExecStart=/usr/local/bin/ha_cluster_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

systemctl enable --now ha_cluster_exporter

Análisis de Logs y Alertas

Centralizar logging del cluster:

# Configurar reenvío de rsyslog
cat >> /etc/rsyslog.d/cluster.conf << EOF
if \$programname == 'pacemaker' or \$programname == 'corosync' then @@log-server:514
EOF

systemctl restart rsyslog

Solución de Problemas

Escenarios de Pérdida de Quorum

Síntoma: El cluster deja de gestionar recursos debido a pérdida de quorum.

Diagnóstico:

# Verificar estado de quorum
corosync-quorumtool

# Ver configuración de votación
pcs quorum status

Resolución:

# Habilitar temporalmente anulación de quorum (¡peligroso!)
pcs quorum unblock

# Restaurar operaciones normales una vez que los nodos se reúnan
pcs cluster start cluster-node2

Detección y Recuperación de Split-Brain

Síntoma: Múltiples nodos creen que son coordinador del cluster.

Diagnóstico:

# Verificar elección de DC
crm_mon -1 | grep "Current DC"

# Verificar historial STONITH
stonith_admin --history=*

Resolución:

# Fencing manual de nodos ambiguos
pcs stonith fence cluster-node2

# Verificar integridad del cluster
pcs status --full

Fallos y Reinicio de Recursos

Síntoma: Recursos fallando y reiniciando repetidamente.

Diagnóstico:

# Ver historial de fallos
pcs status --full | grep -A10 "Failed"

# Verificar configuración de recursos
pcs resource config webserver

Resolución:

# Limpiar fallos de recursos
pcs resource cleanup webserver

# Aumentar umbral de fallos
pcs resource meta webserver migration-threshold=5 failure-timeout=600s

# Operaciones manuales de recursos
pcs resource debug-start webserver

Problemas de Comunicación de Corosync

Síntoma: Nodos uniéndose/dejando el cluster de forma errática.

Diagnóstico:

# Verificar estado del anillo de corosync
corosync-cfgtool -s

# Monitorear cambios de membresía
corosync-cmapctl | grep members

Resolución:

# Verificar conectividad de red
ping -c 5 cluster-node2
mtr cluster-node2

# Verificar pérdida de paquetes
corosync-cfgtool -s | grep "failed"

# Ajustar token timeout para redes con pérdidas
pcs property set token=5000

Fallos de STONITH

Síntoma: Operaciones de fencing agotando tiempo de espera o fallando.

Diagnóstico:

# Probar dispositivo fence
stonith_admin --fence cluster-node3 --test

# Ver configuración de dispositivo fence
pcs stonith show fence-node3

Resolución:

# Verificar conectividad IPMI
ipmitool -I lanplus -H 192.168.200.13 -U admin -P password power status

# Actualizar timeout de dispositivo fence
pcs stonith update fence-node3 pcmk_reboot_timeout=90s

# Configurar retrasos de fence para prevenir fencing simultáneo
pcs stonith update fence-node1 pcmk_delay_max=30s

Degradación de Rendimiento

Síntoma: Transiciones lentas de recursos y alto uso de CPU.

Diagnóstico:

# Analizar rendimiento de Pacemaker
crm_verify -L -V

# Verificar bucles de restricciones
pcs constraint show --full

Resolución:

# Simplificar configuración de restricciones
pcs constraint remove complex-constraint-id

# Optimizar cálculo de transición
pcs property set stop-orphan-resources=false
pcs property set stop-orphan-actions=false

Conclusión

Pacemaker y Corosync proporcionan capacidades de clustering de alta disponibilidad de nivel empresarial esenciales para infraestructura moderna que demanda entrega continua de servicios. Esta guía ha explorado patrones de configuración avanzados, técnicas de optimización de rendimiento y metodologías de solución de problemas que los ingenieros de sistemas necesitan para construir y mantener entornos de cluster listos para producción.

Las implementaciones exitosas de clusters requieren planificación cuidadosa de la topología de hardware, arquitectura de red y dependencias de recursos. El fencing STONITH permanece como no negociable para recursos con estado, asegurando la integridad de datos durante escenarios de fallo. El ajuste de rendimiento debe equilibrar la detección rápida de fallos contra los riesgos de falsos positivos introducidos por latencia de red y congestión.

Las organizaciones deben implementar monitoreo exhaustivo utilizando herramientas como Prometheus y logging centralizado para mantener visibilidad en la salud del cluster. Las pruebas regulares de escenarios de failover, operaciones de fence y procedimientos de recuperación ante desastres aseguran preparación cuando ocurren fallos reales. A medida que las aplicaciones crecen cada vez más complejas, dominar el clustering Pacemaker/Corosync se vuelve esencial para entregar la confiabilidad que las empresas modernas demandan.

Los temas avanzados como clusters geo-redundantes, integración con redes definidas por software y clustering de plataformas de orquestación de contenedores representan extensiones naturales de estos conceptos fundamentales, posicionando a ingenieros capacitados para arquitecturar soluciones altamente disponibles a escala.