Conceptos básicos de alta disponibilidad
26.10 Diferencias de versión
26.10 incluye HAProxy 3.4.2, cambia el algoritmo de equilibrio predeterminado a aleatorio, elimina la sección del programa heredado y rechaza algunos nombres duplicados previamente tratados como advertencias. Valide la configuración real antes de actualizar; No asuma que los ejemplos más antiguos todavía se aplican. Notas de la versión oficial
La alta disponibilidad (HA) garantiza que los servicios permanezcan operativos incluso cuando ocurre un único punto de falla. Este artículo presenta tres soluciones HA comunes: keepalived (conmutación por error VIP), HAProxy (equilibrio de carga) y Pacemaker/Corosync (administración de recursos del clúster).
keepalived (Conmutación por error de IP virtual)
keepalived utiliza el protocolo VRRP para habilitar la conmutación por error automática de direcciones IP virtuales. Cuando el nodo principal falla, el nodo de respaldo automáticamente se hace cargo del VIP.
Instalación
# Install on all nodes
sudo apt update
sudo apt install keepalived -yEjemplo de arquitectura
Node 1 (MASTER): 192.168.1.11
Node 2 (BACKUP): 192.168.1.12
Virtual IP (VIP): 192.168.1.100Configuración del nodo primario
sudo tee /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id LVS_NODE1
script_user root
enable_script_security
}
# Health check script
vrrp_script check_nginx {
script "/usr/bin/curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1 | grep -q 200"
interval 5
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass MyS3cretP@ss
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
check_nginx
}
# Notification scripts (optional)
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
EOFConfiguración del nodo de respaldo
sudo tee /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id LVS_NODE2
script_user root
enable_script_security
}
vrrp_script check_nginx {
script "/usr/bin/curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1 | grep -q 200"
interval 5
weight -20
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass MyS3cretP@ss
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
check_nginx
}
}
EOFGuión de notificación
sudo tee /etc/keepalived/notify.sh << 'SCRIPT'
#!/bin/bash
STATE=$1
DATETIME=$(date '+%Y-%m-%d %H:%M:%S')
echo "${DATETIME} - State changed to: ${STATE}" >> /var/log/keepalived-notify.log
case $STATE in
master)
echo "${DATETIME} - This node became MASTER" >> /var/log/keepalived-notify.log
# You can send alert notifications here
;;
backup)
echo "${DATETIME} - This node became BACKUP" >> /var/log/keepalived-notify.log
;;
fault)
echo "${DATETIME} - This node entered FAULT state" >> /var/log/keepalived-notify.log
;;
esac
SCRIPT
sudo chmod +x /etc/keepalived/notify.shIniciando el servicio
# Start on all nodes
sudo systemctl enable --now keepalived
# Check status
sudo systemctl status keepalived
# Verify VIP
ip addr show eth0 | grep 192.168.1.100
# View logs
sudo journalctl -u keepalived -f
# Test failover
# Stop keepalived on the primary node
sudo systemctl stop keepalived
# Observe whether the backup node takes over the VIPHAProxy (equilibrio de carga)
HAProxy es un equilibrador de carga TCP/HTTP de alto rendimiento que admite múltiples algoritmos de programación y comprobaciones de estado.
Instalación
sudo apt update
sudo apt install haproxy -y
# Check version
haproxy -vConfiguración básica
sudo tee /etc/haproxy/haproxy.cfg << 'EOF'
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Performance tuning
maxconn 50000
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
option http-server-close
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
# Statistics page
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
stats admin if LOCALHOST
stats auth admin:haproxy_pass
# HTTP frontend
frontend http_front
bind *:80
# HTTPS redirect
# redirect scheme https code 301 if !{ ssl_fc }
default_backend http_back
# HTTPS frontend
frontend https_front
bind *:443 ssl crt /etc/haproxy/certs/example.com.pem
http-request set-header X-Forwarded-Proto https
# Domain-based routing
acl host_app1 hdr(host) -i app1.example.com
acl host_app2 hdr(host) -i app2.example.com
use_backend app1_back if host_app1
use_backend app2_back if host_app2
default_backend http_back
# Backend server group
backend http_back
balance roundrobin
option httpchk GET /health
http-check expect status 200
server web1 192.168.1.21:80 check inter 5s fall 3 rise 2
server web2 192.168.1.22:80 check inter 5s fall 3 rise 2
server web3 192.168.1.23:80 check inter 5s fall 3 rise 2 backup
backend app1_back
balance leastconn
option httpchk GET /health
server app1a 192.168.1.31:8080 check
server app1b 192.168.1.32:8080 check
backend app2_back
balance source
server app2a 192.168.1.41:8080 check
server app2b 192.168.1.42:8080 check
EOFEquilibrio de carga TCP (bases de datos, etc.)
# Append to haproxy.cfg
cat << 'EOF' | sudo tee -a /etc/haproxy/haproxy.cfg
# MySQL load balancing
listen mysql_cluster
bind *:3306
mode tcp
option mysql-check user haproxy
balance roundrobin
server mysql1 192.168.1.51:3306 check inter 5s
server mysql2 192.168.1.52:3306 check inter 5s backup
# Redis Sentinel
listen redis
bind *:6379
mode tcp
option tcp-check
balance first
server redis1 192.168.1.61:6379 check inter 3s
server redis2 192.168.1.62:6379 check inter 3s
EOFAlgoritmos de equilibrio de carga
| Algoritmo | Descripción | Caso de uso |
|---|---|---|
roundrobin | Todos contra todos | Por defecto; Los servidores tienen un rendimiento similar. |
leastconn | Menos conexiones | Conexiones largas, tiempos de procesamiento desiguales |
source | Hash de IP de origen | Se requiere persistencia de sesión |
uri | hash de URI | Servidores de caché |
first | Llene el primero antes de usar el segundo. | Conservación de recursos |
Puesta en marcha y verificación
# Check configuration
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
# Start service
sudo systemctl enable --now haproxy
# View stats page
curl http://localhost:8404/stats
# Firewall
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 8404/tcpcombinación keepalived + HAProxy
La solución HA más común es keepalived + HAProxy: dos instancias de HAProxy en modo activo-en espera, con keepalived administrando el VIP.
# keepalived configuration to check HAProxy status
sudo tee /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id HAPROXY_NODE1
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/usr/bin/killall -0 haproxy"
interval 2
weight -30
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass HAProxy_HA
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_haproxy
}
}
EOFMarcapasos / Corosync (Gestión de recursos de clúster)
Pacemaker y Corosync brindan administración de recursos de clúster de nivel empresarial, respaldando dependencias de recursos complejas y políticas de fallas.
Instalación
# Install on all nodes
sudo apt update
sudo apt install pacemaker corosync pcs resource-agents -y
# Set hacluster user password (same on all nodes)
sudo passwd hacluster
# Start the pcs management service
sudo systemctl enable --now pcsdConfigurar el clúster
# Authenticate all nodes from one node
sudo pcs host auth node1 node2 -u hacluster -p yourpassword
# Create the cluster
sudo pcs cluster setup ha-cluster node1 node2
# Start the cluster
sudo pcs cluster start --all
sudo pcs cluster enable --all
# Check cluster status
sudo pcs cluster status
sudo pcs status
# For two-node clusters, disable quorum policy
sudo pcs property set no-quorum-policy=ignore
# Disable STONITH (test environments; production should configure fencing devices)
sudo pcs property set stonith-enabled=falseConfiguración de recursos del clúster
# Add a virtual IP resource
sudo pcs resource create cluster_vip ocf:heartbeat:IPaddr2 \
ip=192.168.1.100 \
cidr_netmask=24 \
nic=eth0 \
op monitor interval=10s
# Add an Nginx resource
sudo pcs resource create web_server ocf:heartbeat:nginx \
configfile=/etc/nginx/nginx.conf \
op monitor interval=10s timeout=30s \
op start timeout=60s \
op stop timeout=60s
# Ensure VIP and Nginx are on the same node
sudo pcs constraint colocation add web_server with cluster_vip INFINITY
# Ensure VIP starts before Nginx
sudo pcs constraint order cluster_vip then web_server
# Create a resource group (simpler approach)
sudo pcs resource group add web_group cluster_vip web_server
# View resource status
sudo pcs resource status
sudo pcs constraint showGestión de recursos
# Manually migrate resources
sudo pcs resource move web_group node2
# Clear migration constraints (must run after migration)
sudo pcs resource clear web_group
# Enable/disable resources
sudo pcs resource disable web_server
sudo pcs resource enable web_server
# Clear resource error state
sudo pcs resource cleanup web_server
# Maintenance mode
sudo pcs node standby node1 # Put node in standby
sudo pcs node unstandby node1 # Restore node
sudo pcs property set maintenance-mode=true # Global maintenance mode
sudo pcs property set maintenance-mode=falseMonitoreo de clústeres
# Real-time cluster status monitoring
sudo crm_mon -1
# View cluster configuration
sudo pcs config show
# View cluster logs
sudo journalctl -u pacemaker -f
sudo journalctl -u corosync -f
# Corosync membership status
sudo corosync-cmapctl | grep membersComparación de soluciones
| Característica | mantener vivo | HAProxy | Marcapasos/Corosync |
|---|---|---|---|
| Función primaria | Conmutación por error VIP | Equilibrio de carga | Gestión de recursos del clúster |
| Complejidad de configuración | Simple | Medio | Más complejo |
| Tipos de recursos | Sólo VIP | Equilibrio HTTP/TCP | Cualquiera (VIP, servicios, sistemas de archivos, etc.) |
| Controles de salud | Basado en script | Comprobaciones de protocolo enriquecidas | Basado en agentes de recursos |
| Escala | 2 nodos | gran escala | 2-32 nodos |
| Uso típico | Conmutación por error activo-en espera | Distribución del tráfico | Alta disponibilidad empresarial |
Guía de recomendaciones
- Activo-espera simple: keepalived es suficiente
- Equilibrio de carga web: HAProxy (se puede combinar con keepalived para HA)
- Clústeres complejos: Pacemaker/Corosync (múltiples recursos, dependencias complejas)
- Combinación más común: keepalived + HAProxy: simple y eficaz