Arquitectura HA Base de Datos Activo-Activo vs Pasivo

La disponibilidad del servicio no es una opción, es un requisito contractual definido en los SLA (Service Level Agreements). En sistemas de misión crítica, un tiempo de inactividad no planificado puede costar miles de dólares por minuto y dañar irreparablemente la reputación técnica. La implementación de High Availability (HA) en la capa de persistencia es el desafío más complejo, ya que, a diferencia de los servidores de aplicaciones stateless, las bases de datos poseen estado. Este análisis desglosa las arquitecturas Activo-Pasivo y Activo-Activo desde una perspectiva de ingeniería, evaluando trade-offs de consistencia, latencia y complejidad operativa.

1. Activo-Pasivo: El Estándar de Estabilidad

La arquitectura Activo-Pasivo (o Primario-Secundario) es el patrón predominante debido a su simplicidad en la gestión de la consistencia de datos. En este modelo, todo el tráfico de escritura (INSERT, UPDATE, DELETE) se dirige exclusivamente al nodo Activo. Los cambios se replican al nodo Pasivo, que permanece en espera (standby) o sirve tráfico de solo lectura.

Arquitectura Interna: El nodo Pasivo replica los datos mediante binary logs (MySQL) o WAL logs (PostgreSQL). La replicación puede ser asíncrona (mayor rendimiento, riesgo de pérdida de datos) o semi-síncrona (garantiza que al menos un esclavo recibió el dato).

El desafío crítico aquí es el Failover (conmutación por error). Cuando el nodo primario falla, un mecanismo de orquestación (como Pacemaker, Corosync o herramientas específicas como MHA/Orchestrator) debe detectar la falla, promover al nodo pasivo y redirigir el tráfico. Este proceso no es instantáneo; existe un RTO (Recovery Time Objective) que puede variar de segundos a minutos.

Configuración de Failover con HAProxy

Para minimizar el impacto en la aplicación, se suele utilizar una IP Virtual (VIP) o un balanceador de carga como HAProxy que detecta la salud de los nodos.


# Configuración de ejemplo para HAProxy (haproxy.cfg)
listen mysql-cluster
bind 0.0.0.0:3306
mode tcp
option mysql-check user haproxy_check
balance roundrobin
# El nodo primario recibe escrituras
server db-master 192.168.1.10:3306 check weight 1
# El nodo backup entra solo si el master cae
server db-backup 192.168.1.11:3306 check weight 1 backup
Riesgo de Split-Brain: Si la red entre los nodos falla pero ambos siguen activos, ambos podrían intentar asumir el rol de maestro. Esto corrompe los datos. Es obligatorio implementar mecanismos de STONITH (Shoot The Other Node In The Head) para aislar el nodo fallido.

2. Activo-Activo: Escalabilidad y Complejidad

En una configuración Activo-Activo (Multi-Master), múltiples nodos pueden aceptar operaciones de escritura simultáneamente. Los datos modificados en un nodo se propagan a los demás nodos del clúster. Esto teóricamente permite escalar las escrituras horizontalmente y eliminar el tiempo de inactividad por failover, ya que si un nodo cae, los otros siguen operando.

Sin embargo, la realidad ingenieril es mucho más compleja. El principal problema es el Conflicto de Escritura. Si dos transacciones modifican el mismo registro en nodos diferentes al mismo tiempo, el sistema debe decidir qué versión prevalece. Esto obliga a relajar la consistencia (Eventual Consistency) o a incurrir en latencias altas debido al bloqueo distribuido.

Manejo de IDs Autoincrementales

Un error común en migraciones a Activo-Activo es la colisión de claves primarias. Si ambos nodos generan ID=100, la replicación fallará. La solución estándar es configurar un offset.


-- Configuración en Nodo A (my.cnf)
auto_increment_increment = 2
auto_increment_offset = 1 -- Genera 1, 3, 5, ...

-- Configuración en Nodo B (my.cnf)
auto_increment_increment = 2
auto_increment_offset = 2 -- Genera 2, 4, 6, ...

Esta configuración previene colisiones de ID, pero no resuelve conflictos lógicos de negocio (ej. saldo de cuenta negativo). Para resolver conflictos complejos, se requieren estrategias de "Last Write Wins" o lógica específica en la capa de aplicación, lo cual aumenta la deuda técnica.

Impacto en Latencia: En clústeres síncronos (como Galera Cluster), una escritura debe ser confirmada por todos los nodos para garantizar consistencia. Esto significa que la latencia de escritura será igual a la del nodo más lento de la red. No se recomienda para redes geográficamente dispersas (WAN).

3. Análisis Comparativo y Decisión Arquitectónica

Elegir entre estas dos estrategias depende estrictamente de los requisitos de RPO (Recovery Point Objective) y RTO, así como del presupuesto de ingeniería disponible para mantener la complejidad.

Característica Activo-Pasivo Activo-Activo
Complejidad Baja / Media Muy Alta
Consistencia de Datos Fuerte (Strong) Eventual (generalmente)
Utilización de Recursos 50% (Nodo pasivo ocioso) 100% (Todos los nodos trabajan)
Escalabilidad de Escritura Vertical (limitada al Master) Horizontal (teórica)
Latencia Baja (Escritura local) Variable (Depende de replicación)
Punto de Fallo Tiempo de Failover (segundos) Resolución de Conflictos

Veredicto Técnico

Para el 90% de las aplicaciones empresariales, Activo-Pasivo es la elección correcta. Ofrece consistencia de datos garantizada y un modelo mental simple para los desarrolladores. La supuesta "desventaja" de tener hardware ocioso se compensa con la tranquilidad operativa y la facilidad de recuperación ante desastres.

La arquitectura Activo-Activo debe reservarse para casos de uso específicos donde la disponibilidad de escritura global es crítica (ej. carritos de compra distribuidos globalmente) y la aplicación está diseñada para tolerar conflictos de datos eventuales.

Recomendación Final

No intente resolver problemas de rendimiento de lectura con Activo-Activo; utilice réplicas de lectura (Read Replicas) en un esquema Activo-Pasivo. No intente resolver problemas de rendimiento de escritura con Activo-Activo a menos que haya agotado el escalado vertical y el Sharding. La complejidad operativa de un clúster multi-master suele superar sus beneficios teóricos en la mayoría de los escenarios.

Post a Comment