Tutoriales de VPS
Diseño de arquitectura de alta disponibilidad para VPS empresarial (2026): una ruta de implementación desde el punto único hasta la disponibilidad
Muchos quieren ir directo a "hot standby de dos máquinas/multiactivo" y terminan gastando mucho dinero mientras siguen entrando en pánico durante las caídas. Lo más crítico de la alta disponibilidad empresarial no es el diagrama de arquitectura, sino si se puede implementar en orden. Este artículo lo explica con una ruta reversible: L0 primero completa seguridad/respaldo/monitoreo, L1 hace la aplicación sin estado, L2 añade dos nodos + LB, L3 elimina el punto único en la entrada; además incluye ejemplos mínimos de configuración de HAProxy/Keepalived, listas de verificación de base de datos primaria-réplica y simulacros de recuperación.

Cuando haces alta disponibilidad (HA) empresarial, el error más común no es "no saber la tecnología", sino equivocarse en el orden.
Muchos equipos van directo a dibujar hot standby de dos máquinas y montar multiactivo, y el resultado es:
- El negocio sigue teniendo puntos únicos (por ejemplo, subida de archivos, sesiones locales, una sola base de datos)
- El monitoreo y las alertas no están bien hechos, así que cuando hay una caída hay que depender de que los usuarios lo reporten
- Hay respaldos pero no simulacros de recuperación, y solo cuando algo realmente falla se descubre que los respaldos son inútiles
Este artículo no va de misticismo ni vende una "arquitectura perfecta". Escribo con un objetivo más realista:
Ayudarte a subir la disponibilidad paso a paso de forma reversible.
He visto muchos "requisitos falsos":
- En realidad el negocio permite mantenimiento de madrugada, pero asusta la palabra "empresarial"
- En realidad el volumen de usuarios no es grande, y una sola máquina + respaldo + monitoreo es suficiente
- En realidad el mayor riesgo no es una caída, sino borrar la base de datos por error, certificados vencidos o disco lleno
Puedes juzgar rápido con dos preguntas:
- ¿Cuánto tiempo puedes aceptar que dure una falla? (RTO)
- ¿Cuántos datos puedes aceptar perder? (RPO)
Si aún no has escrito RTO/RPO en un documento, no te apresures a montar HA.
Un recordatorio rápido: antes de hacer HA, calcula bien el "costo de tiempo". Muchos proyectos no los tumban los servidores, los tumba el costo de mantenimiento.
Sugiero dividir HA en cuatro niveles y entregar por nivel.
El objetivo de este paso es:
- Una sola máquina también puede funcionar de forma estable
- Cuando algo falla, se puede localizar
- Los datos se pueden recuperar
El conjunto mínimo de tres piezas:
- Seguridad: SSH/firewall/Fail2Ban
- Respaldo: respaldo automático + capacidad de restaurar
- Monitoreo: saber cuándo un servicio se cae + el disco se llena + un certificado está por vencer
Los enlaces correspondientes para "copiar la tarea":
- Guía de endurecimiento de seguridad de VPS (SSH + firewall + Fail2Ban)
- Solución de respaldo automático de VPS (Rclone)
- Monitoreo y alertas de VPS (Prometheus + Grafana)
Si ni siquiera has terminado L0, no te apresures a hablar de L2/L3.
Para hacer HA, lo primero que hay que resolver no es "añadir dos máquinas más", sino:
- Si la aplicación puede escalar horizontalmente.
Los errores más comunes de falta de estado:
- Sesiones guardadas en memoria local (cambias a otra máquina y los usuarios pierden la sesión)
- Subidas de archivos escritas en el disco local (cambias a otra máquina y no se encuentran los archivos)
- Tareas programadas ejecutándose en una máquina concreta (tras el cambio se ejecutan dos veces o se omiten)
Soluciones típicas:
- Poner las sesiones en Redis (o usar JWT sin estado, pero controlando los riesgos)
- Poner los archivos en almacenamiento de objetos (S3/R2) o almacenamiento compartido
- Usar un mecanismo de "programación única" para las tareas programadas (leader election / un nodo de jobs separado)
En este paso, al menos debes lograr:
- Dos nodos de aplicación (App A / App B)
- Una entrada (LB) que haga comprobaciones de estado y reenvío
Arquitectura mínima implementable:
- Cliente → LB → App A / App B
- App → DB (por ahora puede ser una sola base de datos, pero necesitas respaldos y simulacros de recuperación)
No hagas comprobaciones de estado del tipo "el puerto responde = está vivo". Lo mejor es un endpoint real /healthz:
- Comprobar que el proceso está vivo
- Comprobar si las dependencias (DB/Redis) están disponibles (al menos una comprobación superficial)
Puedes empezar con la configuración más sencilla para construir la capacidad de conmutar tráfico.
Abajo hay un ejemplo mínimo funcional (solo cambia los puertos por los tuyos):
# /etc/haproxy/haproxy.cfg(示例)
frontend fe_http
bind :80
default_backend be_app
backend be_app
balance roundrobin
option httpchk GET /healthz
http-check expect status 200
server app_a 10.0.0.11:8080 check
server app_b 10.0.0.12:8080 check
La idea de verificación es simple:
- Detén el servicio en
app_a(o haz que/healthzdevuelva 500) - Accede al LB y mira si las solicitudes caen automáticamente en
app_b
Muchos terminan L2 y creen que ya tienen HA.
Pero si el LB en sí es una sola máquina, entonces es el nuevo punto único.
Las prácticas comunes son:
- Doble LB + VIP flotante con VRRP (Keepalived)
- O usar el LB gestionado del proveedor de nube (menos complicaciones, pero hay que aceptar las reglas y los costos)
El error más común aquí se llama split-brain:
- Ambos nodos creen ser el maestro
- El mismo VIP se "agarra de un lado a otro"
La clave para resolver el split-brain no es "añadir más configuración", sino:
- Tener arbitraje/prioridad claros
- Tener políticas de comprobación de estado y aislamiento (fencing)
- Los simulacros de falla deben cubrir escenarios como "partición de red" (no solo simular apagados)
Abajo hay una forma común de escribirlo (ejemplo, solo la estructura central).
Nodo maestro (MASTER):
# /etc/keepalived/keepalived.conf(示例)
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 110
advert_int 1
authentication {
auth_type PASS
auth_pass CHANGE_ME
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_haproxy
}
}
En el nodo de respaldo (BACKUP), cambia state a BACKUP, baja priority (por ejemplo, 100) y mantén lo demás igual.
Debes verificar dos cosas:
- Si
haproxyrealmente se cae, ¿el VIP flota a la otra máquina? - En escenarios de partición de red/split-brain, ¿el VIP "salta de un lado a otro"?
En escenarios de VPS autogestionados, el fencing a menudo no puede ser 100% perfecto, pero al menos debes:
- Vincular el "flotado de la entrada" a las comprobaciones de estado
- Aclarar quién tiene derecho a ser MASTER en caso de falla
- Incluir los simulacros en el proceso (no depender de la memoria)
La base de datos suele ser la parte más difícil de HA y la más propensa a fallar.
Doy un principio práctico:
- Primero hacerla recuperable (respaldo + simulacros)
- Luego hacer primaria-réplica/separación de lectura y escritura
- Solo al final considerar multimáster/distribuida (a menos que realmente lo necesites)
- Primaria única (Primary)
- Una réplica de solo lectura (Replica)
- Respaldo automático + simulacros de recuperación periódicos
- Monitorear métricas básicas como "retraso de replicación/disco/conexiones/consultas lentas"
Debes preguntarte dos cosas:
- ¿Qué tan grande es realmente tu volumen de escritura?
- ¿Puedes aceptar "solo lectura/solo escritura por un tiempo corto" como estrategia de degradación?
Muchos negocios pueden perfectamente:
- Pasar a solo lectura primero en caso de falla
- Restaurar el servicio primero
- Luego arreglar la consistencia poco a poco
Es más realista que perseguir "nunca caerse".
No esperes a discutirlo sobre la marcha cuando ocurra la falla.
Sugiero escribir el Runbook más corto que sea usable (aunque sean 5 líneas):
- Quién es el responsable cuando ocurre una falla (un nombre/un grupo)
- Cómo determinar si la Primary realmente se cayó (no mires solo el ping)
- Cuándo activar la conmutación (qué condiciones deben cumplirse)
- La estrategia de reversión tras la conmutación (qué hacer si la nueva Primary tiene problemas)
- Cómo rellenar datos/arreglar la consistencia después del incidente
Una vez escrito este Runbook, tu "alta disponibilidad" ya es mejor que la de la mayoría de los equipos.
La alta disponibilidad no se escribe en documentos, se practica.
Sugiero hacer al menos estos 6 simulacros (en orden):
- Matar el proceso de la aplicación: ¿el LB puede desviar el tráfico?
- Desconectar de la red el nodo de aplicación: ¿la comprobación de estado puede detectarlo?
- Caída de la base de datos: ¿el servicio puede degradarse (devolver errores claros/solo lectura)?
- Disco lleno: ¿el monitoreo puede alertar con antelación?
- Certificado vencido: ¿puede alertar 7 días antes?
- "Operación errónea": ¿se puede restaurar desde el respaldo una tabla/archivo borrado?
| Escenario | Método de activación | Comportamiento esperado | Comportamiento real | RTO | Retrospectiva/mejora |
|---|---|---|---|---|---|
| App A se cae | kill / stop service | Conmutación automática | |||
| LB se cae | stop keepalived | El VIP flota | |||
| DB se cae | stop db | Degradación/solo lectura |
Si quieres verificar a nivel de red (pérdida de paquetes/jitter/desvíos), puedes ejecutar un proceso completo con mtr para dejarlo claro (y también es más fácil convencerte a ti mismo/a tus colegas cuando algo falla):
Termino con un consejo poco "de arquitecto":
- Primero lleva L0 a "recuperable, alertable, diagnosticable"
- Luego haz la falta de estado
- Después dos nodos + LB
- Solo al final haz la entrada/base de datos de alta disponibilidad
Con cada paso que des, debes poder responder una pregunta:
Después de este paso, ¿cuánto menos entraré en pánico durante una caída?
Si puedes responderla, estás en el camino correcto.